CodeGym /Adesua ahorow /Docker SELF /消除網絡問題

消除網絡問題

Docker SELF
等級 18 , 課堂 2
開放

8.1 網絡問題診斷的基本步驟

Docker 的網絡問題可能由不同原因導致,包括錯誤的網絡配置、DNS 問題、IP 地址衝突等。在這堂課裡,我們會討論診斷和解決 Docker 網絡問題的主要方法。

如果遇到網絡問題,需要按照以下步驟執行:

  1. 檢查容器和網絡的狀態
  2. 在容器內使用網絡工具
  3. 檢查 Docker 的配置和網絡文件
  4. 檢查 Docker 的系統日誌
  5. 使用 Docker 網絡命令

8.2 檢查容器和網路的狀態

診斷網路問題的第一步——檢查容器和網路的狀態。

檢查容器的狀態

先顯示所有正在運行的容器。為此使用命令 docker ps:

Terminal

docker ps

如果容器未運行,這可能表示 Docker 本身或容器配置有問題。

檢查網路

命令 docker network ls 顯示 Docker 中創建的所有網路:

Terminal

docker network ls

確認需要的網路是否存在,並且容器是否已連接到該網路。

8.3 在容器內使用網路工具

一些網路工具,比如 pingcurlnetcat(或者 nc),還有 nslookup,可以幫助診斷容器內的問題。每種工具都有自己的特殊用途:

  • ping — 一個用來檢查網路中遠端主機是否可達的工具,通過發送 ICMP 請求。
  • curl — 一個用於通過多種協議傳輸數據的工具,經常用來檢查 Web 服務的可用性。
  • netcat (nc) — 用於處理網路連接的多功能工具,可以創建 TCP/UDP 連接並診斷端口的可達性。
  • nslookup — 查詢 DNS 記錄工具,例如用來檢查容器名稱解析。

使用 ping 示例

連接到容器,使用 ping 工具發送 ICMP 請求來檢查與其他容器或服務的連接:

Terminal

docker exec -it <container_name> ping <target_container_name_or_ip>

使用 curl 示例

使用 curl 工具檢查容器內 Web 服務的可用性:

Terminal

docker exec -it <container_name> curl http://<target_service>

使用 nslookup 示例

使用 nslookup 工具檢查 DNS 名稱解析,這對於診斷網路服務問題很有幫助:

Terminal

docker exec -it <container_name> nslookup <target_container_name>

使用 nc host port 示例

nc 工具用於調試和診斷網路連接。通過命令 nc host port 可以嘗試與指定的主機和端口建立連接,檢查目標主機端口的可用性:

Terminal

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 日誌

使用指令 journalctl 在有 systemd 的系統上檢視 Docker 的日誌:

Terminal

journalctl -u docker.service

檢視容器的日誌

容器的日誌也可以幫助診斷網路問題:

Terminal

docker logs <container_name>

8.6: 使用 Docker 網路指令

Docker 提供了用於診斷與管理網路的指令,例如 docker network inspectdocker network connect

指令 docker network inspect

這個指令可獲取有關網路的詳細資訊,包括已連接的 containers 和 IPAM 的設置。

Terminal

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

如果 container 未正確連接到網路,你可以手動將它連接:

Terminal

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