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
— 一個用於通過多種協議傳輸數據的工具,經常用來檢查 Web 服務的可用性。netcat (nc)
— 用於處理網路連接的多功能工具,可以創建 TCP/UDP 連接並診斷端口的可達性。nslookup
— 查詢 DNS 記錄工具,例如用來檢查容器名稱解析。
使用 ping
示例
連接到容器,使用 ping
工具發送 ICMP 請求來檢查與其他容器或服務的連接:
docker exec -it <container_name> ping <target_container_name_or_ip>
使用 curl
示例
使用 curl
工具檢查容器內 Web 服務的可用性:
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 日誌
使用指令 journalctl
在有 systemd
的系統上檢視 Docker 的日誌:
journalctl -u docker.service
檢視容器的日誌
容器的日誌也可以幫助診斷網路問題:
docker logs <container_name>
8.6: 使用 Docker 網路指令
Docker 提供了用於診斷與管理網路的指令,例如 docker network inspect
和 docker network connect
。
指令 docker network inspect
這個指令可獲取有關網路的詳細資訊,包括已連接的 containers 和 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
如果 container 未正確連接到網路,你可以手動將它連接:
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