【Docker】Dockerでホストのディレクトリをマウントする

  • 16
    いいね
  • 0
    コメント

Manage data in containers

ホストのディレクトリをDcokerのコンテナから参照できるようにする。

コマンド

ホスト側のマウント先を指定する場合

docker run -v [ホストディレクトリの絶対パス]:[コンテナの絶対パス] [イメージ名] [コマンド]
docker run -v /lib/modules:/lib/modules dummy-img /bin/bash

これでホスト側のディレクトリがコンテナにマウントされる。コンテナ上で作ったファイルがホストの方に残る。

docker inspectするとこんな感じで表示される↓

"Mounts": [
    {
        "Source": "/lib/modules",
        "Destination": "/lib/modules",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
]

マウントするとデフォルトでread-write modeなので"RW": trueになってる。

Docker volumes default to mount in read-write mode, but you can also set it to be mounted read-only.

docker run -v [ホストディレクトリの絶対パス]:[コンテナの絶対パス]:ro [イメージ名] [コマンド]

最後にroをつけるとread-only modeになる。

"Mounts": [
    {
        "Source": "/lib/modules",
        "Destination": "/lib/modules",
        "Mode": "ro",
        "RW": false,
        "Propagation": "rprivate"
    }
]

ホスト先のマウント先を指定しない場合

docker run -v [コンテナの絶対パス] [イメージ名] [コマンド]
docker run -v /lib/modules dummy-img /bin/bash
"Mounts": [
    {     
        "Name": "3da94f6d7353ac0287b97b5a2eaa6434b4a827683dddaf03719c112e531fd47b",
        "Source": "/var/lib/docker/volumes/3da94f6d7353ac0287b97b5a2eaa6434b4a827683dddaf03719c112e531fd47b/_data",
        "Destination": "/lib/modules",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
]

ホスト側の/var/lib/docker/volumesの下にディレクトリ作られてマウントされた。

ホスト先のマウント先を指定しない場合 (name指定)

docker run -v [name]:[コンテナの絶対パス] [イメージ名] [コマンド]
docker run -v foo:/lib/modules dummy-img /bin/bash
"Mounts": [
    {
        "Name": "foo",
        "Source": "/var/lib/docker/volumes/foo/_data",
        "Destination": "/lib/modules",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": "rprivate"
    }
]

ホスト側の/var/lib/docker/volumesの下にfoooディレクトリ作られてマウントされる。

ちなみに

pythonのdocker-pyとかrubyのdocker-apiを使うことが多いのでメモ。

docker-py

docker-py Documentation using-volumes

container_id = cli.create_container(
    'busybox', 'ls', volumes=['/mnt/vol1', '/mnt/vol2'],
    host_config=cli.create_host_config(binds={
        '/home/user1/': {
            'bind': '/mnt/vol2',
            'mode': 'rw',
        },
        '/var/www': {
            'bind': '/mnt/vol1',
            'mode': 'ro',
        }
    })
)

docker-api

container = Docker::Container.create(
      'Image' => 'dummy_img',
      'HostConfig' => { 
          'Binds':  [ '/lib/modules:/lib/modules' ]
      },
)

参考

http://qiita.com/sokutou-metsu/items/b83b275198fc9594f5a4