Quay lại

Bài 5: Hệ thống Network của Docker Chuyên mục Docker    2023-12-02    48 Lượt xem    45 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Bài 5: Hệ thống Network của Docker


Hệ thống Network của Docker hoạt động thế nào?

Khi bạn cài đặt Docker trên hệ điều hành, Docker sẽ tạo ra một mạng bridge ảo có tên là docker0. Bridge này có vai trò quan trọng trong việc kết nối các container với mạng bên ngoài và với các container khác trên cùng một host, docker tìm một subnet chưa được dùng trên host và gán một địa chỉ cho docker0. 

Dải mạng mặc định của docker0 là 172.17.0.0/16.


Dưới đây là một số lý do tại sao Docker sử dụng bridge docker0:

  1. Isolation:

    • Bridge docker0 giúp tạo ra một môi trường cô lập cho mỗi container. Mỗi container có địa chỉ IP riêng và có thể giao tiếp với các container khác thông qua bridge này.
  2. Network Address Translation (NAT):

    • Bridge docker0 thường được sử dụng để thực hiện NAT. Các container sẽ được gán địa chỉ IP nội bộ và NAT sẽ giúp chúng truy cập mạng bên ngoài thông qua địa chỉ IP của host.
  3. Connectivity:

    • Bridge docker0 giúp kết nối các container với mạng host và mạng bên ngoài. Nó cho phép container truy cập Internet và giao tiếp với các service khác trên cùng một host.
  4. Default Network for Containers:

    • Khi bạn chạy một container mà không chỉ định mạng cụ thể, container đó sẽ tự động kết nối vào bridge docker0. Điều này giúp đơn giản hóa quá trình triển khai và cấu hình mạng cho container.
  5. IP Address Management:

    • Bridge docker0 thường quản lý việc cấp phát địa chỉ IP cho các container. Các container có thể có địa chỉ IP tĩnh hoặc được cấp động động tùy thuộc vào cấu hình.
  6. Container-to-Container Communication:

    • Bridge docker0 hỗ trợ giao tiếp giữa các container trên cùng một host. Các container có thể giao tiếp với nhau thông qua địa chỉ IP nội bộ được gán bởi bridge này.

Tóm lại, bridge docker0 đóng vai trò quan trọng trong việc quản lý và kết nối mạng cho các container Docker, tạo ra môi trường cô lập và đảm bảo tính chắc chắn của các container khi chúng giao tiếp với mạng bên ngoài và với nhau.

Các mode của card mạng trong Docker

Trong Docker, có một số mode khác nhau cho việc kết nối mạng giữa các container và giữa container và host. Dưới đây là một số mode phổ biến của card mạng trong Docker:

Bridge mode (mặc định):

Mode Bridge trong Docker Network là một trong những chế độ mạng mặc định khi bạn chạy một container. Dưới đây là một số chi tiết liên quan đến Bridge mode:

  1. Chức năng:

    • Bridge mode được sử dụng để tạo ra một network nội bộ trong Docker, trong đó mỗi container được gán một địa chỉ IP duy nhất.
    • Container trong cùng một bridge network có thể giao tiếp với nhau thông qua địa chỉ IP của container hoặc thông qua tên container.
    • Bridge mode cũng cho phép container kết nối với bên ngoài mạng thông qua một cổng được ánh xạ từ host.
  2. Cấu hình:

    • Khi một container được chạy mà không có option mạng cụ thể được chỉ định, nó sẽ tự động được kết nối vào bridge network mặc định của Docker.
    • Tên của bridge network mặc định thường là bridge.
  3. Địa chỉ IP:

    • Mỗi container được gán một địa chỉ IP trong dải của bridge network.
    • Các container có thể được tham chiếu thông qua địa chỉ IP của chúng hoặc thông qua tên container.
  4. Cổng Ánh xạ (Port Mapping):

    • Các container có thể ánh xạ các cổng từ container đến host để cho phép bên ngoài truy cập các dịch vụ của container.
    • Sử dụng -p hoặc --publish khi chạy container để ánh xạ cổng, ví dụ: -p 8080:80 sẽ ánh xạ cổng 80 trong container vào cổng 8080 trên host.
    docker run -p 8080:80 my-container​
  5. Đặc điểm Khác:

    • Bridge mode được sử dụng cho các ứng dụng độc lập hoặc microservices trong Docker.
    • Mặc định, bridge network không có khả năng kết nối các container giữa các host khác nhau.
    • Các container trong bridge network có thể được liên kết thông qua DNS theo tên container.

Nói chung, khi bạn chạy một container mà không chỉ định một mode mạng cụ thể, Docker thường sẽ sử dụng bridge mode như một môi trường mạng mặc định.

Các bạn có thể hình dung qua hình ảnh sau:

  • Bridge Network tạo ra một cây cầu trên Docker Host để đạt được mục đích cho phép container kết nối với bên ngoài. Thông qua cây cầu này, các container của cùng một cây cầu có thể giao tiếp với nhau và trình điều khiển cầu docker sẽ tự động được đặt trên máy chủ. Quy tắc tương ứng (iptables, không gian tên mạng) cho phép mạng của bộ chứa được sử dụng chính xác.
  • Bridge Network được sử dụng để xử lý giao tiếp giữa các container đang chạy trên một trình docker daemon duy nhất. Nếu bạn muốn giao tiếp các container trên nhiều server khác nhau, bạn phải sử dụng overlay network.

Mode HOST:

Chế độ mạng "host" trong Docker Network là một trong những cách để container chia sẻ namespace mạng với host. Điều này có nghĩa là container sẽ sử dụng cùng namespace mạng với host và sẽ không có địa chỉ IP riêng. Container sẽ chia sẻ địa chỉ IP của host, và bất kỳ port mà container lắng nghe sẽ được ánh xạ trực tiếp từ container đến host, không cần port mapping.


Có thể bạn chưa biết:
Một namespace mạng là một cơ chế trong hệ thống máy tính để cô lập và quản lý các tài nguyên mạng, như địa chỉ IP, bảng định tuyến, giao diện mạng, v.v. Mục đích chính của việc sử dụng namespace mạng là để tạo ra các môi trường mạng ảo độc lập trên cùng một hệ thống vật lý.


Dưới đây là cách chạy một container với chế độ mạng "host":

docker run --network host my-container

Trong chế độ này, container có thể truy cập tất cả các dịch vụ và cổng mà host có thể truy cập, và mọi thay đổi vào mạng trong container sẽ phản ánh ngay lập tức trong namespace mạng của host và ngược lại.

Ưu điểm của chế độ "host" bao gồm hiệu suất cao vì không có overhead của việc ánh xạ port và container có thể truy cập các dịch vụ trên host mà không cần port mapping. Tuy nhiên, điều này cũng có nghĩa là container có thể ảnh hưởng đến các dịch vụ trên host nếu chúng chia sẻ cùng một cổng.

Lưu ý rằng chế độ "host" không hỗ trợ chạy nhiều container trên cùng một cổng, do đó nếu bạn cần chạy nhiều container và cả chúng đều cần lắng nghe trên cùng một cổng, bạn nên xem xét các giải pháp khác như sử dụng chế độ "bridge" và ánh xạ cổng.

Note: Là card mạng của container khiến container sử dụng card của HOST chạy container, khi container chạy network mode này thì không thể add thêm driver loại khác nữa. Nên khi chạy 1 container sử dụng mode này, chúng ta sẽ quan tâm đến việc gán card host này cho container.

Mode Overlay:

Chế độ mạng "overlay" trong Docker được sử dụng chủ yếu khi bạn làm việc với Docker Swarm, một công nghệ có sẵn trong Docker để triển khai và quản lý các ứng dụng chia tách trên nhiều host. Chế độ mạng "overlay" cho phép các container chạy trên các host khác nhau trong một Docker Swarm có thể giao tiếp với nhau như chúng đang chạy trên cùng một máy.

Dưới đây là cách tạo và sử dụng một mạng overlay trong Docker Swarm:

1. Tạo một Docker Swarm (nếu chưa có):

docker swarm init​

2. Tạo một mạng overlay:

docker network create --driver overlay my-overlay-network​

3. Chạy container và liên kết với mạng overlay:

docker service create --network my-overlay-network --name my-service my-image​

4. Xem thông tin chi tiết về mạng overlay:

docker network inspect my-overlay-network​

Trong đoạn lệnh trên:

  • docker swarm init: Khởi tạo một Docker Swarm nếu chưa có.

  • docker network create --driver overlay my-overlay-network: Tạo một mạng overlay với tên là "my-overlay-network".

  • docker service create --network my-overlay-network --name my-service my-image: Chạy một service với tên là "my-service" và liên kết nó với mạng overlay "my-overlay-network".

  • docker network inspect my-overlay-network: Xem thông tin chi tiết về mạng overlay, bao gồm các container và dịch vụ liên quan.

Khi bạn sử dụng mạng overlay trong Docker Swarm, các container có thể giao tiếp với nhau dựa trên tên dịch vụ thay vì địa chỉ IP, và Docker Swarm sẽ tự động quản lý việc định tuyến các gói tin giữa các host khác nhau. Điều này giúp đơn giản hóa việc triển khai ứng dụng phân tán trong môi trường Docker Swarm.

Note : 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:

macvlan là một trong những driver mạng có sẵn trong Docker, cho phép container có địa chỉ MAC và địa chỉ IP nằm trên cùng một mạng với card mạng thực của host. Khi bạn sử dụng macvlan, mỗi container sẽ có địa chỉ IP duy nhất và có thể giao tiếp trực tiếp với các thiết bị trong mạng vật lý mà host kết nối.

Dưới đây là cách sử dụng macvlan trong Docker:

1. Tạo một macvlan network:

docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=<physical-network-interface> my-macvlan-network
  • --subnet: Định nghĩa dải địa chỉ IP cho mạng macvlan.
  • --gateway: Địa chỉ IP của gateway cho mạng macvlan.
  • -o parent=<physical-network-interface>: Xác định card mạng vật lý (interface) mà mạng macvlan sẽ liên kết.

2. Chạy container và liên kết với macvlan network:

docker run --network my-macvlan-network --ip=<desired-ip-address> -itd my-image
  • --network my-macvlan-network: Chỉ định sử dụng mạng macvlan.
  • --ip=<desired-ip-address>: Chọn địa chỉ IP bạn muốn gán cho container.

3. Kiểm tra địa chỉ IP của container:

docker inspect -f '{{.NetworkSettings.Networks.my-macvlan-network.IPAddress}}' <container-id>
  • Thay <container-id> bằng ID của container.

4. Giao tiếp giữa các container và host:

  • Các container sử dụng macvlan có thể giao tiếp trực tiếp với các thiết bị trong cùng mạng vật lý mà host kết nối, cũng như với các container khác trong mạng macvlan.

Lưu ý rằng sử dụng macvlan đôi khi có thể phức tạp và có thể tạo ra một số vấn đề khi triển khai trong môi trường sản xuất, vì nó đòi hỏi quyết định và cấu hình cẩn thận về mô hình mạng và môi trường vật lý.

None:

Trong Docker, none mode là một trong những chế độ mạng được sử dụng khi chạy container. Khi bạn chạy một container với chế độ mạng none, container đó sẽ không kết nối đến một mạng nào cả. Điều này có nghĩa là container sẽ không có card mạng riêng và không thể giao tiếp trực tiếp với bất kỳ container hay mạng nào khác. Container sẽ chỉ có thể giao tiếp với host.

Dưới đây là cách chạy một container với chế độ mạng none:

docker run --network none my-container​

Ở đây, my-container là tên của container bạn đang chạy. Khi bạn sử dụng none mode, container sẽ không có địa chỉ IP và không thể truy cập mạng bên ngoài. Điều này thường được sử dụng khi bạn muốn container chạy độc lập và không cần kết nối mạng.

Lưu ý rằng nếu bạn sử dụng chế độ none, container sẽ không thể kết nối với internet hoặc giao tiếp với các dịch vụ bên ngoài, trừ khi bạn cung cấp các phương tiện khác như --link hoặc --network để thiết lập kết nối mạng tùy chỉnh.

Thực hành với hệ thống Network của Docker

Dưới đây là một số lệnh cơ bản sử dụng trong Docker Network mode Bridge:

  1. Liệt kê các network hiện tại:
    docker network ls [OPTIONS]

    Lệnh docker network ls trong Docker được sử dụng để liệt kê tất cả các network (mạng) hiện có trên hệ thống Docker.

    Các OPTIONS có thể bao gồm các tùy chọn như --filter, để lọc kết quả dựa trên các tiêu chí nhất định. Kết quả sẽ hiển thị các thông tin như tên network, ID network, driver sử dụng, và các thông số khác. Điều này giúp bạn kiểm tra trạng thái của các network và xác định network nào đang hoạt động trên hệ thống Docker của bạn.
  2. Tạo network:

    Trong lệnh docker network create, tùy chọn -driver (hoặc --driver) được sử dụng để chỉ định driver (trình điều khiển) mạng mà bạn muốn sử dụng cho việc tạo một mạng tùy chỉnh trong Docker. Driver xác định cách mà mạng hoạt động và các tính năng cụ thể của nó.

    docker network create --driver <driver-name> <network-name>

    Ví dụ:

    docker network create --driver bridge my-bridge-network​​

    Trong ví dụ trên, --driver bridge đặt driver của mạng là "bridge", điều này tạo ra một mạng tùy chỉnh với cấu hình giống với mạng bridge mặc định của Docker.

    Một số driver mạng phổ biến bao gồm:

    • bridge: Mạng bridge mặc định trong Docker, giúp kết nối các container trên một host.

    • overlay: Cho phép kết nối các container trên các host khác nhau trong một Docker Swarm.

    • host: Sử dụng network namespace của host, làm cho container chia sẻ cùng không gian mạng với host.

    • macvlan: Cho phép container có địa chỉ MAC và địa chỉ IP nằm trên cùng một mạng với card mạng thực của host.

  3. Chạy container với Bridge network (mặc định):

    docker run -d --name my-container my-image
    • Lệnh trên sẽ chạy một container với tên là my-container và sử dụng bridge network mặc định.
  4. Chạy container với Bridge network cụ thể:

    docker run -d --name my-container --network=my-bridge-network my-image
    • Trong trường hợp bạn đã tạo một bridge network tùy chỉnh, bạn có thể chỉ định nó khi chạy container.
  5. Xem các thông tin chi tiết về bridge network:

    docker network inspect bridge
    • Lệnh docker network inspect bridge trong Docker được sử dụng để hiển thị thông tin chi tiết về mạng mặc định có tên là "bridge". Mạng bridge là một trong những mạng mặc định được tạo ra khi bạn cài đặt Docker và nó thường được sử dụng cho việc kết nối các container với mạng bên ngoài.
    • Kết quả có thể bao gồm thông tin về các container đang chạy trên mạng bridge, các cổng được ánh xạ, địa chỉ IP của mạng, và các thông số cấu hình khác.Lệnh này là hữu ích khi bạn muốn xem thông tin chi tiết về cấu hình và trạng thái của mạng bridge mặc định của Docker.

    •  

  6. Ánh xạ cổng từ container ra host:

    docker run -d -p 8080:80 --name web-server my-web-image
    • Lệnh trên sẽ chạy một container với tên là web-server, ánh xạ cổng 80 từ container ra cổng 8080 trên host.
  7. Liên kết container với bridge network đã tồn tại:

    docker network connect my-bridge-network my-container
    • Lệnh trên sẽ liên kết container có tên là my-container với bridge network có tên là my-bridge-network.
  8. Tách container từ bridge network:

    docker network disconnect my-bridge-network my-container
    • Lệnh trên sẽ tách container có tên là my-container khỏi bridge network có tên là my-bridge-network.
  9. Xóa bridge network:

    docker network rm my-bridge-network
    • Lệnh trên sẽ xóa bridge network có tên là my-bridge-network.

Nhớ rằng bạn có thể thay đổi các giá trị như tên network, tên container, cổng ánh xạ, và image theo nhu cầu cụ thể của bạn.

Cách các container giao tiếp với nhau

Các container trong Docker có thể giao tiếp với nhau thông qua một số cách, đặc biệt là khi chúng thuộc cùng một mạng Docker. Dưới đây là một số cách container có thể giao tiếp với nhau:

1. Giao Tiếp Bằng Địa Chỉ IP:

  • Container có thể giao tiếp trực tiếp bằng cách sử dụng địa chỉ IP của container đó. Tuy nhiên, khi sử dụng DNS, địa chỉ IP có thể thay đổi, vì vậy giao tiếp bằng tên container là lựa chọn linh hoạt hơn.

2. Liên Kết Container:

  • Khi chạy container, bạn có thể liên kết chúng với nhau bằng cách sử dụng tùy chọn --link. Tuy nhiên, --link đã được thay thế bởi các mô hình mạng mới hơn như bridge network hoặc user-defined network.
docker run --name container1 --link container2:alias_of_container2 -d my-image​

3. Sử Dụng User-Defined Network:

  • User-Defined Network trong Docker là một khái niệm cho phép bạn tạo ra và quản lý các mạng mà bạn định nghĩa một cách tùy chỉnh. Khi bạn tạo một user-defined network, Docker sẽ cung cấp một không gian tên DNS nội bộ, cho phép các container trong cùng một network có thể giao tiếp với nhau thông qua tên container thay vì sử dụng địa chỉ IP.
  • Tạo một user-defined network và tham gia container vào network đó. Container trong cùng một network có thể giao tiếp với nhau thông qua tên container.
docker network create my-network
docker container run --name centos1 --network my-network -it centos
docker container run --name centos2 --network my-network -it centos

Lưu ý: Nó chỉ dành cho những container sử dụng với 1 network custom thôi, nếu sử dụng network mặc định của docker là bridge thì sẽ ko giao tiếp giữa các container bằng name được đâu. Chính vì thế theo khuyến nghị thì sau khi tạo mới 1 container thì mình nên định nghĩa cho mình 1 network trước ,sau đó thì tất cả các container mới sẽ sử dụng network này.

5. Sử Dụng Mô Hình Swarm Service:

  • Trong môi trường Docker Swarm, các container có thể giao tiếp với nhau thông qua tên dịch vụ. Các dịch vụ được quản lý bởi Docker Swarm cung cấp một cách linh hoạt để triển khai và mở rộng ứng dụng phân tán.
docker service create --name my-service my-image​

Lưu ý rằng cách container giao tiếp với nhau còn phụ thuộc vào môi trường cụ thể và cách bạn đã cấu hình mạng Docker. Một số phương pháp như sử dụng tên container hoặc sử dụng user-defined network thường được ưa chuộng vì tính linh hoạt và dễ quản lý.

Cách sử dụng phổ biến:

1.User-Defined Network

Khi bạn chạy các container trong Docker, bạn có thể cho phép chúng giao tiếp với nhau thông qua tên của chúng thay vì sử dụng địa chỉ IP. Điều này giúp giảm độ phụ thuộc vào địa chỉ IP cụ thể và làm cho triển khai linh hoạt hơn. Dưới đây là một số bước để cho phép các container giao tiếp với nhau bằng tên:

1. Tạo Một Docker Network:

Trước tiên, tạo một Docker network để cho phép các container tham gia cùng một mạng:

docker network create my-network​

2. Chạy Các Container Với Tên và Tham Gia Vào Mạng:

Chạy các container và đặt tên cho chúng, sau đó tham gia vào mạng vừa tạo:

docker run --name container1 --network my-network -d my-image1
docker run --name container2 --network my-network -d my-image2​

3. Giao Tiếp Bằng Tên Container:

Sử dụng tên của container để thực hiện giao tiếp. Ví dụ, nếu bạn muốn container1 giao tiếp với container2:

docker exec -it container1 SAU ĐÓ ping container2​

Bạn cũng có thể sử dụng tên container như một địa chỉ máy chủ trong các ứng dụng của mình.

Lưu ý rằng khi sử dụng các phiên bản Docker mới, DNS mặc định của Docker sẽ tự động giúp bạn giải quyết tên container thành địa chỉ IP. Điều này giúp các container có thể giao tiếp với nhau bằng tên mà không cần phải làm thêm bất kỳ cấu hình nào. Tuy nhiên, nếu bạn sử dụng phiên bản cũ hơn, bạn có thể cần thêm tùy chọn --link khi chạy container để giúp giải quyết tên container thành địa chỉ IP.

Docker container với tùy chọn --network-alias.

Khi bạn chạy một Docker container với tùy chọn --network-alias, bạn đang chỉ định một hoặc nhiều tên địa chỉ mạng bổ sung cho container đó khi nó tham gia vào một mạng Docker. Điều này giúp container có thể được gọi bằng nhiều tên khác nhau trong mạng đó.

Dưới đây là một ví dụ về cách sử dụng --network-alias khi chạy một container:

docker run --network my-network --network-alias my-alias -d my-image

Trong ví dụ này:

  • --network my-network: Đặt container vào mạng có tên là my-network.
  • --network-alias my-alias: Đặt một tên địa chỉ mạng bổ sung cho container, trong trường này là my-alias.

Kết quả, container này sẽ có thể được gọi bằng tên my-alias hoặc bất kỳ tên địa chỉ mạng bổ sung nào bạn đã đặt khi chạy container. Điều này có ích khi bạn muốn cung cấp nhiều cách để gọi một container từ các thành phần khác trong mạng Docker mà không phụ thuộc vào tên mặc định của container.

Ví dụ, nếu bạn có nhiều dịch vụ cần giao tiếp với container này, việc sử dụng các --network-alias giúp tạo ra các tên địa chỉ mạng thuận tiện và ý nghĩa trong việc giao tiếp giữa các thành phần.

Hơn nữa nó còn giúp bạn load balancer các ứng dụng của bạn bằng sử dụng DNS.

Bài tập

 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday