2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DockerコンテナからDockerコンテナを起動する時にマウントする方法

Posted at

概要

 ホストのDocker daemonを共有するDockerコンテナ(コンテナ1)からDockerコンテナ(コンテナ2)を起動する時にコンテナ1のディレクトリをコンテナ2にマウントする方法について紹介します
 そもそもそんな用途あるのか?という話ですが、例えばコンテナベースのCI環境でテスト用コンテナにソース管理用コンテナのリソースをマウントしてテスト実行する時とか

docker_mount_from_docker.png

結論

ホストのDocker daemonをマウントしたコンテナ1のディレクトリをコンテナ2にマウントする時に指定するファイルパスはホストから見たファイルパスにしなければならない

検証コード

この検証ではコンテナから新たなコンテナを起動したりしますので、
インセプション状態になり、どの世界にいるのかがわからなくなります
なので、下記のコマンドで実行環境を示すために[コンテナ1]などと表記しています

  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
    
    
  2. コンテナ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
    
  3. コンテナ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 ..
    
  4. 気を取り直して、今度はホストから見たコンテナ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
    
  5. コンテナ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
    
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?