+14

Docker Networking - Những khái niệm và cách sử dụng cơ bản

Chào mọi người, hôm nay chúng ta cùng tìm hiểu về một khía cạnh của Docker - Docker networking

Dù đã tìm hiểu về Docker một thời gian nhưng khi được hỏi về network của docker thì mình vẫn cảm thấy khá khó để giải thích cho cặn kẽ, vì thế nên hôm nay mình viết bài viết này để tổng hợp lại những kiến thức về Docker Network.

Tổng quan

Một trong những điểm mạnh của Docker đó là tính đóng gói, với Docker chúng ta có thể gói gọn một ứng dụng vào một container thông qua việc build một image. Đằng sau đó là rất nhiều thứ cấu thành nên tính đóng gói này, một trong số đó là Docker network.

Docker network sẽ đảm nhiệm nhiệm vụ kết nối mạng giữa các container với nhau, kết nối giữa container với bên ngoài, cũng như kết nối giữa các cụm (swarm) docker containers.

Với container và service của Docker, bạn có thể kết nối chúng lại với nhau hoặc kết nối chúng với các mạng khác nằm ngoài docker.

Các container Docker thậm chí không cần phải biết rằng chúng được triển khai trên Docker, hoặc liệu các tiến trình khác mà nó đang giao tiếp với chúng có phải là khối lượng công việc của Docker hay không. Cho dù máy chủ Docker của bạn chạy Linux, Windows hoặc kết hợp cả hai, bạn có thể sử dụng Docker để chạy theo cách không cần quan tâm đến nền tảng đang sử dụng.

Dưới góc nhìn của một beginner docker, bài viết hôm nay mình sẽ tổng hợp về Docker network basic và một vài điểm lưu ý khi sử dụng Docker network mà mình tìm hiểu được (go).

Các loại network drivers của Docker

Hệ thống network Docker là dạng plugable, sử dụng drivers. Hầu hết các driver được cung cấp mặc định, với các chức năng cốt lõi của các chức năng mạng thông thường.

Docker network có thể cung cấp hầu hết các chức năng mà một hệ thống mạng bình thường cần có.

- BRIDGE

Đây là driver mạng default của Docker. Nếu không chỉ định driver thì bridge sẽ là driver mạng mặc định khi khởi tạo.

Khi chúng ta cài đặt Docker, virtual bridge docker0 sẽ được tạo ra, docker tìm một subnet chưa được dùng trên host và gán một địa chỉ cho docker0

$ ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:c4:7d:f6:13  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Bridge network thường được sử dụng khi cần chạy ứng dụng dưới dạng các container độc lập cần giao tiếp với nhau. Các container trong cùng mạng có thể giao tiếp với nhau qua địa chỉ IP. Docker không hỗ trợ nhận diện host ở mạng này, vì vậy muốn connect thì phải dùng options links để docker có thể hiểu được địa chỉ của các service.

Bridge là driver tốt nhất cho việc giao tiếp multiple containers ở một host đơn.

- HOST

Dùng khi container cần giao tiếp với host và sử dụng luôn mạng ở host, vì sử dụng mạng của máy chủ đang chạy nên không còn lớp mạng nào giữa container với Docker Host phù hợp khi cần connect từ container ra thẳng ngoài host

- OVERLAY

Mạng lớp phủ - Overlay network tạo một mạng phân tán giữa nhiều máy chủ Docker. Kết nối nhiều Docker daemons với nhau và cho phép các cụm services giao tiếp với nhau. Chúng ta có thể sử dụng overlay network để giao tiếp dễ dàng giữa cụm các services với một container độc lập, hay giữa 2 container với nhau ở khác máy chủ Docker daemons.

Nhờ Overlay network, không cần các công việc thiết lập routing giữa các container thông qua hệ điều hành. Overlay network tạo nên một lớp phủ trên mạng của máy chủ và cho phép container kết nối đến (bao gồm cả các cụm containers) để giao tiếp một cách bảo mật. Docker đảm bảo định tuyến các gói tin đến và đi đúng container đích.

- MACVLAN

Mạng Macvlan cho phép chúng ta gán địa chỉ MAC cho container, điều này làm cho mỗi container như là một thiết bị vật lý trong mạng. Docker daemon định tuyến truy cập tới container bởi địa chỉ MAC. Sử dụng driver macvlan là lựa chon tốt khi các ứng dụng khác cần phải connect đến theo địa chỉ vật lý hơn là thông qua các lớp mạng của máy chủ.

- NONE

Với container không cần networking hoặc cần disable đi tất cả mọi networking, chúng ta sẽ chọn driver này. Thường được dùng với mạng tùy chỉnh. Driver này không thể dùng trong cụm swarm.

Một vài cách sử dụng docker network

Khởi tạo một docker network

$ docker network create [OPTIONS] NETWORK
$ docker network create -d bridge my-bridge-network

Trong đó options -d là driver, để tạo mạng overlay thì có thể dùng -d overlay Ngoài ra thì còn nhiều options để tùy vào mức độ custom mà chúng ta có thể thêm vào, nhiều số trong này mình không thực sự hiểu hết, chỉ quan tâm một đến vài options

--gateway: Địa chỉ Ip của Gateway (IPv4 hay IPv6) cho mạng con
--ip-range: Xác định một dải IPs sử  dụng trong mạng
--internal: Hạn chế  access từ bên ngoài vào mạng
--ipv6: Bật IPv6
--subnet: Chọn mạng con

Ví dụ: Khởi tạo mạng với driver bridge có subnet 10.11.0.0/16, ip gateway là 10.11.0.1

$ docker network create -d bridge  --subnet=10.11.0.0/16 --gateway=10.11.0.1  my-bridge-net
$ docker network inspect my-bridge-net
[
    {
        "Name": "my-bridge-net",
        "Id": "877846e542d208a526e6d02025d99332e8d5a07a667003ca457c5477e10e232b",
        "Created": "2020-07-22T08:59:10.373614208+07:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.11.0.0/16",
                    "Gateway": "10.11.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

Sử dụng network khi chạy một container

Sử dụng option --network để chạy một container trên network bridge đó

docker run --network=bridge -itd --name=container1 normal-app:dev

Sử dụng network qua docker-compose

Khi dùng docker-compose thì nếu không khai báo network, docker sẽ tự động khởi tạo một mạng dành cho app và driver sẽ là bridge.

$ docker-compose up
Creating network "api_default" with the default driver

Lúc này kiểm tra danh sách network sẽ có network mà docker-compose vừa tạo

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
4bdb10fc8926        api_default         bridge              local
72550e811311        bridge              bridge              local
74548f1aa34c        host                host                local
125591bf59af        none                null                local
bd9d957fec97        normalapp_default   bridge              local

Và khi dừng app thì docker sẽ xóa mạng này

$ docker-compose down
Stopping api_api_1       ... done
Stopping api_redis-api_1 ... done
Stopping api_db_1        ... done
Removing api_api_1       ... done
Removing api_redis-api_1 ... done
Removing api_db_1        ... done
Removing network api_default

Nếu muốn khai báo mạng cho từng containers trong một cụm chúng ta có thể dùng 2 cách sau:

  • Khai báo driver host cho container app qua network_mode, cách khai báo này có thể thay đổi driver cho container

Trường hợp chúng ta muốn app sử dụng luôn mạng của host mà không dùng mạng docker, hãy khai báo như sau:

services:
  app:
    network_mode: host
  • Khai báo qua networks trong docker-compose.yml
...
services:
  app:
    networks:
      - api-net
...
networks:
  api-net:
    driver: host

Sử dụng network trong cụm docker swarm

Docker swarm thường sử dụng file docker-compose.yml để deploy, và trong file này cần lựa chọn mạng overlay để docker có thể connect multiple networks host với nhau.

...
services:
  app:
    networks:
      - api-net
...
networks:
  api-net:
    driver: overlay

Xóa network

docker network rm my-bridge-network

Kết

Như vậy là mình vừa trình bày về các loại docker network và một vài điểm cần lưu ý khi sử dụng docker network. Cảm ơn mọi người đã theo dõi bài viết. Hy vọng bài viết sẽ có ích cho ai đang tìm hiểu về docker.

Tham khảo: https://docs.docker.com/network


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí