8.1 ネットワーク問題診断の基本ステップ
Dockerのネットワーク問題は、ネットワークの設定ミス、DNS問題、IPアドレスの競合など、さまざまな理由で発生する可能性があります。この講義では、Docker内でのネットワーク問題の診断と解決の基本的な方法を見ていきます。
ネットワーク問題が発生した場合は、次のステップを実行してください:
- コンテナとネットワークの状態を確認する
- コンテナ内でネットワークツールを使用する
- Dockerとネットワークファイルの設定を確認する
- Dockerのシステムログを確認する
- Dockerのネットワークコマンドを使用する
8.2 コンテナとネットワークの状態確認
ネットワーク問題を診断するときの最初のステップは、コンテナとネットワークの状態を確認することだよ。
コンテナの状態確認
まず、すべての実行中のコンテナを表示しよう。このためには、docker ps
コマンドを使うよ:
docker ps
コンテナが実行されていない場合、Docker自体やコンテナ構成に問題がある可能性があるんだ。
ネットワークの状態確認
docker network ls
コマンドはDockerで作成されたすべてのネットワークを表示してくれるよ:
docker network ls
必要なネットワークが存在し、コンテナがそれに接続されていることを確認しよう。
8.3 コンテナ内でのネットワークユーティリティの使用
ネットワークユーティリティ、例えば ping
, curl
, netcat
(または nc
)、nslookup
などは、コンテナ内の問題を診断するのに役立つよ。それぞれのユーティリティには特定のタスクがあるんだ:
ping
- ネットワーク内のリモートホストの到達性を確認するユーティリティ。ICMPリクエストを送信する。curl
- 様々なプロトコルでデータを送受信するツール。ウェブサービスの到達性を確認するのによく使われるよ。netcat (nc)
- ネットワーク接続に関する作業に使える便利なツール。TCP/UDP接続を作成したり、ポートの到達性を診断したりできる。nslookup
- DNSレコードの情報を検索するユーティリティ。例えば、コンテナの名前解決を確認するのに便利だよ。
ping
の使用例
コンテナに接続して、他のコンテナやサービスとの通信を確認するために ping
ユーティリティを使ってICMPリクエストを送信してみよう:
docker exec -it <container_name> ping <target_container_name_or_ip>
curl
の使用例
コンテナ内でウェブサービスの到達性を確認するために curl
ユーティリティを使う:
docker exec -it <container_name> curl http://<target_service>
nslookup
の使用例
nslookup
を使ってコンテナのDNS名前解決を確認するのもいいね。ネットワークサービスのトラブルシューティングに役立つよ:
docker exec -it <container_name> nslookup <target_container_name>
nc host port
の使用例
nc
ツールはネットワーク接続のデバッグや診断に使えるんだ。nc host port
コマンドを使うと、特定のホストやポートへの接続を確認して、そのポートがターゲットホストで使用可能か確認できる:
docker exec -it <container_name> nc -zv 192.168.1.1 22
8.4 Dockerとネットワークファイルの設定確認
Dockerやネットワークファイルの設定ミスはネットワーク問題を引き起こす可能性があるよ。
ファイル docker-compose.yml
の確認
docker-compose.yml
ファイルが正しく設定されていて、すべてのネットワーク、サービス、およびポートが正しく指定されていることを確認してね。
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- webnet
db:
image: postgres:latest
ports:
- "5432:5432"
networks:
- webnet
networks:
webnet:
driver: bridge
ファイル /etc/docker/daemon.json
の確認
Docker Daemon
の設定が変更されていた場合、その設定を確認してみてね:
{
"dns": ["8.8.8.8", "8.8.4.4"],
"fixed-cidr": "192.168.1.0/24"
}
8.5 Dockerシステムログの確認
Dockerのシステムログには、ネットワークエラーや問題に関する有益な情報が含まれていることがあるよ。
Dockerログの確認
systemd
を使ったシステムでjournalctl
コマンドを使ってDockerログを確認しよう:
journalctl -u docker.service
コンテナログの確認
コンテナのログもネットワーク問題の診断に役立つよ:
docker logs <container_name>
8.6: Dockerネットワークコマンドの使用
Dockerはdocker network inspect
やdocker network connect
のような、ネットワークを診断/管理するためのコマンドを提供してるよ。
コマンド docker network inspect
このコマンドでは、ネットワークについての詳細、接続されてるコンテナやIPAM設定を確認できるんだ。
docker network inspect <network_name>
docker network inspect
コマンドの出力例
[
{
"Name": "webnet",
"Id": "e5e5e1b1a3e5",
"Created": "2021-01-01T00:00:00.000000000Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Containers": {
"container_id": {
"Name": "web",
"EndpointID": "6c52f8c75c1e",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
コマンド docker network connect
コンテナが誤ってネットワークに接続されてた場合、自分で手動で接続することができるよ:
docker network connect <network_name> <container_name>
8.7 診断と問題解決の例
例 1: DNS
によるドメイン名からIPへの変換の問題
コンテナが他のコンテナのホスト名を変換できない場合、DNS
設定を確認してね:
docker-compose.ymlでのDNS
設定の確認:
version: '3.8'
services:
web:
image: nginx:latest
dns:
- 8.8.8.8
コンテナ内のDNS
確認:
docker exec -it <container_name> cat /etc/resolv.conf
例 2: サービスへのアクセスの問題
コンテナが他のホスト上のサービスにアクセスできない場合:
公開ポートの確認:
docker ps
ファイアウォールルールの確認:
必要なポートがファイアウォールルールでブロックされていないことを確認してね。
例 3: IPアドレスの競合
コンテナ間やホストとIPアドレスが競合している場合:
ネットワークのサブネット確認:
docker network inspect <network_name>
サブネットの変更:
docker network create --subnet=192.168.2.0/24 my_network
GO TO FULL VERSION