9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【docker-compose】volumesの名無し・名ありボリュームの使い方。バインドマウント

Posted at

個人メモです。

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)
コンテナ削除 残る(コンテナに依存しない) 消える
9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?