🗂

Docker内からDockerを操作する(DooD)は1行で実現できる

2022/05/11に公開約1,700字

概要

たとえば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.sock1行を追加するだけです。

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

https://docs.docker.com/engine/install/debian/

Ubuntu

https://docs.docker.com/engine/install/ubuntu/

Discussion

ログインするとコメントできます