1. 導入
Dockerで複数のコンテナを動かす際、「コンテナ同士をどうやって安全に通信させるか」は非常に重要な課題です。IPアドレスをハードコーディングしてしまうと、コンテナの再作成のたびに接続先を変更しなければならず、運用効率が大幅に下がります。本記事では、Docker Networkの仕組みを理解し、名前解決を活用したスマートな通信設定方法を解説します。
2. 基礎知識
Docker Networkは、コンテナが相互に通信するための仮想的なネットワーク機能です。代表的な種類を以下に挙げます。
bridge: デフォルトのネットワークモード。コンテナを独立したネットワークに配置し、内部で通信させます。
host: コンテナがホストマシンのネットワークを直接利用します。ポートマッピングが不要になりますが、ポート競合のリスクがあります。
overlay: 複数のDockerホストをまたいで通信するためのモード(Swarm環境などで使用)。
特に、Docker Composeを使用する際は「内部DNS」が自動的に有効になります。これにより、IPアドレスではなく「サービス名(service name)」を指定するだけで、コンテナ同士が相手を見つけられるようになります。
3. 実装/解決策
最も推奨される方法は、Docker Composeを使用して「共通のネットワーク」を定義することです。明示的にネットワークを指定することで、通信範囲を制限し、セキュリティを向上させることができます。また、サービス名をホスト名として利用することで、設定ファイルからIPアドレスを排除できます。
4. サンプルプログラム
以下の docker-compose.yml は、Webアプリコンテナからデータベースコンテナへ接続する例です。
version: '3.8'
services:
# アプリケーションサービス
web:
image: nginx:latest
networks:
- my-app-network
- DB_HOST=db
- my-app-network
この設定により、webサービスから db というホスト名でデータベースへ通信が可能になります。
5. 応用・注意点
現場で活用する際のポイントをまとめます。
疎通確認には docker network inspect を活用する
特定のネットワークにどのコンテナが所属しているかを確認するには、コマンドラインで docker network inspect [ネットワーク名] を実行してください。どのコンテナにどのIPが割り振られているか一目で分かります。
デフォルトネットワークの利用を避ける
Docker Composeを使わずに手動でコンテナを立ち上げる際、デフォルトのbridgeネットワークに全コンテナを詰め込むのは避けましょう。本番環境では、アプリケーションごとに専用のネットワークを作成(docker network create)し、必要なコンテナのみを接続する「最小権限の原則」を守るのが、堅牢なインフラ設計の第一歩です。
名前解決のトラブルシューティング
もしサービス名で疎通が取れない場合は、まず対象のコンテナが同じネットワークに含まれているかを確認してください。異なるネットワークに属している場合は、pingコマンドやcurlを使って、コンテナ内から名前解決ができるかテストするのが定石です。

コメント