Docker Composeを使えば、複数のコンテナをまとめて管理でき、アプリケーションの開発やテスト環境を効率的に構築できます。その中でも「ネットワーク設定」は、コンテナ間通信を安全かつ明確にする上で欠かせない要素です。
この記事では、Composeファイル(docker-compose.yml
)でネットワークを定義する方法から、カスタマイズ、検証、実践構成までを順を追って解説します。
1. Dockerネットワークの基礎
Dockerコンテナは、デフォルトで「bridge」ネットワーク上に配置され、コンテナ名をDNSとして名前解決できます。
ただし、複数のComposeプロジェクトを扱う場合や、通信を明示的に分離したい場合には、自前でネットワークを定義するのが望ましいです。
主なネットワークモードは以下の通りです。
モード | 概要 |
---|---|
bridge | デフォルトのローカルネットワーク。コンテナ間通信が可能。 |
host | ホストのネットワークを直接利用。Linux専用。 |
none | ネットワークなし。完全に独立した環境。 |
overlay | Swarmモードで使用。複数ホスト間で通信可能。 |
Composeではこれらを簡潔に宣言でき、ネットワーク分離や命名を柔軟に行えます。
2. docker-compose.ymlでネットワークを定義する
まずは基本的なネットワーク定義を見てみましょう。
version: '3'
services:
web:
image: nginx
networks:
- frontend
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: example
networks:
- backend
networks:
frontend:
backend:
上記では「frontend」と「backend」という2つのネットワークを定義し、web
コンテナは frontend
に、db
コンテナは backend
に接続しています。
このようにネットワークを分離することで、DBを外部から直接アクセスできないようにする構成が可能になります。
3. カスタムネットワークの設定例
ネットワークは単に定義するだけでなく、細かい制御も可能です。
3.1 bridgeドライバを指定する
networks:
frontend:
driver: bridge
driver_opts:
com.docker.network.bridge.name: custom_front
driver_opts
を指定することで、Dockerが内部で作成するブリッジ名を制御できます。
これにより、既存環境との競合を避けることができます。
3.2 サブネットやIP範囲を指定する
networks:
backend:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
ipam
を使えば、特定のIPレンジを手動で設定できます。
複数ネットワークを扱う場合、サブネットの重複を避けることで通信トラブルを防げます。
4. コンテナ間通信を検証する
定義したネットワークが正しく機能しているか、実際に確認してみましょう。
- 起動
docker-compose up -d
- コンテナ内で名前解決を確認
docker exec -it <web_container> ping db
同じネットワーク上のサービス名をDNSとして利用できるため、IPアドレスを意識せず通信が可能です。
例えば web
から db
にMySQL接続する場合も、db:3306
でアクセスできます。
5. 実践構成:フロントとDBを分離した安全な環境
セキュリティを考慮した例を見てみましょう。
version: '3.8'
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
networks:
- frontend
- backend
app:
image: myapp:latest
depends_on:
- db
networks:
- backend
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: securepass
networks:
- backend
networks:
frontend:
backend:
ここでは frontend
ネットワークには公開用の nginx
だけが接続し、backend
ネットワークにはアプリとデータベースが所属しています。
外部からはDBへの直接アクセスが遮断され、Web経由のみ通信できる安全な構成です。
6. トラブルシューティング
ネットワーク関連のトラブルは以下のような方法で対処します。
- ネットワークが存在しないエラー
docker network ls docker network create mynet
- DNSが解決できない
- Composeの
networks
設定を再確認 - コンテナを再起動してキャッシュをリセット
- Composeの
- 不要なネットワークの削除
docker network prune
7. まとめ
Docker Composeでネットワークを定義することで、複数のコンテナを安全かつ整理された形で運用できます。
小規模な開発環境でも、明示的にネットワークを定義しておくことで、将来的な拡張性やセキュリティの確保に役立ちます。
次のステップ
depends_on
とネットワーク依存関係を組み合わせて起動順序を制御- Docker SwarmやKubernetesでのマルチホストネットワーク設計に発展
- VPNや外部ネットワークとCompose環境を統合
コメントを残す