個人メモです。
dockerやdocker-composeで指定するボリュームの使い方について。
##docker-compose.ymlにある2つのvolumesの違い
docker-compose.ymlの①外側のvolumesと②servicesの中のvolumesには違いがある。
docker-compose.ymlの例
version: "3.7"
volumes:
todo-mysql-data:
services:
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
##①外側のvolumes
versionと同じ階層にあるvolumesは指定した名前のボリュームを用意している。
これを名ありボリューム
という。
volumes:
todo-mysql-data:
###名ありボリュームの特徴(メリット)
- 複数のコンテナでボリュームを共有できる。
- コンテナを削除しても消えない(コンテナに依存しない)
##②servicesの中のvolumes
各サービスの中のvolumesをバインドマウントと呼び、ボリュームとは区別される。
**コンテナ内のディレクトリとホスト側のディレクトリをマウント(共有化)**する処理を表す。
services:
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
上記例では、ボリュームtodo-mysql-data
をコンテナ内の/var/lib/mysql
にマウントしている。
これで、/var/lib/mysqlのデータをボリュームに同期できる。
##バインドマウント(bind mount)の書き方 バインドマウントには記述方法がいくつかある。
項目 | バインドマウント | 内容 |
---|---|---|
名ありボリューム | datavolume:/var/lib/mysql | 指定したボリュームを、コンテナ内の指定ディレクトリにマウントする |
名無しボリューム | /var/lib/data | コンテナ内のディレクトリのみ指定。ハッシュ値のボリュームが割り当てられる。(コンテナ削除で消える) |
ルートディレクトリを共有(相対パス) | .:app | コンテナ内の指定したディレクトリをホスト側の実行中ディレクトリにマウントする。 |
絶対パスで指定 | /opt/data:/var/lib/mysql | コンテナ内の指定したディレクトリをホスト側の指定したディレクトリにマウントする。 |
####・ルートディレクトリを共有
.:app
のような記述は頻繁に目にする。
これをすることで、コンテナ内のデータをホスト側で再現できる。(これがないとホスト側でデータが見れない)
####・名ありボリュームと名ありボリュームの主な用途
項目 | 名ありボリューム | 名無しボリューム |
---|---|---|
主な用途 | ・(1)複数コンテナでボリュームを共有する(例:db)・(2)ホスト側への同期から除外する(例:node_module) | 他のコンテナと共有する必要はないが残しておきたいデータ(例:log) |
コンテナ削除 | 残る(コンテナに依存しない) | 消える |