ディレクトリの共有

Docker コンテナを起動する時に、ホスト OS のディレクトリをマウントすることができる。マウントすることで、Docker コンテナからホスト OS ディレクトリにアクセスし、読み取りや書き込みが可能になる。マウントする方法は、複数提供されている。

bind mount

ホスト OS の特定のディレクトリを Dcoker コンテナの特定のディレクトリにマウントするときに bind mount を使う。マウントする際に、マウント元のパスと、マウント先のパスを絶対パスで指定する。パーミッションも指定することができ、読み取り専用(書き込み不可)の場合は readonly で指定し、両者の場合は書き込み可になる。

mkdir docker_share
echo "hello world" >> docker_share/hello_world.txt
docker container run -it --name c_01 \
    --mount type=bind,src=/Users/biopapyrus/docker_share,dst=/root/host_os \
    ubuntu:20.04

root@2760bf12eb67:/# ls
# bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

root@2760bf12eb67:/# cd /root/host_os
root@2760bf12eb67:~/host_os# ls
# hello_world.txt

root@2760bf12eb67:~/host_os# cat hello_world.txt
# hello world

読み取り専用(書き込み不可)でマウントするには、次のように readonly を指定する。

docker container run -it --name c_01 \
    --mount type=bind,src=/Users/biopapyrus/docker_share,dst=/root/host_os,readonly \
    ubuntu:20.04

volume

Docker コンテナに外付けストレージのようなボリュームを付けることができる。Docker コンテナからボリュームに書き出されたデータは、そのままボリューム上に残る。Docker コンテナを停止しても、削除しても、ボリュームには保存されるデータはそのまま残る。

Linux の場合、Docker コンテナにとってのボリューム(外付けストレージ)は、ホスト OS 上の /var/lib/docker/volumes ディレクトリになる。そのため、Docker コンテナを起動したとき、マウントするボリューム名を指定すると、/var/lib/docker/volumes ディレクトリの下にボリューム名からなるディレクトリが作られる。Docker コンテナはそのディレクトリへの書き込みができるようになる。次の例は、ホスト OS 上の /var/lib/docker/volumes/vol0 ディレクトリを、Docker コンテナの /roo/vol0 にマウントするコマンドである。

docker container run -it --name c_02 \
    --mount type=volume,src=vol0,dst=/root/vol0 \
    ubuntu:20.04

macOS の場合は、Docker コンテナが VM 上で動いている。そのため、ボリュームのマウント元は、macOS のディレクトリではなく、VM 上の /var/lib/docker/volumes ディレクトリである。その VM にログインする方法として、VM が動いているセッションに screen で接続すればよい。screen コマンド実行後に何も表示されない場合は、Return キーを押すと VM のコマンド入力画面になる。

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
docker-desktop:~# ls /var/lib/docker/volumes/
## metadata.db

screen セッションからでタッチするときは、間違って exit と実行しないように注意すること。また、macOS からこのディレクトリに直接アクセスするのはかなり困難なようである。