Docker 入門
Dockerのユースケース、機能、使用方法をまとめました。
Docker 概要
-
Docker 向き・不向き
- 向き : 日々変化するようなシステム
- 不向き : 絶対に停止しては困るようなミッションクリティカルなシステムなど。構成を少しでも変更すると、業務に大きな影響がでることが考えられるようなもの
-
コンテナ管理ソフトウェア
- Podman
- Docker
- LXC(Linuxコンテナ)
- LXD
- Virtuozzo
- OpenVZ
-
プラットフォーム 比較
- 物理基盤
- ハードウェア性能の教授
- トランザクション処理向き
- 障害発生時の問題切り分けが比較的簡素
- 高可用性、無停止システムで採用
- 仮想化技術
- ハイパーバイザーが介在
- 仮想的なハードウェアが存在
- オーバーヘッドが存在
- 仮想マシンはファイルで管理
- ゲストOSの起動、停止等の管理が必要
- サーバー集約
- リソースプール化に有用
- コンテナ
- ランタイムをパッケージ管理化したアプリ
- オーバーヘッドがほぼゼロ
- 隔離空間でアプリを実行
- ホストOSからプロセスとして見える
- 非常に軽量なアプリ環境を実現
- ソフトウェア開発の工数削減
- 圧倒的な集約度
- 物理基盤
-
使用技術
- 名前空間
- 単一のOS環境で複数の分離された空間を実現するために使用
- 種類
- ipc名前空間 : プロセス間通信の分離
- mnt名前空間 : ファイルシステムのマウント情報の分離
- net名前空間 : ネットワークインターフェイスを分離
- pid名前空間 : プロセスの分離
- user名前空間: ユーザーIDとグループIDを分離
- uts名前空間 : UTS(Unix Time-Sharing System)名前空間。ホスト名やNISドメイン名などの分離
- cgroups(Control Groups)
- 1つのホスト上で複数の分離空間として稼働するDockerコンテナが稼働する環境において、限られたハードウェア資源の利用制限は重要
- CPU、メモリ、ブロックI/O等の制御
- cgroupsのファイルシステムで管理される主な統計情報
- blkio
- cpuacct
- cpuset
- devices
- freezer
- hugetlb
- memory
- perf_event
- 名前空間
-
ストレージドライバー
- コンテナ・イメージ間の生成処理の際に使用
- 種類
- overlay2, overlay
- すべてのLinuxディストリビューションで推奨(overlayは古く非推奨)
- ファイルシステム: xfs, ext4
- aufs
- Linuxカーネル3.13のUbuntuが稼働するDocker CEのバージョン18.06およびそれ以前のバージョンで推奨
- ファイルシステム: xfs,ext4
- devicemapper
- シンプロビジョニング、スナップショット機能を使って管理
- ブロックレベルでアクセス
- ファイルシステム: direct-lvm
- btrfs
- Dockerエンジンが稼働するホストOS上にbtrfsファイルシステムが利用できる場合
- ファイルシステム: btrfs
- zfs
- Dockerエンジンが稼働するホストOS上にzfsファイルシステムが利用できる場合
- ファイルシステム: zfs
- vfs
- ファイルシステムの種類によらず利用できて安定した動作だが、性能が良くないため、テスト用途で使用
- ファイルシステム: 任意
- overlay2, overlay
-
サーバーOS・コンテナ専用OS
- サーバーOS
- Docker以外の非コンテナ環境のサーバーoS環境と同様のOS管理が行える
- 新しい管理手法を習得する工数を削減できる
- コンテナ専用OS
- コンテナ専用OS自体の作法を学ぶ必要性
- yumのようなパッケージ管理が利用できない場合があり、rpm-ostreeのようなOS環境全体の更新やローづバックなどの新しい仕組みを理解する必要がある。
- 例
- Atomic Host
- CoreOS
- Snappy Ubuntu Core
- RancherOS
- サーバーOS
-
ホストOSのディレクトリをDockerコンテナへマウント
- bind mount : ホスト上のデバイスファイルやディレクトリ
- volume : ホスト上のボリューム
- tmpfs : ホストのメモリ
(参考) Docker実践ガイド 第2版
Dockerfile
以下の命令から構成されたイメージの元になるファイル。プロジェクトのルートに作製するが、別ディレクトリで別のファイル名としても作成でき、その場合はイメージのビルド時に-f
オプションでファイル名を指定する。
- 命令
- FROM
- MAINTAINER
- RUN
- CMD
- LABEL
- EXPOSE
- ENV
- ADD
- COPY
- ENTRYPOINT
- VOLUME
- USER
- WORKDIR
- ARG
- ONBUILD
- STOPSIGNAL
- HEALTHCHECK
- SHELL
命令
RUN
可能であれば不要なレイヤーを使わないように以下のように1つのRUNにすることを推奨(その他の命令も同様)
RUN apt-get update && apt-get install -y \
aufs-tools \
automake \
build-essential \
curl \
dpkg-sig \
libcap-dev \
libsqlite3-dev \
lxc=1.0* \
mercurial \
reprepro \
ruby1.9.1 \
ruby1.9.1-dev \
s3cmd=1.1.* \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
LABEL
イメージにラベルを設定
LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"
ENV
環境変数の設定
ENV myName="John Doe" myDog=Rex\ The\ Dog \
myCat=fluffy
EXPOSE
コンテナ実行時にポートをリッスンすることを指定。-p フラグを使ってポートの公開範囲を指定するか、 -P フラグで全ての露出ポートでホストからコンテナにアクセス可能になる。
ADDとCOPYの違いは、ADD命令は、圧縮ファイルの回答、展開が行われ、圧縮元のファイル自体はコピーされない。COPY命令は、元のファイルの状態でコピーされる。ADD命令はURLを指定することで、リモートサイトのファイルをダウンロードし、コピーもできる。 ADDの機能が必要ない場合はCOPYを使うことが推奨。
Dockerfile には少なくとも1つのCMDまたはENTRYPOINT命令を含むべき。
ENTRYPOINTもCMDもどちらもコマンドを実行できるが、CMD命令で指定した内容はdocker container run
コマンド実行時にオプションで上書き可能。そのため、オプションで上書きすることがないベースのコマンドを記載しておき、上書きするようなオプション等をCMD命令に分けるなどの使い分けができる。
ARG 環境変数名[=default value]
docker image build
時に--build-arg envname=envvalue
のようにすることで動的な値をイメージに含めなくても良い
ONBUILD
ベースのイメージを作製して、派生版のイメージ作製するといった運用のときに使用。 ベースのDockerfileにおいて、派生版で実行させたいコマンドのベースをONBUILD命令に記述しておくことで、ベースのイメージをビルド時にはONBUILD命令の行を除いた内容でベースのDockerイメージが作製され、派生版のDockerイメージは、派生版のDockerfileのコマンドと、ベースのDockerfile内のONBUILD命令に指定したコマンドをあわせたもので構成される。派生版のDockerfileではFROMでベースのイメージ名を指定する。
STOPSIGNAL
コンテナを終了する時に送信するための、システムコール・シグナルを設定
HEALTHCHECK
オプション、および、命令を続けることで死活監視を行うことができる。docker container ls
コマンドのSTATUS列にhealthyのように確認できる。
Dockerfileに記述しなくてもdocker container run
コマンドのオプションで指定可能
-
形式
HEALTHCHECK [option] CMD command
コマンド- コンテナ内でコマンドを実行して、コンテナの正常性を確認
HEALTHCHECK NONE
-
オプションの種類
--interval=
--timeout=
--retries=
例
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
SHELL
SHELL命令以降は、指定したシェルで実行。 Windowsで便利。ネイティブなシェルcmdとpowershellだけでなく、shも指定可能。
USER
利用するには Dockerfile でユーザとグループを RUN groupadd -r postgres && useradd -r -g postgres postgres
のように作成
WORKDIR
移動にはRUN命令でcdコマンドを実行せずにWORKDIR命令を使用する 読みやすさ、トラブルシュートのしやすさ、維持のしやすさが増す。
Others
-
Dockerコンテナをすぐに終了させない方法として、
tail -f /dev/null
やプロセスをフォアグラウンドで実行(ENTRYPOINT ["usr/sbin/httpd", "-DFOREGROUND"]
)する方法などがある -
環境変数対応
- 以下のデフォルト値設定も可能
${val:-char}
${val:+char}
- 以下のデフォルト値設定も可能
-
パーサ・ディレクティブ
- 全てのパーサ・ディレクティブは Dockerfile の限りなく上に書くべき
- Dockerfile 中では、次に続く行にも影響を与える
- 種類
- escape : Windowsのディレクトリを扱うとき、
COPY testfile.txt c:\\
のようにすると、2つめのバックスラッシュが新しい行のためのエスケープとして扱われるため、エスケープ文字をバッククォートに設定するような使い方をする# escape=\
(default)# escape=``
`` `
- escape : Windowsのディレクトリを扱うとき、
References
Dockerfileの仕様は以下を参照
Dockerfileの書き方の例は以下を参照
Docker Networking
デフォルトで持つネットワークは、ホストOS上でdocker0というブリッジインターフェイス、docker network ls
コマンドで確認すると、bridgeというネットワークが作製されている。
docker network create
コマンドでサブネットのCIDRを指定して固定IPアドレスで起動することもできる。
docker container run
コマンド指定時に--networkオプションで指定したネットワークを指定し、--ipコマンドでIPアドレスを指定。
コンテナ間通信として、docker container run
コマンド実行時に--link image:tag
のようにlink機能。ただし、Docker社によると将来削除の可能性がある。
-
マルチホスト上でのコンテナ間通信
- weave
- etcd+flannel
- Docker Swarm
-
ネットワーキングの実現方法
- オーバーレイネットワーク(VXLAN) : Docker Swarmで利用
- MACVLAN
- DockerホストのNICに複数のMACアドレスとIPアドレスを割り当てることでVLANを形成
- ホストOSと同じIP空間にコンテナを所属させたい場合に有用
-
Docker Swarm
- Dockerエンジン搭載のクラスタリング機能
docker network
コマンドを併用- マネージャノードとワーカーノードで構成
- HAのため、マネージャノードを奇数台の複数台で構成することも可能
- アプリケーションの実行単位をサービスとして管理(
docker service
コマンドで操作可能) - コンテナの配備はマネージャノードで行う
docker stack
という複数のサービスをグループ化する機能
-
Docker Compose
- Dockerコンテナを一括で構築、連携、管理することで管理負荷を低減
-
Docker Machine
- パブリッククラウドのインスタンス上や仮想環境における仮想マシン上のDockerホストを管理するソフトウェア
-
Docker Private Repository(DPR)
- 組織内に閉じたDockerレジストリ
-
マイグレーション
- CRIUというチェックポイントを作成し、そのチェックポイントを指定してコンテナを開始させる
-
リソース管理
- CPU
--cpuset-cpus=0
のようにホストOS側のCPUコア番号を指定--cpu-shares=1024
のようにCPU割当時間--cpus
オプションでCPUリソースの上限の割合
- メモリ
-m 512m
オプションのように制限
- ディスクI/O帯域幅
--device-write-bps=/dev/sdb:1mb
のようにホストOSのデバイス名に対して書き込みに対するディスクI/Oの帯域幅を制限
- CPU
Get Started
Dockerコンテナ
Dockerでコンテナを動作させてみる。
test.shという名前で以下のファイルを作成。
#!/bin/sh
date >> /var/log/test.log
df -HT >> /var/log/test.log
tail -f /dev/null
Dockerfile
FROM centos:8.1.1911
ADD test.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/test.sh
ENTRYPOINT ["/usr/local/bin/test.sh"]
$ docker image build -t centos:v1 .
Sending build context to Docker daemon 15.87kB
Step 1/4 : FROM centos:8.1.1911
8.1.1911: Pulling from library/centos
8a29a15cefae: Pull complete
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:8.1.1911
---> 470671670cac
Step 2/4 : ADD test.sh /usr/local/bin/
---> 6e60cdad9a7f
Step 3/4 : RUN chmod +x /usr/local/bin/test.sh
---> Running in 60d9952b70b9
Removing intermediate container 60d9952b70b9
---> 1e2c412a7aeb
Step 4/4 : ENTRYPOINT ["/usr/local/bin/test.sh"]
---> Running in 018eeab58ee7
Removing intermediate container 018eeab58ee7
---> 7b2c60eb2910
Successfully built 7b2c60eb2910
Successfully tagged centos:v1
作製したイメージを確認
$ docker image ls centos:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
centos v1 7b2c60eb2910 7 minutes ago 237MB
作製したイメージからコンテナを稼働
$ docker container run -d --name v1n -h v1h centos:v1
28c2a84d709024837c6077f5c6da3fb36695ca8e5da7b61470e32ac9dfd6e5dc
作製したコンテナを確認
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28c2a84d7090 centos:v1 "/usr/local/bin/test…" 6 seconds ago Up 6 seconds v1n
86a3ead28df3 fab2dded59dd "kube-scheduler --bi…" 3 days ago Up 3 days k8s_kube-scheduler_kube-scheduler-docker-desktop_kube-system_131c3f63daec7c0750818f64a2f75d20_0
e0340e29888a 1399a72fa1a9 "kube-controller-man…" 3 days ago Up 3 days :
コンテナ内で稼働するOSのシェルにアクセス。
$ docker container exec -it v1n /bin/bash
[root@v1h /]# pgrep -a test.sh
1 /bin/sh /usr/local/bin/test.sh
[root@v1h /]# cat /var/log/test.log
Sat May 16 15:27:39 UTC 2020
Filesystem Type Size Used Avail Use% Mounted on
overlay overlay 63G 5.6G 54G 10% /
tmpfs tmpfs 68M 0 68M 0% /dev
tmpfs tmpfs 1.1G 0 1.1G 0% /sys/fs/cgroup
shm tmpfs 68M 0 68M 0% /dev/shm
/dev/sda1 ext4 63G 5.6G 54G 10% /etc/hosts
tmpfs tmpfs 1.1G 0 1.1G 0% /proc/acpi
tmpfs tmpfs 1.1G 0 1.1G 0% /sys/firmware
コンテナのIPアドレスも確認可能
$ docker inspect --format="{{ .NetworkSettings.IPAddress }}" v1n
172.17.0.2
Docker Compose
$ cd /tmp/wordpress && cd $_
version: '3.7'
services:
wordpress:
image: wordpress:latest
ports:
- "8000:80"
restart: always
links:
- db:mysql
networks:
mynet:
volumes:
- wp-vol:/var/www/html
depends_on:
- db
db:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: password123
networks:
mynet:
ipv4_address: 172.20.0.2
volumes:
- mysql-vol:/var/lib/mysql
volumes:
wp-vol:
driver_opts:
type: none
device: /Users/hayashier/data/html
o: bind
mysql-vol:
driver_opts:
type: none
device: /Users/hayashier/data/mysql
o: bind
networks:
mynet:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.20.0.0/24
ホストOS用のディレクトリ作製
$ mkdir -p ~/data/mysql
$ mkdir -p ~/data/html
Docker Composeのバージョン確認
$ docker-compose version
docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.1d 10 Sep 2019
Docker Composeによりコンテナを起動
$ docker-compose up
ブラウザからhttp://localhost:8000
でアクセスできるようになります。
開いた画面でWordpressの設定を行う。
- Database Name: mysql
- Usename: root
- Password: password123
- Database Host: 172.20.0.2
- Table Prefix: wp_
WordPressのアカウント情報の設定を行う。
- Site Title: Sample Blog
- Usename: hayashier
- Password: Test1234
- Confirm Password: Confirm use of weak passwordにチェック
- Your Email: sample@hayashier.com
- Search Engine Visibility: Discourage search engines from indexing this siteにチェック
Docker Composeにより起動したコンテナを片付ける。
$ docker-compose down
$ rm -Rf ~/data/
Checking
イメージ一覧確認で、wordpressとmariadbのイメージが作製されていることを確認
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos v1 7b2c60eb2910 11 hours ago 237MB
mariadb latest 9c1f27148b1f 16 hours ago 357MB
wordpress latest 675af3ca3193 33 hours ago 540MB
:
Docker Composeによるプロセス一覧
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------
wordpress_db_1 docker-entrypoint.sh mysqld Up 3306/tcp
wordpress_wordpress_1 docker-entrypoint.sh apach ... Up 80/tcp
WordPressのコンテナに割り当てられたIPアドレスを確認
$ docker container inspect --format '{{.NetworkSettings.Networks}}' wordpress_wordpress_1
map[wordpress_mynet:0xc0004dc000]
$ docker container inspect --format '{{.NetworkSettings.Networks.wordpress_mynet.IPAddress}}' wordpress_wordpress_1
172.20.0.3
MariaDBのコンテナに割り当てられたIPアドレスを確認。また、データベース一覧を確認
$ docker container inspect --format '{{.NetworkSettings.Networks.wordpress_mynet.IPAddress}}' wordpress_db_1
172.20.0.2
$ docker container exec -it wordpress_db_1 /bin/bash -c "mysql -uroot -ppassword123 -e 'show databases;'"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
Ctrl-CでDocker Composeから抜けるとコンテナも終了。-d
でデーモンとして起動している場合は以下のように停止したりコンテナを削除することができる。
$ docker-compose stop wordpress db
$ docker-compose rm -f wordpress db
Commands
Dockerのシステム情報の表示。
$ docker system info
Client:
Debug Mode: false
Server:
Containers: 11
Running: 9
Paused: 0
Stopped: 2
Images: 137
Server Version: 19.03.8
Storage Driver: overlay2
Backing Filesystem: <unknown>
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 4.19.76-linuxkit
Operating System: Docker Desktop
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.943GiB
Name: docker-desktop
ID: SNLI:62ZX:VQK6:SZVX:O2LS:4IW2:WC37:ZEDK:FZAH:X4T2:34XO:HJFI
Docker Root Dir: /var/lib/docker
Debug Mode: true
File Descriptors: 97
Goroutines: 105
System Time: 2020-05-17T02:40:56.2843101Z
EventsListeners: 4
HTTP Proxy: gateway.docker.internal:3128
HTTPS Proxy: gateway.docker.internal:3129
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
Dockerのバージョン表示
$ docker version
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:21:11 2020
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.8
API version: 1.40 (minimum version 1.12)
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:29:16 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
Kubernetes:
Version: v1.15.11-eks-af3caf
StackAPI: Unknown
統計情報表示
$ docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
86a3ead28df3 k8s_kube-scheduler_kube-scheduler-docker-desktop_kube-system_131c3f63daec7c0750818f64a2f75d20_0 5.40% 11.31MiB / 1.943GiB 0.57% 0B / 0B 0B / 0B 12
e0340e29888a k8s_kube-controller-manager_kube-controller-manager-docker-desktop_kube-system_b2850863d2a1ddaac8ed962e6881584c_0 0.41% 13.07MiB / 1.943GiB 0.66% 0B / 0B 0B / 0B 9
0c8c59efe24e k8s_POD_kube-scheduler-docker-desktop_kube-system_131c3f63daec7c0750818f64a2f75d20_0 0.00% 296KiB / 1.943GiB 0.01% 0B / 0B 0B / 0B 1
1329d8aea1ec k8s_POD_kube-controller-manager-docker-desktop_kube-system_b2850863d2a1ddaac8ed962e6881584c_0 0.00% 276KiB / 1.943GiB 0.01% 0B / 0B 0B / 0B 1
bc54cb40b9c6 k8s_POD_kube-apiserver-docker-desktop_kube-system_556b996466155d7ad37d896897208f67_0 0.00% 340KiB / 1.943GiB 0.02% 0B / 0B 0B / 0B 1
48f8d8ace1a4 k8s_POD_etcd-docker-desktop_kube-system_f132e1c85abd4953a304d1c65d9d74f9_0 0.00% 248KiB / 1.943GiB 0.01% 0B / 0B 0B / 0B 1
:
コンテナ一覧
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
86a3ead28df3 fab2dded59dd "kube-scheduler --bi…" 3 days ago Up 3 days k8s_kube-scheduler_kube-scheduler-docker-desktop_kube-system_131c3f63daec7c0750818f64a2f75d20_0
e0340e29888a 1399a72fa1a9 "kube-controller-man…" 3 days ago Up 3 days k8s_kube-controller-manager_kube-controller-manager-docker-desktop_kube-system_b2850863d2a1ddaac8ed962e6881584c_0
0c8c59efe24e k8s.gcr.io/pause:3.1 "/pause" 3 days ago Up 3 days k8s_POD_kube-scheduler-docker-desktop_kube-system_131c3f63daec7c0750818f64a2f75d20_0
1329d8aea1ec k8s.gcr.io/pause:3.1 "/pause" 3 days ago Up 3 days k8s_POD_kube-controller-manager-docker-desktop_kube-system_b2850863d2a1ddaac8ed962e6881584c_0
bc54cb40b9c6 k8s.gcr.io/pause:3.1 "/pause" 3 days ago Up 3 days k8s_POD_kube-apiserver-docker-desktop_kube-system_556b996466155d7ad37d896897208f67_0
48f8d8ace1a4 k8s.gcr.io/pause:3.1 "/pause" 3 days ago Up 3 days k8s_POD_etcd-docker-desktop_kube-system_f132e1c85abd4953a304d1c65d9d74f9_0
コンテナの標準出力および標準エラーのストリームを表示。
$ docker container logs e0340e29888a
I0513 00:51:18.641504 1 serving.go:319] Generated self-signed cert in-memory
I0513 00:51:19.599737 1 controllermanager.go:164] Version: v1.15.5
I0513 00:51:19.602481 1 secure_serving.go:116] Serving securely on 127.0.0.1:10257
I0513 00:51:19.604127 1 deprecated_insecure_serving.go:53] Serving insecurely on [::]:10252
:
イメージのファイルへの書き出しと読み込み
$ docker image save centos:6.9 > centos-6.9.tar
$ docker image load -i centos-6.9-tar
コンテナのエクスポート、インポート
$ docker container export db01 > db01.tar
$ cat db01.tar | docker image import - postgres:11
docker image save, docker image loadとの違いは、docker container export,docker image importを使ったバックアップ、リストアでは、データボリュームとして定義されたディレクトリが除外される。
コンテナの詳細表示
$ docker container inspect 86a3ead28df3
[
{
"Id": "86a3ead28df3a98ee1b4abab5097b6690301d855f1712a2de43359f657ca569d",
"Created": "2020-05-13T00:51:15.8050084Z",
"Path": "kube-scheduler",
"Args": [
"--bind-address=127.0.0.1",
"--kubeconfig=/etc/kubernetes/scheduler.conf",
"--leader-elect=true"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2641,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-05-13T00:51:16.2635987Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:fab2dded59dd0c2894dd9dbae71418f565be5bd0d8fd82365c16aec41c7e367f",
"ResolvConfPath": "/var/lib/docker/containers/0c8c59efe24e9e92ed3a7bbefe7ee04165fdaeb079e0b1ca5878df1fb350b35d/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/0c8c59efe24e9e92ed3a7bbefe7ee04165fdaeb079e0b1ca5878df1fb350b35d/hostname",
"HostsPath": "/var/lib/kubelet/pods/131c3f63daec7c0750818f64a2f75d20/etc-hosts",
"LogPath": "/var/lib/docker/containers/86a3ead28df3a98ee1b4abab5097b6690301d855f1712a2de43359f657ca569d/86a3ead28df3a98ee1b4abab5097b6690301d855f1712a2de43359f657ca569d-json.log",
"Name": "/k8s_kube-scheduler_kube-scheduler-docker-desktop_kube-system_131c3f63daec7c0750818f64a2f75d20_0",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
:
-f '{{.NetworkSettings.IPAddress}}'
のようにして取得項目をフィルタリングする。
環境変数の確認
$ docker container inspect 86a3ead28df3 -f '{{range .Config.Env}}{{println .}}{{end}}'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ docker container top d8b92b7a4ed0
PID USER TIME COMMAND
5791 root 0:00 /bin/bash
5884 xfs 0:00 apache2 -DFOREGROUND
98808 root 0:00 apache2 -DFOREGROUND
99349 xfs 0:00 apache2 -DFOREGROUND
99350 xfs 0:00 apache2 -DFOREGROUND
99351 xfs 0:00 apache2 -DFOREGROUND
99352 xfs 0:00 apache2 -DFOREGROUND
99353 xfs 0:00 apache2 -DFOREGROUND
$ docker container stats d8b92b7a4ed0 --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
d8b92b7a4ed0 wordpress_wordpress_1 0.00% 32.65MiB / 1.943GiB 1.64% 48kB / 7.14kB 0B / 0B 8
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
3a39d2a3be36 bridge bridge local
9484ac6c6e9a host host local
fb2546fc2ba3 none null local
70c2109bcc5f wordpress_mynet bridge local
$ docker network inspect wordpress_mynet
[
{
"Name": "wordpress_mynet",
"Id": "70c2109bcc5f46fb84f15f09ddb119bfd16ffa9c8b476e47c42490cfb8a1e44b",
"Created": "2020-05-17T02:15:28.2651735Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.20.0.0/24"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"d8b92b7a4ed02406639d1efb6d0f0570c75488414c0ad5fb12c9cd22a23bc55e": {
"Name": "wordpress_wordpress_1",
"EndpointID": "f775ed139052829e1b887e412060e157891a55ac701df6114567af16f0a144ec",
"MacAddress": "02:42:ac:14:00:03",
"IPv4Address": "172.20.0.3/24",
"IPv6Address": ""
},
"d9c8cdbccda5cb058f27a9aa3441205d6c70aad73378410c37c677a8b7bac78a": {
"Name": "wordpress_db_1",
"EndpointID": "35f723d0cc55fb84032cf165ba0778fa2272edd4e9260a5a967839ac7cff8e4f",
"MacAddress": "02:42:ac:14:00:02",
"IPv4Address": "172.20.0.2/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "mynet",
"com.docker.compose.project": "wordpress",
"com.docker.compose.version": "1.25.4"
}
}
]
システムのベインと表示
$ docker system events
2020-05-17T11:42:11.501614000+09:00 container create 0db69262af595cb5e87d20fb7e93ca5bb63086fed53b02cf3231e41596550465 (annotation.io.kubernetes.container.hash=625b6933, annotation.io.kubernetes.container.restartCount=1, annotation.io.kubernetes.container.terminationMessagePath=/dev/termination-log, annotation.io.kubernetes.container.terminationMessagePolicy=File, annotation.io.kubernetes.pod.terminationGracePeriod=30, image=sha256:2c4adeb21b4ff8ed3309d0e42b6b4ae39872399f7b37e0856e673b13c4aba13d, io.kubernetes.container.logpath=/var/log/pods/kube-system_etcd-docker-desktop_f132e1c85abd4953a304d1c65d9d74f9/etcd/1.log, io.kubernetes.container.name=etcd, io.kubernetes.docker.type=container, io.kubernetes.pod.name=etcd-docker-desktop, io.kubernetes.pod.namespace=kube-system, io.kubernetes.pod.uid=f132e1c85abd4953a304d1c65d9d74f9, io.kubernetes.sandbox.id=48f8d8ace1a4a69292e887dcf6ff2308cd89e18713ae2432a8708c71514a9d86, name=k8s_etcd_etcd-docker-desktop_kube-system_f132e1c85abd4953a304d1c65d9d74f9_1)
2020-05-17T11:42:11.763692700+09:00 container start 0db69262af595cb5e87d20fb7e93ca5bb63086fed53b02cf3231e41596550465 (annotation.io.kubernetes.container.hash=625b6933, annotation.io.kubernetes.container.restartCount=1, annotation.io.kubernetes.container.terminationMessagePath=/dev/termination-log, annotation.io.kubernetes.container.terminationMessagePolicy=File, annotation.io.kubernetes.pod.terminationGracePeriod=30, image=sha256:2c4adeb21b4ff8ed3309d0e42b6b4ae39872399f7b37e0856e673b13c4aba13d, io.kubernetes.container.logpath=/var/log/pods/kube-system_etcd-docker-desktop_f132e1c85abd4953a304d1c65d9d74f9/etcd/1.log, io.kubernetes.container.name=etcd, io.kubernetes.docker.type=container, io.kubernetes.pod.name=etcd-docker-desktop, io.kubernetes.pod.namespace=kube-system, io.kubernetes.pod.uid=f132e1c85abd4953a304d1c65d9d74f9, io.kubernetes.sandbox.id=48f8d8ace1a4a69292e887dcf6ff2308cd89e18713ae2432a8708c71514a9d86, name=k8s_etcd_etcd-docker-desktop_kube-system_f132e1c85abd4953a304d1c65d9d74f9_1)
:
イメージ情報のキーと署名に関する情報確認
$ docker trust inspect wordpress:latest
[
{
"Name": "wordpress:latest",
"SignedTags": [
{
"SignedTag": "latest",
"Digest": "1c4b01a38f37fee0e3aee5266bef13cbb3bb2ff705803377a35687fc441f6da8",
"Signers": [
"Repo Admin"
]
}
],
"Signers": [],
"AdministrativeKeys": [
{
"Name": "Root",
"Keys": [
{
"ID": "09ece9bf02bfbef9b047a8c0e65ddc3a816f062b208fe1e224a383864c3d5c1d"
}
]
},
{
"Name": "Repository",
"Keys": [
{
"ID": "36aa4a54e8bb66ed3772f1fac2e886291cd90e3039ee0d64c00f95de5d6590e1"
}
]
}
]
}
]
ボリューム一覧
$ docker volume ls
DRIVER VOLUME NAME
local test2_mysql-vol
local test2_wp-vol
local wordpress_mysql-vol
local wordpress_wp-vol
$ docker volume inspect wordpress_wp-vol
[
{
"CreatedAt": "2020-05-17T02:16:15Z",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "wordpress",
"com.docker.compose.version": "1.25.4",
"com.docker.compose.volume": "wp-vol"
},
"Mountpoint": "/var/lib/docker/volumes/wordpress_wp-vol/_data",
"Name": "wordpress_wp-vol",
"Options": {
"device": "/Users/hayashier/data/html",
"o": "bind",
"type": "none"
},
"Scope": "local"
}
]
Error
ERROR: Pool overlaps with other one on this address space
$ docker-compose up -d
Creating network "wordpress_mynet" with driver "bridge"
ERROR: Pool overlaps with other one on this address space
docker-compose実行前にも同じコマンドを実行しており、ネットワークが既に作られており重複していたことが原因
対象のネットワークを特定し、削除する
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
3a39d2a3be36 bridge bridge local
9484ac6c6e9a host host local
fb2546fc2ba3 none null local
680c7ae3219a test2_mynet bridge local
$ docker network rm test2_mynet
test2_mynet
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
$ brew switch openssl 1.0.2s
(参考) Macでdyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib