Docker ネットワーク備忘録
Docker ネットワークについて調べた際の備忘録です。
1. Docker ネットワークの基本概念
- Docker コンテナは Linux Namespace によりネットワーク空間が分離されている。
- 各コンテナは独自のネットワークスタック(IP、ルーティングテーブルなど)を持つ。
- ホスト側には
docker0という 仮想ブリッジ が作成され、コンテナの veth(仮想 NIC)が接続される。
2. NAT による外部アクセス
- コンテナは通常 プライベート IP(例: 172.17.x.x) を持つ。
- 外部からアクセスするには ポートフォワーディング(-p) を使う。
- 例:
docker run -d -p 8080:80 nginx
→ ホストの8080にアクセスするとコンテナの80に届く。
3. Docker ネットワークの種類
① bridge(デフォルト)
- コンテナは
docker0ブリッジに接続される。 - デフォルト bridge(docker0)ではコンテナ名で名前解決できない。
-
docker network createで作成した ユーザー定義 bridge では DNS が有効になり、コンテナ名で通信可能。 - 同じユーザー定義 bridge 内のコンテナはプライベート IP または名前で通信できる。
② host
- コンテナがホストのネットワークスタックをそのまま利用。
- ポートフォワーディングは無効。
③ none
- ネットワークなし(lo のみ)。
④ overlay
- 複数ホスト間でコンテナを接続するネットワーク。
- Docker Swarm などの分散環境で利用。
4. コンテナ間通信の仕組み
同じネットワークに属する場合
- プライベート IP またはコンテナ名で通信可能(ユーザー定義 bridge の場合)。
- 例:
ping web2
異なるネットワークに属する場合
- デフォルトでは通信不可。
- 対応方法:
- ネットワークを統一する
- または
docker network connectを使い、コンテナを複数ネットワークに所属させる
5. docker-compose でのネットワーク
-
docker-composeはプロジェクトごとに ユーザー定義 bridge を自動作成。 - そのため、同じ compose 内のサービスは コンテナ名で名前解決可能。
- 特別な設定をしなくてもサービス間通信が容易。