CodeGym /Các khóa học /Docker SELF /Khắc phục sự cố mạng

Khắc phục sự cố mạng

Docker SELF
Mức độ , Bài học
Có sẵn

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:

  1. Kiểm tra trạng thái của containers và mạng
  2. Sử dụng các công cụ mạng bên trong containers
  3. Kiểm tra cấu hình của Docker và các file mạng
  4. Kiểm tra nhật ký hệ thống của Docker
  5. 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:

Terminal

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:

Terminal

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:

Terminal

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:

Terminal

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:

Terminal

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:

Terminal

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.

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

Kiểm tra file /etc/docker/daemon.json

Kiểm tra cấu hình Docker Daemon, nếu nó đã bị thay đổi:

JSON

{
  "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:

Terminal

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:

Terminal

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 inspectdocker 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.

Terminal

docker network inspect <network_name>

Ví dụ output lệnh 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": {}
    }
]

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:

Terminal

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:

Yaml

version: '3.8'

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

Kiểm tra DNS trong container:

Terminal

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:

Terminal

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:

Terminal

docker network inspect <network_name>

Thay đổi subnet:

Terminal

docker network create --subnet=192.168.2.0/24 my_network
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION