DamienKarrus’s blog

プログラミングとクライミングの足跡

コンテナからデータを分離させる docker入門-5

 マウント(バインドマウント)によるデータの分離

コンテナ内のデータはコンテナを破棄した時点でコンテナと共に破棄されてしまう。そこで一般的にはホスト側のリソースをマウントする。-v オプションを使用する。

-v マウント元 : マウント先

-v オプションは複数指定できるので、apacheのconfigファイルやコンテンツ本体などを

 -v aaa:bbb -v ccc:ddd -v eee:fff

などのように列記できる。マウントの対象はディレクトリだけではなく、ファイルを指定することもできる。

コンテナ起動用の runコマンドを httpd:latest などとしておけば、起動時にいつもhttpdの最新イメージで起動することもできる。

また、複数のコンテナからおなじディレクトリをマウントすることもできる。

なお、Dockerホストとコンテナ間でのcopyコマンドもある。

docker container cp コピー元 コンテナ名:コピー先

使用例

# docker container cp /tmp/index.html my-apache-app:/usr/local/apache2/htdocs/

ボリュームマウントによるデータの分離

ボリュームマウントとは、ホスト上のディレクトリではなく、Docker Engine上で確保した領域をマウントする方法である。

$ docker volume create volume01(任意のvolume名)

作成したボリュームの確認

$ docker volume ls

コンテナの起動例

$ docker container run -dit --name db01 -v volume01:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7

であるが、-v オプションではボリュームが存在しない場合は自動的に作られてしまうため、意図しない結果になる場合がある。また、バインドなのかボリュームなのかも不明瞭なため、現在では mount コマンドが推奨されている。

バインド:--mount type=bind,src=マウント元パス,dst=マウント先

ボリューム:--mount type=volume,src=volume名,dst=マウント先

上記のコマンドは以下と等価である

$ docker container run -dit --name db01 --mount type=volume , src=vokume01 , dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypassword mysql:5.7

 

バインドマウントとボリュームマウントの使い分け

両者に優劣があるわけではなく、使い分けが必要である。

(1)バインドのほうがよい場面

・設定ファイルをコンテナに参照させてたい場合

・ホスト側のファイル修正をリアルタイムに反映したい場合(開発中など)

(2)ボリュームのほうがよい場面

dockerホストから触る必要のない(触れてはいけない)データを保管する場合に適している。

・データベースのデータクラスタ本体など

ボリュームはデフォルトではDockerホスト上のストレージであるが、ボリュームプラグインをインストールすれば、AWSのS3やNFSを利用することもできるようになる。

(3)tmpfs マウント

データをコンテナ上にもホスト上にも保存したくない場合(大量のテンポラリデータを扱う場合)や高速に処理したい場合などはマウント元をRAMディスクにすることができる。tmpfs-size で容量を、tmpfs-mode でファイルモード0700などを指定できる。コンテナ破棄と共にデータも破棄される。

 

次の記事

ボリュームのバックアップ docker入門-6 - DamienKarrus’s blog (hatenablog.com)