CodeGym /コース /Docker SELF /ネットワーク問題の解消

ネットワーク問題の解消

Docker SELF
レベル 18 , レッスン 2
使用可能

8.1 ネットワーク問題診断の基本ステップ

Dockerのネットワーク問題は、ネットワークの設定ミス、DNS問題、IPアドレスの競合など、さまざまな理由で発生する可能性があります。この講義では、Docker内でのネットワーク問題の診断と解決の基本的な方法を見ていきます。

ネットワーク問題が発生した場合は、次のステップを実行してください:

  1. コンテナとネットワークの状態を確認する
  2. コンテナ内でネットワークツールを使用する
  3. Dockerとネットワークファイルの設定を確認する
  4. Dockerのシステムログを確認する
  5. 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 ファイルが正しく設定されていて、すべてのネットワーク、サービス、およびポートが正しく指定されていることを確認してね。

Yaml

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 の設定が変更されていた場合、その設定を確認してみてね:

JSON

{
  "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 inspectdocker network connectのような、ネットワークを診断/管理するためのコマンドを提供してるよ。

コマンド docker network inspect

このコマンドでは、ネットワークについての詳細、接続されてるコンテナやIPAM設定を確認できるんだ。

ターミナル

docker network inspect <network_name>

docker network inspectコマンドの出力例

JSON

[
    {
        "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設定の確認:

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    dns:
      - 8.8.8.8

コンテナ内のDNS確認:

Terminal

docker exec -it <container_name> cat /etc/resolv.conf

例 2: サービスへのアクセスの問題

コンテナが他のホスト上のサービスにアクセスできない場合:

公開ポートの確認:

Terminal

docker ps

ファイアウォールルールの確認:

必要なポートがファイアウォールルールでブロックされていないことを確認してね。

例 3: IPアドレスの競合

コンテナ間やホストとIPアドレスが競合している場合:

ネットワークのサブネット確認:

Terminal

docker network inspect <network_name>

サブネットの変更:

Terminal

docker network create --subnet=192.168.2.0/24 my_network
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION