Docker [LT]Docker Networking

Khắc Huy

Internship/Fresher
Mục lục
A. Giới Thiệu Về Docker Networking
B. Các Loại Mạng Docker
1. Bridge Network
2. User-Defined Bridge Network
3. Host Network
4. Macvlan Network
5. Ipvlan Network
6. Overlay Network
7. None Network
C. So sánh và các tình huống sử dụng

A. Giới Thiệu Về Docker Networking



Docker networking là một kỹ năng thiết yếu cho bất kỳ ai làm việc với container. Đây là một thế giới thú vị nơi các container có thể giao tiếp với nhau và với thế giới bên ngoài. Bài viết này sẽ hướng dẫn bạn qua những phức tạp của Docker networking.

1728908946786.png


Docker containers nổi tiếng với tốc độ và tính nhẹ nhàng, khiến chúng trở thành lựa chọn yêu thích của các developer. Tuy nhiên, điều kỳ diệu thực sự nằm ở cách các container này kết nối mạng hiểu được các cơ chế bên dưới có thể mở ra một cấp độ kiểm soát và hiệu quả hơn cho container.

B. Các Loại Mạng Docker



Docker cung cấp bảy loại mạng khác nhau, mỗi loại có các tính năng và trường hợp sử dụng riêng.

1. Bridge Network



1728908972990.png


Là loại mạng mặc định, sử dụng Driver bridge, bridge network cho phép các container giao tiếp với nhau trên cùng một host. Nó giống như một switch ảo kết nối tất cả các container, cung cấp cho chúng địa chỉ IP và cho phép giao tiếp.

1728909003151.png
6

Như hình bên trên, Docker tạo ra một brigde ảo trên máy host để dùng cho việc kết nối mạng của Docker, địa chỉ mặc định được tạo ra là 172.17.0.1/16. Bạn có thể thay đổi địa chỉ IP này bằng cách cấu hình file daemon.json của docker. Vào đường dẫn /etc/docker/ và tạo một file daemon.json với nội dung { "bip": "192.168.1.1/24"} “nhớ theo định dạng json nhé” restart lại docker và kiểm tra lại ip.

1728909029854.png


Xét ví dụ sau mình có 3 container.
1728909050586.png


Các container này sẽ tạo ra các veth để kết nối đến bridge ảo mà docker tạo bên trên để có thể kết nối với nhau.


1728909074764.png



Các veth này sử dụng chung lớp lớp mạng với docker0 và docker sử dụng DHCP để cấp ip cho các veth này.

1728909098492.png


Như bao network khác, Docker cũng có DNS và cơ chế là sẽ copy file /etc/resolv.conf của host và bỏ vào bên trong container. Do đó, các container có thể ping bằng domain thay vì bằng ip.

1728909122863.png


Đó chỉ mới là một chiều, một số container được tạo ra để dùng cho mục đích người dùng có thể truy cập vào. Các container hiện tại chỉ có thể truy cập từ bên trong ra ngoài người dùng chưa thể truy cập vào bên trong container. Như containerC đang chạy nginx người dùng không thể sử dụng địa chỉ IP của containerC để truy cập vào nginx được.

1728909146505.png


Đây cũng là điều bất tiện của bridge, để có thể sử dụng được dịch vụ bên trong container cần phải ánh xạ một cổng trên host vào trong port service đang chạy trên container.

1728909159700.png


Như hình trên, bên trái là port của host và bên phải là port của container. Sau khi đã expose port thì có thể truy cập thông qua địa chỉ IP và port của host để truy cập vào service bên trong container.

1728909186617.png



1728909225688.png



2. User-Defined Bridge Network



1728909254679.png


Loại mạng này cũng là Bridge network khác ở chỗ nó cho phép bạn tạo và tùy chỉnh, cung cấp sự cô lập và kiểm soát tốt hơn. Các container trên user-defined bridge có thể giao tiếp bằng cách sử dụng tên DNS, điều này không thể thực hiện trên bridge mặc định.

Để tạo mạng của riêng mình sử dụng câu lệnh “docker network create <name>” và kiểm tra bằng “docker network ls”.

1728909284990.png


Docker sẽ tạo ra một bridge ảo mới sử dụng một lớp mạng khác.

1728909298456.png


1728909317277.png


1728909335816.png


Các container được cô lập với các container ở lớp mạng khác và các container chung network có thể ping với nhau bằng tên container.

1728909354585.png


1728909398972.png


Có thể tham khảo link bài viết ở đây để biết chi tiết thêm về user-defined network. Cũng như loại trên cũng cần phải ánh xạ port của host vào trong port của container.

3. Host Network



1728909417231.png


Trong host network, các container chia sẻ stack mạng của host. Điều này có nghĩa là chúng sử dụng địa chỉ IP và cổng của host, điều này có thể hữu ích cho một số ứng dụng nhưng thiếu sự cô lập.

Ví dụ, nếu bạn chạy một container kết nối với cổng 80 và bạn sử dụng host, ứng dụng của container sẽ có sẵn trên cổng 80 tại địa chỉ IP của máy chủ. Container không có địa chỉ IP riêng khi sử dụng chế độ host network, việc ánh xạ cổng cũng sẽ không có hiệu lực, và các tùy chọn -p, --publish, -P, và --publish-all sẽ bị bỏ qua, thay vào đó sẽ tạo ra một cảnh báo.

“WARNING: Published ports are discarded when using host network mode

1728909440632.png


4. Macvlan Network



1728909460120.png


Macvlan networks cho phép các container xuất hiện như các thiết bị vật lý trên mạng, mỗi container có địa chỉ MAC riêng. Thiết lập này lý tưởng cho các kịch bản mà bạn cần các container có thể truy cập trực tiếp trên mạng vật lý.

Khi sử dụng Mac VLAN, cần lưu ý một số vấn đề có thể xảy ra:

  1. Cạn kiệt địa chỉ IP và "VLAN spread": Đây là tình huống xảy ra khi có quá nhiều địa chỉ MAC trong mạng, có thể làm suy giảm hiệu suất mạng.
  2. Chế độ promiscuous: Thiết bị mạng cần hỗ trợ chế độ này, cho phép một interface vật lý được gán nhiều địa chỉ MAC.
  3. Giải pháp thay thế: Nếu ứng dụng của bạn có thể hoạt động với bridge netwok (trên một máy chủ Docker) hoặc overlay network (để giao tiếp giữa nhiều máy chủ Docker), thì những giải pháp này có thể tốt hơn về lâu dài.
Để tạo ra macvlan bạn cần cung cấp các thông số như subnet, gateway của network và macvlan sẽ sử dụng interface network của host làm uplink.

1728909478611.png


1728909497105.png


Có thể kiểm tra bằng cách thực thi container và kiểm tra IP.

1728909509532.png


Lúc này, bạn chưa thể ping ra gateway, Mac VLAN nghe có vẻ tuyệt vời vì cho phép mỗi container Docker có địa chỉ MAC riêng, nhưng điều này có thể gây ra vấn đề nếu mạng của bạn không cho phép nhiều địa chỉ MAC trên một cổng switch. Thường thì các cổng không thể xử lý điều đó vì có port security, chỉ cho phép một hoặc hai địa chỉ MAC trên một cổng, và điều này làm gián đoạn hoạt động.

Trong vCenter, bạn cần kích hoạt chế độ MAC address changes bằng cách vào cài đặt portgroup->security -> thay đổi chế độ MAC address changes và Promiscuous mode từ chối sang cho phép.
1728909525351.png


Sau khi thực hiện các thay đổi này và khởi động lại máy chủ, macVLAN hoạt động như mong đợi, cung cấp tất cả các lợi ích của bridge network nhưng được kết nối trực tiếp với mạng vật lý. Do đó bạn cũng có thể truy cập dịch vụ thông qua ip của container.

1728909545222.png


1728909568465.png




5. Ipvlan Network



1728909587881.png


Tương tự như Macvlan, Ipvlan networks cung cấp quyền truy cập mạng trực tiếp nhưng chia sẻ địa chỉ MAC của host. Thiết lập này giảm nhu cầu sử dụng chế độ promiscuous trên các switch mạng.

Cách khai báo cũng giống như macvlan chỉ sửa đổi ở -d là ipvlan.

1728909605999.png


Điểm khác biệt so với macvlan là container sẽ sử dụng chung MAC addresses của host

1728909629243.png


1728909641607.png
3

Bên cạnh Layer 2 thì ipvlan còn hỗ trợ ở Layer 3, ở Layer 3 thì host trở thành một router dùng để dẫn đường cho các container trao đổi dữ liệu với nhau, và kết nối hoàn toàn ở Layer 3.

1728909662341.png


Để khởi tạo, sẽ sử dụng câu lệnh như ở Layer 2 nhưng cần thay đổi ở mode của ipvlan.

1728909682627.png


Khởi tạo vài container chạy trong network IP_VLAN. Và các container này chưa thể thông ra internet nhưng các container này có thể giao tiếp với nhau do cùng chung một ipvlan mặc dù khác subnet.

1728909695130.png


1728909722207.png


1728909735788.png


Chỉ cần trên router hoặc switch l3 của bạn cấu hình static route 2 lớp mạng 192.168.0.0/24 và 192.168.1.0/24 đi qua ip của host là có thể ping từ bên ngoài vào.

6. Overlay Network



1728909761904.png


Overlay network là loại mạng ảo được sử dụng trong Docker để cho phép các container trên các máy chủ Docker khác nhau giao tiếp với nhau một cách an toàn nếu sử dụng chế độ mã hóa có thể tham khảo ở link này.

Cả HOST A và HOST B đều có môi trường Docker riêng, trong đó mỗi host chạy một container. ContainerA trên HOST A và ContainerB trên HOST B đều có cùng địa chỉ IP nội bộ là 172.17.0.0/24.

HOST A và HOST B nằm trong cùng một mạng vật lý với địa chỉ IP là 172.168.2.151/24 và 172.168.2.150/24. Overlay network được thiết lập với dải địa chỉ 172.17.0.0/24, cho phép các container trên các host khác nhau giao tiếp với nhau như thể chúng đang ở trên cùng một mạng nội bộ.

Mặc dù các container có cùng địa chỉ IP nội bộ, overlay network đảm bảo rằng chúng có thể giao tiếp với nhau mà không bị xung đột địa chỉ, nhờ vào việc quản lý và định tuyến thông minh của Docker.

Đây là một phần quan trọng của Docker Swarm, một công cụ quản lý container tích hợp sẵn trong Docker để triển khai và quản lý các ứng dụng container hóa ở môi trường phân tán. Do giới hạn về tài nguyên mình sẽ không đề cập sâu về Overlay, mình sẽ nói sâu hơn trong bài viết về Docker swarm sắp tới và so sánh giữa Docker Swarm và K8s.

7. None Network



1728909796361.png


None network cung cấp sự cô lập hoàn toàn, không có kết nối mạng. Điều này hữu ích cho các container không cần truy cập mạng và hoàn toàn bảo mật vì không ai có thể hack một loại thiết bị không có kết nối mạng trừ khi hack vào bộ xử lý điện của máy host(cúp nguồn).

C. So sánh và các tình huống sử dụng



1728909832858.png


Tình huống sử dụng:
  1. Bridge Network: Thích hợp cho các ứng dụng đơn giản chạy trên một host, nơi các container cần giao tiếp với nhau nhưng không cần truy cập ra ngoài.
  2. Host Network: Phù hợp cho các ứng dụng yêu cầu hiệu suất mạng cao và không cần sự cô lập, như các dịch vụ web cần truy cập trực tiếp vào mạng của host.
  3. None Network: Dùng cho các container không cần truy cập mạng, như các tác vụ xử lý dữ liệu nội bộ hoặc kiểm tra bảo mật.
  4. Overlay Network: Sử dụng trong các môi trường phân tán, như Docker Swarm, nơi các container trên nhiều host cần giao tiếp với nhau.
  5. Macvlan Network: Thích hợp cho các ứng dụng cần địa chỉ IP và MAC riêng, như các dịch vụ giám sát mạng.
  6. IPvLAN Network: Dùng khi cần địa chỉ IP riêng cho container nhưng không cần địa chỉ MAC riêng, giúp đơn giản hóa cấu hình mạng.
Các kiến thức trên được mình góp nhặt và nghiên cứu từ nhiều nguồn nếu như có sai sót hoặc thông tin gì sai với kiến thức chung, mọi người xin vui lòng góp ý bên dưới comment.
 

Attachments

  • 1728909781672.png
    1728909781672.png
    136.8 KB · Views: 0

About us

  • Securityzone.vn là một trang web chuyên về an ninh mạng và công nghệ thông tin. Trang web này cung cấp các bài viết, tin tức, video, diễn đàn và các dịch vụ liên quan đến lĩnh vực này. Securityzone.vn là một trong những cộng đồng IT lớn và uy tín tại Việt Nam, thu hút nhiều người quan tâm và tham gia. Securityzone.vn cũng là nơi để các chuyên gia, nhà nghiên cứu, sinh viên và người yêu thích an ninh mạng có thể trao đổi, học hỏi và chia sẻ kiến thức, kinh nghiệm và giải pháp về các vấn đề bảo mật trong thời đại số.

Quick Navigation

User Menu