やりたかったこと

Dockerコンテナ間の通信設定を理解したかった。 docker-composeで複数コンテナを動かす時にネットワーク設定が重要になる。

ネットワークの種類

bridge(デフォルト)

docker run -d --network bridge nginx
  • デフォルトのネットワーク
  • コンテナ間はIPアドレスで通信できる
  • ホストとは別のネットワーク空間

host

docker run -d --network host nginx
  • ホストのネットワークをそのまま使う
  • ポートマッピング不要
  • Linuxのみ対応(MacやWindowsでは動作が異なる)

none

docker run -d --network none nginx
  • ネットワークなし
  • 外部との通信が完全に遮断される

カスタムネットワークを作成する

docker network create mynetwork
docker run -d --network mynetwork --name app1 nginx
docker run -d --network mynetwork --name app2 nginx

同じネットワーク内のコンテナはコンテナ名で通信できる。

# app1からapp2に接続
curl http://app2

docker-composeでのネットワーク設定

services:
  web:
    image: nginx
    networks:
      - frontend
  db:
    image: mysql:8
    networks:
      - backend
  app:
    image: myapp
    networks:
      - frontend
      - backend

networks:
  frontend:
  backend:

よく使うコマンド

docker network ls                    # ネットワーク一覧
docker network inspect mynetwork     # ネットワーク詳細
docker network create mynetwork      # ネットワーク作成
docker network rm mynetwork          # ネットワーク削除
docker network connect mynetwork コンテナ名  # コンテナをネットワークに追加

ハマったポイント

  • docker-composeは自動でカスタムネットワークを作成する
  • 同じネットワーク内でないとコンテナ名で通信できない
  • nginx 502エラーはネットワーク設定が原因のことが多い

関連記事