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が動くホストが同一パスを参照している必要がある訳です。

以上。