概要
ホストのDocker daemonを共有するDockerコンテナ(コンテナ1)からDockerコンテナ(コンテナ2)を起動する時にコンテナ1のディレクトリをコンテナ2にマウントする方法について紹介します
そもそもそんな用途あるのか?という話ですが、例えばコンテナベースのCI環境でテスト用コンテナにソース管理用コンテナのリソースをマウントしてテスト実行する時とか
結論
ホストのDocker daemonをマウントしたコンテナ1のディレクトリをコンテナ2にマウントする時に指定するファイルパスはホストから見たファイルパスにしなければならない
検証コード
この検証ではコンテナから新たなコンテナを起動したりしますので、
インセプション状態になり、どの世界にいるのかがわからなくなります
なので、下記のコマンドで実行環境を示すために[コンテナ1]
などと表記しています
-
コンテナ1を作成し、コンテナ1でdockerをインストールします
# [ホスト] コンテナ1を作成 > docker run --rm -it --name container1 -v /var/run/docker.sock:/var/run/docker.sock:ro ubuntu:14.04 /bin/bash # [コンテナ1] dockerをインストール > apt-get update && apt-get install -y docker.io # [コンテナ1] 確認用のファイルを作成し、作成されたファイルを確認 > mkdir /tmp/mount_test && touch /tmp/mount_test/test1.txt && touch /tmp/mount_test/test2.txt && touch /tmp/mount_test/test3.txt && ls -la /tmp/mount_test
-
コンテナ1でコンテナ1の
/tmp/mount_test
をマウントするコンテナ2を作成します(失敗例)# [コンテナ1] コンテナ2を作成 > docker run --rm -it --name container2 -v /tmp/mount_test:/tmp/mount_test ubuntu:14.04 /bin/bash
-
コンテナ2でマウントされた
/tmp/mount_test
を確認します
ファイルがないことが確認できます
なぜないのか!?ホストのDocker daemonをマウントしているため、マウント時はホストのファイルパスが参照されます
よって、ホストには/tmp/mount_test
がないため、マウント先は空になります# [コンテナ2] /tmp/mount_testを確認 > ls -la /tmp/mount_test drwxr-xr-x 2 root root 40 Sep 15 06:15 . drwxrwxrwt 1 root root 4096 Sep 15 06:15 ..
-
気を取り直して、今度はホストから見たコンテナ1のファイルパスでマウントしましょう
ファイルパスはdocker inspect
コマンドで取得します
ポイントとしてはコンテナ化した時に作成された差分はdiff配下に生成されます
前述のコードで/tmp/mount_test
を作成したことで、コンテナイメージから差分としてdiffに保存されます# [コンテナ2] コンテナ2から抜けます > exit # [コンテナ1] ホストから見たコンテナ1のファイルパスを取得する > docker inspect --format='{{.GraphDriver.Data.UpperDir}}' container1 # [コンテナ1] テナント2を作成 # 上記のコマンドで得られたファイルパスを以下の<xxx>に置き換えてください > docker run --rm -it --name container2 -v <xxx>/tmp/mount_test:/tmp/mount_test ubuntu:14.04 /bin/bash
-
コンテナ2でマウントされた
/tmp/mount_test
を確認します
コンテナ1のファイルがマウントされていることが確認できます# [コンテナ2] /tmp/mount_testを確認 > ls -la /tmp/mount_test drwxr-xr-x 2 root root 4096 Sep 15 06:00 . drwxrwxrwt 1 root root 4096 Sep 15 08:48 .. -rw-r--r-- 1 root root 0 Sep 15 06:00 test1.txt -rw-r--r-- 1 root root 0 Sep 15 06:00 test2.txt -rw-r--r-- 1 root root 0 Sep 15 06:00 test3.txt