7.1 ボリュームのマウント
Docker Composeでボリュームとネットワークをマウントすることで、柔軟で効率的なマルチコンテナアプリケーションを構築できるよ。ボリューム(volumes)は、コンテナの外部に保存する必要があるデータ用に使用されて、一方でネットワーク(networks)はコンテナ間のやりとりを提供します。この講義では、Docker Composeでボリュームとネットワークを使う方法を詳しく説明するよ。
Dockerのボリュームを使うと、コンテナの外部でデータを保存することができて、コンテナを停止または削除してもデータは利用可能だよ。これは特に、データベースのデータ、ログファイル、その他の長期間保存が必要なデータに便利です。
ボリュームの種類:
- 名前付きボリューム (Named Volumes): Dockerによって管理されるよ。ホスト上の特定のディレクトリに保存されるんだ。
- バインドマウント (Bind Mounts): ホストの指定ディレクトリからコンテナにマウントされるよ。
Docker Composeでのボリュームの設定
名前付きボリュームの例
この例では、名前付きボリュームpostgres-data
が作成されて、コンテナdb
内の/var/lib/postgresql/data
ディレクトリにマウントされてるよ。
version: '3.8'
services:
db:
image: postgres:latest
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
バインドマウントの例
この例では、ローカルディレクトリとファイルnginx.conf
とhtml
が、コンテナweb
にバインドマウントとしてマウントされているよ。
version: '3.8'
services:
web:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
7.2 ネットワークのマウント
Docker Composeのネットワークを使うと、コンテナ同士が通信できるよ。各コンテナは1つ以上のネットワークに接続できて、これがトラフィックの管理と分離を実現するんだ。
ネットワークの種類:
- ブリッジネットワーク (Bridge): デフォルトでコンテナはブリッジネットワークに接続される。これは同じホスト上での相互通信を可能にするよ。
- オーバーレイネットワーク (Overlay): Docker Swarmクラスター内の異なるホスト上で実行されるコンテナを接続するために使用されるんだ。
- ネットワークプラグイン (Network Plugins): 他のネットワークドライバを使用して、より高度な構成を可能にするよ。
カスタムネットワークを作成して使う例
この例ではfront-endとback-endの2つのカスタムネットワークを作成するよ。サービスappは両方のネットワークに接続されるけど、サービスwebはfront-endだけ、サービスdbはback-endだけに接続されるんだ。
version: '3.8'
services:
web:
image: nginx:latest
networks:
- front-end
app:
image: myapp:latest
networks:
- front-end
- back-end
db:
image: postgres:latest
networks:
- back-end
networks:
front-end:
back-end:
実践的なヒント:
- 名前付きボリュームの使用: 名前付きボリュームはDockerで管理されるから、データの使用や管理が簡単になるよ。同じ名前付きボリュームを複数のサービスで同時に使うこともできるよ。例えば、バックエンドサービスがログを書き込んで、モニタリングサービスがそのログを分析して
error
レベルのエラーを見つけたら通知する、なんて感じでね。 - ネットワークの分離: 複数のネットワークを使うと、アプリケーションの異なる部分を分離して、その相互作用を制御できるよ。
- 構成ファイルの保存: バインドボリュームを使って構成ファイルをマウントしよう。この方法なら、イメージを再構築せずに簡単に構成を変更できるよ。
- ネットワークのセキュリティ: ネットワークへのアクセスを制限して、必要なコンテナだけが通信できるようにしよう。これでアプリのセキュリティが向上するからね。
7.3 ボリュームとネットワークの使用例
Docker Composeでのボリュームとネットワークの使用例:
例1: Webサーバーとデータベースを持つアプリケーション
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
networks:
- webnet
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- webnet
volumes:
db-data:
networks:
webnet:
この例では:
- WebサーバーnginxとデータベースPostgreSQLが同じネットワークwebnetに接続されており、相互通信が可能になっています。ネットワークが1つだけの場合、指定しなくてもデフォルトネットワークが作成されます。
- データベースのデータは名前付きボリュームdb-dataに保存されており、コンテナの再起動時にも保持されます。
例2: 複数レベルのアプリケーション
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
volumes:
- backend-data:/var/lib/backend
database:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
networks:
- back-tier
volumes:
backend-data:
db-data:
networks:
front-tier:
back-tier:
この例では:
- 2つのネットワーク: front-tier と back-tierが作成されました。
- サービスfrontendは両方のネットワークに接続されており、backendおよび外部クライアントの両方と通信することができます。
- サービスbackendとdatabaseはback-tierネットワークにのみ接続されており、それらの隔離と相互通信を保証しています。
- サービスbackendとdatabaseのデータは、それぞれ個別の名前付きボリュームbackend-dataとdb-dataに保存されています。
GO TO FULL VERSION