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 からこのディレクトリに直接アクセスするのはかなり困難なようである。