【ツール活用|豆知識】Dockerコンテナ間の通信をマスターしよう!ネットワークの基礎と実践Tips

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への接続先はIPアドレスではなくサービス名を指定 # 例: DB_HOST=db environment:
  • DB_HOST=db
# データベースサービス db: image: postgres:alpine networks:
  • my-app-network
ネットワークを定義 networks: my-app-network: driver: bridge

この設定により、webサービスから db というホスト名でデータベースへ通信が可能になります。

5. 応用・注意点

現場で活用する際のポイントをまとめます。

疎通確認には docker network inspect を活用する
特定のネットワークにどのコンテナが所属しているかを確認するには、コマンドラインで docker network inspect [ネットワーク名] を実行してください。どのコンテナにどのIPが割り振られているか一目で分かります。

デフォルトネットワークの利用を避ける
Docker Composeを使わずに手動でコンテナを立ち上げる際、デフォルトのbridgeネットワークに全コンテナを詰め込むのは避けましょう。本番環境では、アプリケーションごとに専用のネットワークを作成(docker network create)し、必要なコンテナのみを接続する「最小権限の原則」を守るのが、堅牢なインフラ設計の第一歩です。

名前解決のトラブルシューティング
もしサービス名で疎通が取れない場合は、まず対象のコンテナが同じネットワークに含まれているかを確認してください。異なるネットワークに属している場合は、pingコマンドやcurlを使って、コンテナ内から名前解決ができるかテストするのが定石です。

コメント

タイトルとURLをコピーしました