Sunday, September 29, 2024

[Docker] Phần 4 – Network trong Docker

-

1. Mở Đầu.

Sau khi tìm hiểu cách cài đặt Docker, quản lý container và chia sẻ dữ liệu giữa Docker Host và Container, chúng ta sẽ tiến xa hơn bằng cách khám phá phần 4 về Network trong Docker. Network là một khía cạnh quan trọng trong việc triển khai và quản lý các ứng dụng trong môi trường Docker. Trong phần này, chúng ta sẽ tìm hiểu cách tạo và quản lý mạng trong Docker để kết nối các container với nhau và với mạng bên ngoài.

Trong phần này, chúng ta sẽ tìm hiểu cách tạo và quản lý mạng trong Docker. Điều này bao gồm việc tạo ra các mạng mà các container có thể kết nối vào, cấu hình các tùy chọn mạng cho container và kết nối các container với nhau và với mạng bên ngoài.

Lưu ý:
Để thực hiện các thao tác liên quan đến Docker, hãy đảm bảo bạn đã cài đặt Docker trên hệ thống của mình.

2. Network trong Docker.

Docker cho phép bạn tạo ra một network (giao tiếp mạng), sau đó các container kết nối vào network. Khi các container cùng một network thì chúng có thể liên lạc với nhau nhanh chóng qua tên của container và cổng (port) được lắng nghe của container trên mạng đó.

Các network được tạo ra theo một driver nào đó như bridge, none, overlay, macvlan. Trong phần này sẽ sử dụng đến bridge network: nó cho phép các container cùng network này liên lạc với nhau, cho phép gửi gói tin ra ngoài. Tạo một bridge network với tên network là name-network.

$ docker network create --driver bridge name-network
4e9227b81f0e447e58a85b680154ee958874ee8a5bfbc06cd329e5bc8dfcb9a8

Để liệt kê các network đang có:

$ docker network ls
NETWORK ID     NAME           DRIVER    SCOPE
73bee629bd83   bridge         bridge    local
7f4ff6085734   host           host      local
4e9227b81f0e   name-network   bridge    local
8f30acae807c   none           null      local

Khi tạo một container, ấn định nó nối vào network có tên là name-network thì thêm vào tham số –network name-network trong lệnh docker run. Khi một container có tên name-container đã được tạo, để thiết lập nó nối vào network có tên name-network.

docker run -it -d --name=pushgateway --network=name-network prom/pushgateway

3. Cổng – Port trong Docker.

Các kết nối mạng thông qua các cộng, để thiết lập cấu hình các cổng của container chú ý: có cổng bên trong container, có cổng mở ra bên ngoài (public), có giao thức của cổng (tpc, udp). Khi chạy container (tạo) cần thiết lập cổng thì đưa vào lệnh docker run tham số dạng sau:

docker run -p public-port:target-port/protocol ... 
  • public-port : cổng public ra ngoài (ví dụ 808080 …), các kết nối không cùng network đến container phải thông qua cổng này.
  • target-port : cổng bên trong container, cổng public-port sẽ ánh xạ vào cổng này. Nếu các container cùng network có thể kết nối với nhau thông qua cổng này.

Ví dụ:

docker run -it -d -p 9099:9090 --name=prometheus prom/prometheus

Container prometheus đã chạy và được expose từ cổng 9090 của container -> 9099 của máy host

$ docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                                       NAMES
2509eaf66624   prom/prometheus   "/bin/prometheus --c…"   8 seconds ago   Up 8 seconds   0.0.0.0:9099->9090/tcp, :::9099->9090/tcp   prometheus

Khi list các port đang được lắng nghe ta thấy port 9099 đã lắng nghe trên máy host

$ netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:37749         0.0.0.0:*               LISTEN      3194/node           
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      1027/systemd-resolv 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2476/sshd           
tcp        0      0 0.0.0.0:9099            0.0.0.0:*               LISTEN      12347/docker-proxy  
tcp6       0      0 :::22                   :::*                    LISTEN      2476/sshd           
tcp6       0      0 :::9099                 :::*                    LISTEN      12354/docker-proxy

Máy host của chúng ta đang nắm giữ ip 192.168.13.206

$ ifconfig | grep 192.168.13
        inet 192.168.13.206  netmask 255.255.254.0  broadcast 192.168.13.255

Bạn sử dụng 1 máy tính có kết nối đến máy host và dùng trình duyệt web vào url http://192.168.13.206:9099, bạn sẽ có kết quả như dưới

3. Cách kết nối dịch vụ giữa nhiều container

Hãy list các container đang chạy, chúng ta có

$ docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED              STATUS              PORTS                                       NAMES
87f69f7d354e   prom/pushgateway   "/bin/pushgateway"       About a minute ago   Up About a minute   9091/tcp                                    pushgateway
2509eaf66624   prom/prometheus    "/bin/prometheus --c…"   9 minutes ago        Up 9 minutes        0.0.0.0:9099->9090/tcp, :::9099->9090/tcp   prometheus

Kiểm tra ip container pushgateway ta có ip 172.18.0.2/16

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
39: eth0@if40: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

Kiểm tra ip container prometheus ta có ip 172.17.0.3/16

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
35: eth0@if36: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

Với kết quả trên, 2 container đang có 2 ip với 2 subnet khác nhau nên chúng không thể kết nối với nhau được, muốn kết nối 2 container này lại với nhau ta phải cho chúng connect chung 1 network. Hiện tại container pushgateway đang kết nối vào name-network. Như vậy mình sẽ cho container prometheus kết nối vào name-network chung với container pushgateway bằng lệnh dưới.

docker network connect name-network prometheus

Bây giờ bạn hãy vào container prometheus kiểm tra ip ta thấy container prometheus có thêm 1 network mới và được gắn vào ip mới là 172.18.0.3/16, ip này có subnet chung với container pushgateway.

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
35: eth0@if36: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
41: eth1@if42: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever

Hãy thử đứng tại container prometheus check icmp đến container pushgateway, ta có kết quả.

$ ping pushgateway
PING pushgateway (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.092 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.074 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.106 ms
64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.103 ms
64 bytes from 172.18.0.2: seq=4 ttl=64 time=0.105 ms
64 bytes from 172.18.0.2: seq=5 ttl=64 time=0.088 ms
^C
--- pushgateway ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 0.074/0.094/0.106 ms

Lưu ý: Bạn có thể sử dụng tên của container thay cho ip nhé.

Nếu ping bằng tên của container mà gặp lỗi dưới thì bạn hãy vào container bằng lệnh này nhé “docker exec -it -u 0 prometheus sh”

$ ping pushgateway
PING pushgateway (172.18.0.2): 56 data bytes
ping: permission denied (are you root?)

Như vậy network của 2 container đã thông, chúng ta hãy thử thêm targets của pushgateway vào prometheus bằng cách sau.

Hãy vào container prometheus và chỉnh sử file prometheus.yml với nội dung dưới.

cat > /etc/prometheus/prometheus.yml << OEF
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ["prometheus:9090"]

  - job_name: 'pushgateway'
    honor_labels: true
    static_configs:
      - targets: ["pushgateway:9091"]
OEF

Bạn có thể restart lại container prometheus để thay đổi có hiệu lực

$ docker restart prometheus

Và đây là kết quả

Chúc các bạn thành công

4. Kết Luận.

Network là một phần quan trọng trong việc triển khai và quản lý các ứng dụng trong môi trường Docker. Trong phần này, chúng ta đã tìm hiểu cách tạo và quản lý mạng trong Docker để kết nối các container với nhau và với mạng bên ngoài. Hi vọng rằng kiến thức này sẽ giúp bạn tận dụng toàn bộ tiềm năng của Docker trong việc phát triển và quản lý ứng dụng của mình.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories