Docker Composeでボリュームとバインドマウントを使ってみる

2021.09.18
2024.03.24
Docker
Docker VolumeDocker 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

externaltrueにすると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ディレクトとその中にテキトーなファイルを作成します。

1mkdir static
2
3touch static/hoge.txt

ディレクトリ構成は以下のようになります。

1.
2├── docker-compose.yml
3└── static
4    └── hoge.txt

docker-compose up -dで実行するとコンテナとボリュームが作成されました。

1docker-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

マウントしたディレクトリにあるファイルがコンテナ上でも確認できます。

1docker container exec -it data-vol_web_1 ls /opt/app/static
2hoge.txt

ボリュームを確認するとexternal: trueにした方は指定したボリューム名で、そうでない方は[composeのプロジェクト名]+ボリューム名で作成されたことがわかります。

1docker volume ls
2DRIVER    VOLUME NAME
3local     data-vol_mydata
4local     dbdata

試しにdocker-compose downでコンテナを停止してみます。

1docker-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

するとコンテナは削除されましたが、ボリュームは残っています。

1docker volume ls
2DRIVER    VOLUME NAME
3local     data-vol_mydata
4local     dbdata

再度docker-compose up -dで実行しても、ボリュームが新たに作られることはなく再利用されています。

1docker-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
7docker volume ls
8DRIVER    VOLUME NAME
9local     data-vol_mydata
10local     dbdata

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee