Docker Composeでボリュームとバインドマウントを使ってみる
はじめに
Docker Composeでボリュームとバインドマウントを利用する方法について簡単にまとめたいと思います。
ボリューム
ボリュームとは、Dockerコンテナで扱うデータを永続化する仕組みです。 Dockerの中にボリュームというデータを保持する領域を確保して永続化します。
バインドマウント
バインドマウントとは、ホスト側のディレクトリやファイルをコンテナ内にマウントすることです。 バインドマウントによってもコンテナで扱うデータを永続化することができます。
Dockerのドキュメントより
Docker Composeでボリュームとバインドマウント
Docker Composeでボリュームやバインドマウントを利用する場合は、以下のようにサービス設定が必要です。
名前付きボリュームを利用する場合は、追加でボリューム設定も必要になります。
1version: "3"
2services:
3 web:
4 image: nginx:alpine
5 volumes:
6 - type: volume
7 source: mydata
8 target: /data
9 volume:
10 nocopy: true
11 - type: bind
12 source: ./static
13 target: /opt/app/static
14
15 db:
16 image: postgres:latest
17 environment:
18 - POSTGRES_PASSWORD=password
19 volumes:
20 - "dbdata:/var/lib/postgresql/data"
21
22volumes:
23 mydata:
24 dbdata:
25 external: true
サービス設定
サービス設定のサブオプションとしてのvolumes
は2種類の書き方があります。
1行で記述
下記の書式でボリュームまたはバインドマウントを設定できます。
1[SOURCE:]TARGET[:MODE]
下記のように設定できます。
1services:
2 service_name:
3
4 volumes:
5 # ボリューム
6 - /var/lib/mysql # パス指定のみ。Engine にボリュームを生成させます。
7 - datavolume:/var/lib/mysql # 名前つきボリューム。
8
9 # バインドマウント
10 - /opt/data:/var/lib/mysql # 絶対パスのマッピングを指定。
11 - ./cache:/tmp/cache # ホストからのパス指定。Compose ファイルからの相対パス。
12 - ~/configs:/etc/configs/:ro # ユーザーディレクトリからの相対パス。
13
14volumes:
15 dattavolume:
名前付きボリュームの場合はボリューム設定が必要になります。
複数行で記述
下記の項目を細かく設定して記述することもできます。
type
: マウントタイプ(volume
,bind
,tmpfs
,npipe
)source
: マウント元target
: マウントされるコンテナのパスread_only
: 読み込み専用bind
: バインドオプションpropagation
: バインドの伝播モード
volume
: ボリュームオプションnocopy
: ボリューム生成時のコンテナからのデータコピーを無効
tmpfs
: tmpfsオプションsize
: tmpfsマウントのサイズ
下記のように設定できます。
1services:
2 service_name:
3 volumes:
4 - type: volume
5 source: mydata
6 target: /data
7 volume:
8 nocopy: true
9 - type: bind
10 source: ./static
11 target: /opt/app/static
12
13volumes:
14 mydata:
ボリューム設定
ボリューム設定では、再利用可能な名前付きボリュームの生成ができます。サービス設定で名前付きボリュームを指定した場合は設定が必要になります。
以下のようにサービス設定で指定した名前付きボリュームをボリューム設定に記述します。
1version: "3"
2
3services:
4 db:
5 image: postgres
6 volumes:
7 - data:/var/lib/postgresql/data
8
9volumes:
10 data:
11 external: true
external
をtrue
にするとComposeの外部で作成されているボリュームを指定できます。
試してみる
実際にボリュームとバインドマウントを試してみます。
以下のようなdocker-compose.yml
を作成します。
1version: "3"
2services:
3 web:
4 image: nginx:alpine
5 volumes:
6 - type: volume
7 source: mydata
8 target: /data
9 volume:
10 nocopy: true
11 - type: bind
12 source: ./static
13 target: /opt/app/static
14
15 db:
16 image: postgres:latest
17 environment:
18 - POSTGRES_PASSWORD=password
19 volumes:
20 - "dbdata:/var/lib/postgresql/data"
21
22volumes:
23 mydata:
24 dbdata:
25 external: true
マウントするstatic
ディレクトとその中にテキトーなファイルを作成します。
1❯ mkdir static
2
3❯ touch static/hoge.txt
ディレクトリ構成は以下のようになります。
1.
2├── docker-compose.yml
3└── static
4 └── hoge.txt
docker-compose up -d
で実行するとコンテナとボリュームが作成されました。
1❯ docker-compose up -d
2[+] Running 5/5
3 ⠿ Network data-vol_default Created 0.1s
4 ⠿ Volume "data-vol_mydata" Created 0.0s
5 ⠿ Volume "dbdata" Creat... 0.0s
6 ⠿ Container data-vol_web_1 Started 1.0s
7 ⠿ Container data-vol_db_1 Started 1.0s
マウントしたディレクトリにあるファイルがコンテナ上でも確認できます。
1❯ docker container exec -it data-vol_web_1 ls /opt/app/static
2hoge.txt
ボリュームを確認するとexternal: true
にした方は指定したボリューム名で、そうでない方は[composeのプロジェクト名]+ボリューム名で作成されたことがわかります。
1❯ docker volume ls
2DRIVER VOLUME NAME
3local data-vol_mydata
4local dbdata
試しにdocker-compose down
でコンテナを停止してみます。
1❯ docker-compose down
2[+] Running 3/3
3 ⠿ Container data-vol_db_1 Removed 0.3s
4 ⠿ Container data-vol_web_1 Removed 0.3s
5 ⠿ Network data-vol_default Removed 0.1s
するとコンテナは削除されましたが、ボリュームは残っています。
1❯ docker volume ls
2DRIVER VOLUME NAME
3local data-vol_mydata
4local dbdata
再度docker-compose up -d
で実行しても、ボリュームが新たに作られることはなく再利用されています。
1❯ docker-compose up -d
2[+] Running 3/3
3 ⠿ Network data-vol_default Created 0.1s
4 ⠿ Container data-vol_db_1 Started 1.0s
5 ⠿ Container data-vol_web_1 Started 1.0s
6
7❯ docker volume ls
8DRIVER VOLUME NAME
9local data-vol_mydata
10local dbdata