DooD(Docker outside of Docker)でDockerコンテナ内からdocker composeを使う
DooD(Docker outside of Docker)という方法を使うと、
Dockerホストで行っていた処理を、Dockerコンテナ内で行うことが出来ます。
但し、Dockerコンテナ内から、Docker Composeを使う場合は、
そのままでは使用することは出来ません。
Docker ComposeがDockerホストのパスを前提に動作するので、
DockerホストとDooDコンテナのパスを合わせる必要があります。
ファイル構成
結論から書くと、以下のような構成で実現できます。
# Docker Composeが扱う全ファイルが、
# docker-compose.yamlのあるディレクトリ階層以下にあることが前提です
ファイル構成:
- docker-compose.yaml
- crtl
- Dockerfile
docker-compose.yaml
version: "3.9"
services:
app:
image: "nginx:latest"
ports:
- 8080:80
ctrl:
build: ctrl
working_dir: $PWD
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- .:$PWD
ctrl/Dockerfile
FROM debian:bullseye-slim
RUN apt-get update -y \
&& apt-get install -y ca-certificates curl gnupg \
&& install -m 0755 -d /etc/apt/keyrings \
&& curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg \
&& chmod a+r /etc/apt/keyrings/docker.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo $VERSION_CODENAME) stable" \
| tee /etc/apt/sources.list.d/docker.list > /dev/null \
&& apt-get update -y \
&& apt-get install -y docker-ce-cli
CMD ["sleep", "infinity"]
実行イメージ
以下のように、app, ctrlコンテナを起動しておきます。
docker compose up --build
以下のようにして、crtlコンテナからappの停止・開始ができます。
docker compose run ctrl bash -c "docker compose stop app"
docker compose run ctrl bash -c "docker compose start app"
手続きは以上です。で、何をやっているかというと、
docker-compose.yamlの次の箇所で、
docker-compose.yamlのあるディレクトリが、
Dockerホストとctrlコンテナで、同一のパスになるようにマウントしています。
volumes:
- .:$PWD
Docker Composeは.
のような相対パス指定が可能ですが、
dockerに渡す際には絶対パスに置き換えるので、
Docker Composeコマンドを実行するコンテナと、Dockerが動くホストが同一パスを参照している必要がある訳です。
以上。