🗂
Docker内からDockerを操作する(DooD)は1行で実現できる
概要
たとえばDev Containerの中で本番用Dockerコンテナをビルドしたい、serverless offlineを動かしたいといったときにDocker outside of Docker(DooD)をする必要があります。DooDというのはコンテナ内からホスト側dockerデーモンにアクセス・操作をする方式です。
Dockerを入れ子で動かすdindという方法もありますが、dindはもう少しややこしいのと、セキュリティやパフォーマンス、安定性の面で難しいところがありDooDが基本的には推奨されます。
具体的なDooDの実現方法
/var/run/docker.sock
をコンテナ側に見せる(バインドマウントする)だけです。
dockerコマンド
-v /var/run/docker.sock:/var/run/docker.sock
オプションを追加するだけで実現できます。
docker-compose
services:
your_app:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/run/docker.sock:/var/run/docker.sock
1行を追加するだけです。
devcontainer.json
複雑な構成の場合はdocker-composeを利用することをお勧めしますが、devcontainer.jsonにもmountsオプションがあります。
"mounts":["source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"]
コンテナ内へのDockerコマンドのインストール
公式のドキュメントなどを参考にしてください。コンテナのベースイメージとなるOSにもよりますが、Dockerfileなどに次のようなRUNを足す感じです。
このRUNの位置はキャッシュの効きやすさを考えるとDockerファイルの上の方にあることが望ましいです。
RUN sudo apt-get update && \
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \
sudo apt-get update && \
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Debian
Ubuntu
Discussion