前回はざっとDocker Composeの使い方について説明しました。今回は、ボリュームを扱う方法について少し深掘りしたいと思います。
Docker Composeでボリュームを扱う方法
主に二つの方法があります。
- サービス宣言の一部として、オンザフライで宣言する(バインドマウント)
- 名前付きボリュームを作成して、サービス内で利用を宣言する
オンザフライで宣言
オンザフライで宣言する場合、以下のような使用方法があります。
- ホスト上のパスを指定して割り当てる
- 一時的なデータをメモリ上に保存する
- ほかのサービスやコンテナ上のボリュームを割り当てる
docker compose
のver3ではオンザフライで宣言してこの使い方をすることができなくなった(volumes_from
が廃止された)ので、割愛します。
ホスト上のパスを指定して割り当てる
[ホストのパス]:[コンテナのパス]
でホスト上のディレクトリとコンテナのディレクトリを結びつけることができます。ここで指定した[コンテナのパス]
にコンテナ上でファイルを配置すると、[ホストのパス]
にそのファイルが保存されます。また、読み書き権限の制御も行えます。その場合は、[ホストのパス]:[コンテナのパス]:rw
を指定します(読み取り専用にしたいならr
のみつける)。
docker-compose.yaml
では、services.<サービス名>.volumes
配下に指定します。例えば、以下のようになります。
version: '3.8'
services:
web:
build: .
container_name: web
volumes:
- /home/opc/app/uploads:/app/uploads:rw
一時的なデータをメモリ上に保存する
tmpfs
マウントを使用することで、一時的なデータをメモリ上に保存することができます。コンテナが停止すると、データは失われます。tmpfs
マウントを使うときは、services.<サービス名>.tmpfs
配下に指定します。
version: '3.8'
services:
cache:
image: redis:latest
tmpfs:
- /var/lib/redis # コンテナ内のマウントポイントを指定
名前付きボリューム
ボリュームに名前を付けて宣言して、複数のコンテナやサービス間で共有することができます。現在はvolumes_from
ではなくこちらを使って共有するようです。
名前付きボリュームは、Dockerが管理するボリュームで、コンテナが削除されてもデータは保持されます。
名前付きボリュームは、以下のように定義できます。
version: '3.8'
services:
web:
image: my-web-app:latest
ports:
- "8080:5000"
volumes:
- uploads:/app/uploads
volumes:
uploads:
driver: local
driver
には、そのボリュームがどのようにストレージを提供するかを指定します。指定できるものとして、以下のようなものがあります(ほかにもあります)。
- local
- nfs
- cifs
local
local
ドライバーは、デフォルトで使用されるドライバーで、ホストマシンのファイルシステムにデータを保存します。
volumes:
my-local-volume:
driver: local
driver_opts:
type: none
device: /absolute/path/to/dir
o: bind
nfs
nfs
ドライバーは、ネットワークファイルシステムを使用して、リモートサーバーにデータを保存します。複数のホスト間で共有ストレージを提供する場合に使用されます。
volumes:
my-nfs-volume:
driver: nfs
driver_opts:
type: nfs
o: addr=192.168.1.100,rw
device: ":/path/to/nfs/dir"
cifs
cifs
ドライバーは、CIFSを使用して、Windowsネットワーク共有をマウントします。cifs
ドライバーを使うと、ホスト上のマウントポイントを変更しなくても、Dockerで直接Samba共有ディレクトリをマウントできます。
volumes:
my-cifs-volume:
driver: local
driver_opts:
type: cifs
o: addr=uxxxx.your-server.de,username=user,password=pass,domain=domain
device: "//server/share"
まとめ
今回はdocker compose
でボリュームを扱う方法について簡単に説明しました。次回はdocker compose
でのネットワークの扱いについて説明します。