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
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.
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.
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.
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.
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.
Xét ví dụ sau mình có 3 container.
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.
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.
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.
Đó 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.
Đâ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.
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.
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”.
Docker sẽ tạo ra một bridge ảo mới sử dụng một lớp mạng khác.
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.
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.
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”
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:
Có thể kiểm tra bằng cách thực thi container và kiểm tra IP.
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.
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.
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.
Điểm khác biệt so với macvlan là container sẽ sử dụng chung MAC addresses của host
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.
Để 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.
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.
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.
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.
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).
Tình huống sử dụng:
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.
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
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.
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.
Xét ví dụ sau mình có 3 container.
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.
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.
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.
Đó 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.
Đâ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.
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.
2. User-Defined Bridge Network
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”.
Docker sẽ tạo ra một bridge ảo mới sử dụng một lớp mạng khác.
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.
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
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”
4. Macvlan Network
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:
- 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.
- 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.
- 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.
Có thể kiểm tra bằng cách thực thi container và kiểm tra IP.
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.
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.
5. Ipvlan Network
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.
Điểm khác biệt so với macvlan là container sẽ sử dụng chung MAC addresses của host
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.
Để 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.
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.
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
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
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
Tình huống sử dụng:
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.