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コンテナ内部で動いているプロセスを確認する。dockerdcontainerdが動作していることが確認できる

/ # 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バージョンとの整合を気をつける必要がある。