DooD(Docker outside of Docker)でボリュームマウント
DooD(Docker outside of Docker)
起動したDockerコンテナの中で、dockerを利用する方法の1つで、Dockerデーモンはホスト側にバイパスしてDockerコンテナを動作させる方法。dockerやdocker-composeの操作をdockerコンテナ内で行っていても、コンテナから起動したコンテナはホスト側で動いている。
コンテナにDockerをインストール
起動させるコンテナ側でdockerやdocker-composeのCUIを使用するので、必要パッケージをインストール。
1 | apt-get install -y --no-install-recommends docker.io |
Dockerサーバの共有
Dockerのホスト側へは/var/run/docker.sock
をバイパスすることでアクセス。docker-comopose.yml
で/var/run/docker.sock
をvolumeとしてマウント。
1 | volumes: |
DooDで起動したDockerでVolumeマウント
ボリュームマウントは注意が必要。
Dockerデーモンが動作する親ホスト、そこから起動した子コンテナ、DooDでさらに起動する孫コンテナとした場合、孫コンテナが行うボリュームマウントは親ホストのボリュームで、子コンテナのボリュームではない。
子コンテナが親ホストのボリュームをマウントする場合
親ホスト側でdocker-compose.yml
を記述する場合、以下のような相対パスで指定できる。
これはdocker-composeを起動しているのは親ホストで、相対パスは自身の認識する相対パスだから可能。
1 | volumes: |
孫コンテナが親ホストのボリュームをマウントする場合
子コンテナで起動するdocker-compose.yml
では相対パスで記述することはできない。
記述してもエラーにはならないが、空のディレクトリとしてマウントされるだけだ。DooDの仕組みから考えれば直感的に理解できる。
1 | volumes: |
どちらでも起動できるようにするには
docker-compose.yml
は動かす環境ごとに記述したくないので、docker-compose.yml
内で、環境変数を使って環境ごとにボリューム先を変える。
1 | volumes: |
親ホストで実行する場合は.env
ファイルでWORK_DIR=.
を指定する。
子コンテナから起動する場合は親ホストのフルパスを環境変数としてWORK_DIR
を実行ホストの絶対パスで指定する。