はじめに
Docker のネットワーク機能は、コンテナ間やホストとの通信を管理するために提供されています。
用途に応じたネットワークモードを選択することで、安全かつ効率的な通信を実現できます。
本記事では、Docker のネットワークタイプや管理方法について解説します。
書こうと思ったきっかけ
Docker を使う中で、コンテナ間の通信がうまくいかないことがありました。
また、ネットワーク設定によって動作が変わることを知り、理解を深める必要があると感じました。
そこで、Docker のネットワークの種類や管理方法を整理しておくことにしました。
Dockerのネットワークタイプ
Dockerには以下の主要なネットワークモードがあります。
① bridge(デフォルト)
- コンテナは仮想ブリッジ(
docker0
)を介して通信する。 - コンテナ同士は同じブリッジネットワーク内で通信可能。
- 外部ネットワークと通信するには、ポートフォワードが必要(
-p
オプション)。
使用例:
docker network create my_bridge
docker run -d --name container1 --network my_bridge nginx
docker run -d --name container2 --network my_bridge alpine ping container1
② host
- コンテナがホストのネットワークを直接使用する。
-
localhost
でコンテナのサービスにアクセス可能。 - コンテナ間の分離がないため、セキュリティ上のリスクがある。
使用例:
docker run --rm --network host nginx
③ none
- ネットワークを完全に無効化し、外部との通信を遮断する。
使用例:
docker run --rm --network none alpine
Dockerネットワークの管理コマンド
Dockerネットワークを操作するための主なコマンドを紹介します。
ネットワークの一覧表示
docker network ls
ネットワークの詳細情報
docker network inspect <network_name>
ネットワークの作成
docker network create <network_name>
ネットワークの削除
docker network rm <network_name>
コンテナをネットワークに接続
docker network connect <network_name> <container_name>
コンテナをネットワークから切断
docker network disconnect <network_name> <container_name>
Docker Compose でのネットワーク設定
Docker Compose を使うと、複数のコンテナを簡単にネットワークで接続できます。
docker-compose.yml
の例:
version: '3'
services:
web:
image: nginx
networks:
- my_network
app:
image: my_app
networks:
- my_network
networks:
my_network:
driver: bridge
ネットワークのトラブルシューティング
コンテナ間で通信できない
-
docker network inspect <network_name>
でコンテナが適切なネットワークに接続されているか確認。 -
iptables
の設定を確認 (sudo iptables -L -n
)
ホストからコンテナに接続できない
-
docker run -p 8080:80 nginx
のようにポートフォワード設定が正しいか確認。 -
docker ps
で実行中のコンテナのポートを確認。
DNS 解決ができない
-
docker run --rm busybox nslookup google.com
で外部DNSが解決できるかテスト。 -
--dns
オプションを使って手動で設定可能:
docker run --rm --dns 8.8.8.8 busybox nslookup google.com
まとめ
Dockerのネットワークは用途に応じて適切なものを選ぶことが重要です。特に、bridge
は一般的に使われるモードですが、host
はパフォーマンスの面で有利な場合もあります。
ネットワークモード | 特徴 |
---|---|
bridge |
デフォルト、コンテナ同士の通信可、ポートマッピング必要 |
host |
ホストのネットワークを使用、ポートマッピング不要 |
none |
ネットワークなし、完全に孤立 |
none
は完全にネットワークを遮断したい場合に便利です。
この違いを使いこなせるようになるまで時間がかかるかもしれませんが、私も積極的にアウトプットしながら、体系的にまとめていきます!