8.1 Các bước cơ bản để chẩn đoán sự cố mạng
Sự cố mạng trong Docker có thể xảy ra vì nhiều lý do, bao gồm cấu hình mạng không đúng, vấn đề với DNS, xung đột địa chỉ IP và các nguyên nhân khác. Trong bài giảng này, chúng ta sẽ xem xét các phương pháp cơ bản để chẩn đoán và giải quyết sự cố mạng trong Docker.
Nếu gặp sự cố mạng, bạn cần thực hiện các bước sau:
- Kiểm tra trạng thái của containers và mạng
- Sử dụng các công cụ mạng bên trong containers
- Kiểm tra cấu hình của Docker và các file mạng
- Kiểm tra nhật ký hệ thống của Docker
- Sử dụng các lệnh mạng của Docker
8.2 Kiểm tra trạng thái của containers và mạng
Bước đầu tiên trong việc sửa lỗi mạng là kiểm tra trạng thái của containers và mạng.
Kiểm tra trạng thái của containers
Đầu tiên, hãy hiển thị tất cả containers đang chạy. Để làm điều này, sử dụng lệnh docker ps:
docker ps
Nếu containers không chạy, điều này có thể cho thấy có vấn đề với chính Docker hoặc cấu hình của containers.
Kiểm tra mạng
Lệnh docker network ls hiển thị tất cả các mạng được tạo trong Docker:
docker network ls
Hãy đảm bảo rằng mạng cần thiết tồn tại và các containers được kết nối vào mạng đó.
8.3 Sử dụng công cụ mạng trong container
Các công cụ mạng như ping, curl, netcat (hoặc nc), và nslookup, có thể giúp chuẩn đoán sự cố bên trong container. Mỗi công cụ này thực hiện một nhiệm vụ cụ thể:
ping— công cụ kiểm tra kết nối đến host từ xa trong mạng, gửi các yêu cầu ICMP.curl— công cụ truyền dữ liệu qua các giao thức khác nhau, thường được dùng để kiểm tra truy cập đến các dịch vụ web.netcat (nc)— công cụ đa năng cho các kết nối mạng, cho phép tạo kết nối TCP/UDP và kiểm tra khả năng truy cập của cổng.nslookup— công cụ tìm kiếm thông tin về DNS records, ví dụ, kiểm tra phân giải tên container.
Ví dụ sử dụng ping
Kết nối vào container và kiểm tra kết nối đến container hoặc dịch vụ khác, sử dụng công cụ ping để gửi yêu cầu ICMP:
docker exec -it <container_name> ping <target_container_name_or_ip>
Ví dụ sử dụng curl
Kiểm tra truy cập đến dịch vụ web trong container bằng cách dùng công cụ curl:
docker exec -it <container_name> curl http://<target_service>
Ví dụ sử dụng nslookup
Sử dụng nslookup để kiểm tra phân giải tên DNS của các container, rất hữu ích cho việc chuẩn đoán sự cố mạng:
docker exec -it <container_name> nslookup <target_container_name>
Ví dụ sử dụng nc host port
Công cụ nc được dùng để debug và chuẩn đoán kết nối mạng. Với lệnh nc host port, bạn có thể thiết lập kết nối đến một host và cổng cụ thể, kiểm tra khả năng truy cập của cổng trên host mục tiêu:
docker exec -it <container_name> nc -zv 192.168.1.1 22
8.4 Kiểm tra cấu hình Docker và các file mạng
Các cấu hình Docker và file mạng không chính xác có thể gây ra sự cố mạng.
Kiểm tra file docker-compose.yml
Đảm bảo rằng file docker-compose.yml được cấu hình chính xác và tất cả các mạng, dịch vụ và cổng được chỉ định đúng.
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
Kiểm tra file /etc/docker/daemon.json
Kiểm tra cấu hình Docker Daemon, nếu nó đã bị thay đổi:
{
"dns": ["8.8.8.8", "8.8.4.4"],
"fixed-cidr": "192.168.1.0/24"
}
8.5 Kiểm tra nhật ký hệ thống của Docker
Nhật ký hệ thống của Docker có thể chứa thông tin hữu ích về lỗi mạng và các vấn đề khác.
Xem nhật ký Docker
Dùng lệnh journalctl để xem nhật ký Docker trên các hệ thống sử dụng systemd:
journalctl -u docker.service
Xem log của containers
Các log của containers cũng có thể hữu ích trong việc chẩn đoán các vấn đề mạng:
docker logs <container_name>
8.6: Sử dụng các lệnh mạng của Docker
Docker cung cấp các lệnh để chẩn đoán và quản lý mạng, chẳng hạn như docker network inspect và docker network connect.
Lệnh docker network inspect
Lệnh này cho phép bạn nhận thông tin chi tiết về mạng, bao gồm các container được kết nối và cài đặt IPAM.
docker network inspect <network_name>
Ví dụ output lệnh 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": {}
}
]
Lệnh docker network connect
Nếu container bị kết nối sai với mạng, bạn có thể kết nối lại thủ công:
docker network connect <network_name> <container_name>
8.7 Ví dụ chuẩn đoán và giải quyết vấn đề
Ví dụ 1: Vấn đề với DNS chuyển đổi tên miền sang IP
Nếu các container không thể chuyển đổi tên host của container khác, hãy kiểm tra cài đặt DNS:
Kiểm tra cài đặt DNS trong docker-compose.yml:
version: '3.8'
services:
web:
image: nginx:latest
dns:
- 8.8.8.8
Kiểm tra DNS trong container:
docker exec -it <container_name> cat /etc/resolv.conf
Ví dụ 2: Vấn đề truy cập vào dịch vụ
Nếu các container không thể truy cập vào dịch vụ trên host khác:
Kiểm tra cổng đã public:
docker ps
Kiểm tra quy tắc firewall:
Hãy đảm bảo rằng các quy tắc firewall không chặn các cổng cần thiết.
Ví dụ 3: Xung đột địa chỉ IP
Nếu bạn có xung đột địa chỉ IP giữa các container hoặc với host:
Kiểm tra subnet của mạng:
docker network inspect <network_name>
Thay đổi subnet:
docker network create --subnet=192.168.2.0/24 my_network
GO TO FULL VERSION