0.動作環境
- AWS EC2
- Ubuntu 18.04.6
- Docker 20.10.12
1. 概要
Dockerコンテナ内部でコンテナを操作することは例えばGitLab Runnerなどでよく利用されるユースケースである。 コンテナからコンテナを操作する主要な方法である
- DinD (Docker in Docker): Dockerインストール済みのコンテナを利用し、コンテナ内でホストとは別のDockerデーモンを動かす方法。
- DooD (Docker outside of Docker): Dockerインストール済みのコンテナを使用するのはDinDと同じだがdockerd、containerdは使用しない。代わりコンテナ側からホストのdocker.sock (/var/run/docker.sock)をマウントする。そのため、コンテナ上のDockerコマンドはホスト側のDocker環境で実行されることになる。
上記2種類の方法を今記事では扱う。
2. DinD
Docker 公式のDinDに対応しているイメージであるdocker:stable-dind
を利用する。
ubuntu@ip-172-31-17-145:~$ docker run --privileged --name dind -d docker:stable-dind
デフォルトのままでは、Dockerコンテナはデバイスファイルにアクセスできないためコンテナ内でDockerデーモンを起動することはできない。
DinDコンテナの起動のためprivileged
フラグを付与し特権モードで動かす。
起動した確認する。
ubuntu@ip-172-31-17-145:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21824f35109e docker:stable-dind "dockerd-entrypoint.…" 56 seconds ago Up 55 seconds 2375-2376/tcp dind
DinDコンテナのシェルに入り、docker
コマンドを利用可能なことを確かめる。
ubuntu@ip-172-31-17-145:~$ docker exec -it dind ash
/ # docker -v
Docker version 19.03.14, build 5eb3275
/ #
DinDコンテナ内部で動いているプロセスを確認する。dockerd
とcontainerd
が動作していることが確認できる
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 dockerd --host=unix:///var/run/docker.sock --host=tcp://0.0.0.0:2376 --tlsverify --tlscacert /certs/server/ca.pem --tlscert /certs/server/cert.pem
54 root 0:00 containerd --config /var/run/docker/containerd/containerd.toml --log-level info
172 root 0:00 ash
188 root 0:00 ps aux
/ #
DinDコンテナの内部で動いているコンテナを確認する。現時点では当然のごとく一つもコンテナが起動していない
/ # docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
/ #
以上からDinDの場合はホストのDockerとは隔離されたDocker環境を利用可能なことが分かる。
3. DooD
Docker公式のコンテナを起動し、シェルを実行する
ubuntu@ip-172-31-17-145:~$ docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock docker /bin/ash
まずはコンテナ内部からdocker image
でimage一覧を確認する
/ # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper x86_64-98daeee0 c98df3b3bc76 5 days ago 66.9MB
docker dind 1a42336ff683 4 weeks ago 233MB
gitlab/gitlab-runner latest 9225e3135217 4 weeks ago 691MB
docker latest 15a9bc7c6340 2 months ago 216MB
alpine latest c059bfaa849c 3 months ago 5.59MB
docker stable-dind 6f19136cf89d 14 months ago 235MB
docker 19.03.13-dind 71edd6fcc7ef 16 months ago 232MB
docker 19.03.13 6972c414f322 16 months ago 217MB
次にホストに戻りdocker image
を実行する
ubuntu@ip-172-31-17-145:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.gitlab.com/gitlab-org/gitlab-runner/gitlab-runner-helper x86_64-98daeee0 c98df3b3bc76 5 days ago 66.9MB
docker dind 1a42336ff683 4 weeks ago 233MB
gitlab/gitlab-runner latest 9225e3135217 4 weeks ago 691MB
docker latest 15a9bc7c6340 2 months ago 216MB
alpine latest c059bfaa849c 3 months ago 5.59MB
docker stable-dind 6f19136cf89d 14 months ago 235MB
docker 19.03.13-dind 71edd6fcc7ef 16 months ago 232MB
docker 19.03.13 6972c414f322 16 months ago 217MB
次にdocker ps
も確認する
まずはコンテナ内部で確認する
/ # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4092ff8cbc92 docker "docker-entrypoint.s…" 2 minutes ago Up 2 minutes adoring_agnesi
7181ac8250a9 gitlab/gitlab-runner:latest "/usr/bin/dumb-init …" 5 days ago Up 5 days runner-container-ansible
次にホストから確認する。
ubuntu@ip-172-31-17-145:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4092ff8cbc92 docker "docker-entrypoint.s…" 3 minutes ago Up 2 minutes adoring_agnesi
7181ac8250a9 gitlab/gitlab-runner:latest "/usr/bin/dumb-init …" 5 days ago Up 5 days runner-container-ansible
このようにDooDではホスト側のDocker環境を利用することになる。つまり、Dockerのクライアントサーバシステムのクライアント部分だけをコンテナ側にもってきた形態。コンテナ側はホスト側のDockerバージョンとの整合を気をつける必要がある。