Làm chủ mạng Docker: Từ bridge tùy chỉnh đến kiến trúc sẵn sàng cho Swarm
Hướng dẫn thực hành đầy đủ về mạng Docker, bao gồm trình điều khiển mạng, quản lý IP, thiết lập overlay cho Swarm và tinh chỉnh hiệu năng cho hệ thống container hóa có thể mở rộng, an toàn.
Mạng là khái niệm cốt lõi của ứng dụng container hóa. Nó cho phép giao tiếp liền mạch giữa tất cả container, hệ thống máy chủ và dịch vụ bên ngoài. Các tính năng mạng tích hợp của Docker là thiết yếu để cô lập dịch vụ hiệu quả, bảo mật luồng dữ liệu và điều phối kiến trúc microservices có thể mở rộng.
Một trong những công cụ mạnh mẽ nhất trong bối cảnh này là lệnh Docker network create, cho phép kỹ sư DevOps và nhà phát triển xác định các mạng tùy chỉnh phù hợp với nhu cầu ứng dụng.
Vì vậy hôm nay, tôi sẽ hướng dẫn bạn từng bước cách tạo và quản lý những mạng Docker này một cách hiệu quả.
Xây dựng ứng dụng hiện đại thường bao gồm nhiều dịch vụ trong các container riêng lẻ, cô lập. Mạng Docker cung cấp cách linh hoạt và mạnh mẽ để kết nối các container đó với nhau, cũng như với hệ thống bên ngoài, thông qua bất kỳ mô hình mạng nào bạn chọn, bất kể hạ tầng bên dưới.
Phần này sẽ cung cấp cho bạn kiến thức cơ bản về mạng Docker, một thành phần then chốt của Docker, và cách đánh giá cấu hình mạng nào sẽ phù hợp với nhu cầu ứng dụng của bạn. Nhưng trước khi bắt đầu, nếu bạn hoàn toàn mới với Docker, tôi rất khuyến khích bạn xemIntroduction to Docker để xây nền tảng vững chắc trước khi đi sâu vào mạng Docker.
Trình điều khiển mạng: nền tảng của Docker networking
Docker sử dụng các trình điều khiển mạng để xác định cách container kết nối và giao tiếp. Mỗi trình điều khiển quy định cách xử lý mạng của container. Do đó, mỗi trình điều khiển mạng chính của Docker có mức hiệu năng, mức độ cô lập và độ phức tạp khác nhau.
Tổng quan về các trình điều khiển mạng cốt lõi của Docker
Dưới đây là các trình điều khiển tích hợp chính mà Docker hỗ trợ:
Bridge: Trình điều khiển mặc định cho container độc lập. Nó tạo một mạng nội bộ cô lập trên máy chủ, cho phép các container giao tiếp với nhau bằng IP hoặc tên container. Lý tưởng cho phát triển và thử nghiệm trên một máy chủ đơn.
Host: Loại bỏ lớp cô lập bằng cách dùng chung ngăn xếp mạng của máy chủ. Container sử dụng trực tiếp IP và cổng của máy chủ. Hữu ích cho ứng dụng hiệu năng cao hoặc cần tương thích với dịch vụ cấp độ máy chủ.
None: Vô hiệu hóa toàn bộ mạng cho container. Chỉ có giao diện loopback. Phù hợp cho container không cần kết nối ra ngoài hoặc yêu cầu cô lập bảo mật nghiêm ngặt.
Overlay: Cho phép giao tiếp giữa các container trên các máy chủ Docker khác nhau. Thường dùng trong Docker Swarm và triển khai đa máy chủ. Nó tạo một mạng phân tán trừu tượng hóa hạ tầng vật lý bên dưới.
Macvlan: Gán một địa chỉ MAC riêng cho từng container, khiến nó xuất hiện như một thiết bị vật lý trên mạng. Phù hợp cho ứng dụng kế thừa cần truy cập trực tiếp mạng vật lý.
IPvlan: Tương tự macvlan, nhưng định tuyến lưu lượng ở lớp IP thay vì dùng địa chỉ MAC. Cung cấp hiệu năng và khả năng kiểm soát tốt hơn trong môi trường mật độ cao.
Mỗi trình điều khiển ảnh hưởng đến cách container tương tác với nhau, với máy chủ và với mạng bên ngoài.
Bạn tò mò các kiểu mạng này phối hợp ra sao? Khóa học Intermediate Docker của chúng tôi đề cập chi tiết thực tiễn về mạng Docker, volumes và Compose. Hiểu các khác biệt này là chìa khóa để thiết kế kiến trúc an toàn và hiệu năng.
Tôi nên dùng loại mạng nào?
Chọn đúng trình điều khiển mạng phụ thuộc vào kiến trúc ứng dụng và mục tiêu vận hành của bạn:
Bridge: Khuyến nghị cho hầu hết kịch bản phát triển cục bộ và ứng dụng đa container đơn giản trên một máy chủ. Cân bằng giữa cô lập và dễ sử dụng.
Host: Tốt nhất khi container cần gắn trực tiếp vào mạng của máy chủ, như khi mở dịch vụ trên các cổng tiêu chuẩn (ví dụ cổng 80 hoặc 443). Hãy thận trọng với bảo mật và xung đột cổng.
None: Lý tưởng cho khối lượng công việc sandbox hoặc tác vụ trọng yếu về bảo mật không nên có bất kỳ truy cập mạng nào. Phổ biến trong quy trình tự động hoặc thử nghiệm.
Overlay: Thiết yếu trong môi trường cụm như Docker Swarm hoặc Kubernetes, nơi container trải rộng trên nhiều máy chủ. Cho phép mở rộng ngang và khám phá dịch vụ.
Macvlan: Ưu tiên khi container phải hành xử như thiết bị vật lý trên LAN. Dùng trong các trường hợp như bắt gói mạng, tích hợp hệ thống kế thừa hoặc khi cần bỏ qua ngăn xếp mạng của Docker.
IPvlan: Cung cấp kiểm soát chi tiết và hiệu năng tốt hơn macvlan cho môi trường có yêu cầu mạng nghiêm ngặt, như hệ thống viễn thông hoặc tài chính.
Hãy cân nhắc các yếu tố như tô-pô máy chủ, nhu cầu bảo mật và chiến lược mở rộng khi chọn trình điều khiển mạng.
Vẫn đang phân vân mạng nào phù hợp khối lượng công việc của bạn? Tìm hiểu Docker so với Kubernetes trong triển khai thực tế với Kubernetes vs Docker.
Tạo mạng Docker tùy chỉnh
Mạng Docker tùy chỉnh cho phép bạn kiểm soát cách container giao tiếp nội bộ với nhau cũng như với hệ thống bên ngoài, giúp bạn cô lập dịch vụ tốt hơn, gán IP dự đoán được hoặc thiết kế kiến trúc hướng hiệu năng hay bảo mật.
Phần này sẽ hướng dẫn bạn từ những kiến thức cơ bản đến các tính năng nâng cao trong quá trình tạo mạng Docker tùy chỉnh, bao gồm các lệnh và cấu hình IP tùy biến.
Cấu trúc lệnh cơ bản
Để tạo một mạng tùy chỉnh, hãy dùng lệnh docker network create. Lệnh này cho phép bạn xác định trình điều khiển mạng, subnet và các tùy chọn khác để kiểm soát tốt hơn việc giao tiếp giữa container.
Dưới đây là ví dụ đơn giản dùng trình điều khiển bridge mặc định:
$ docker network create demo-network -d bridgeĐược hỗ trợ bởi
Lệnh này tạo một mạng bridge tên là demo-network. Docker trả về một ID mạng duy nhất để xác nhận. Tại thời điểm này, mạng đã tồn tại nhưng chưa kết nối container nào.
Chế độ Docker Swarm cho phép triển khai dịch vụ được điều phối trên một cụm các máy chủ Docker. Một phần quan trọng của điều phối này là mạng, đảm bảo các dịch vụ chạy trên các node khác nhau có thể giao tiếp liền mạch và an toàn với nhau.
Kiến trúc mạng nhận biết Swarm
Docker Swarm là giải pháp gom cụm gốc của Docker, biến một nhóm máy chủ Docker thành một động cơ ảo duy nhất. Nó cho phép bạn triển khai và quản lý container như các dịch vụ phân tán. Một trong những điểm mạnh lớn là mạng đa máy chủ, cho phép dịch vụ trên các máy khác nhau giao tiếp như thể chúng ở cùng một máy.
Mạng Swarm hỗ trợ hai loại lưu lượng chính:
Lưu lượng mặt phẳng điều khiển – liên lạc quản trị được mã hóa giữa các node Docker.
Lưu lượng mặt phẳng dữ liệu – giao tiếp giữa các container và truy cập dịch vụ bên ngoài.
Swarm sử dụng mạng overlay để hỗ trợ giao tiếp dịch vụ giữa các node và routing mesh để cân bằng tải lưu lượng bên ngoài qua các bản sao dịch vụ.
Tạo mạng cho swarm
Để hỗ trợ khám phá dịch vụ và giao tiếp đa máy chủ an toàn, Docker Swarm sử dụng mạng overlay với phạm vi swarm. Các mạng này có thể được tạo thủ công hoặc tự động khi khởi chạy dịch vụ.
--opt encrypted bật mã hóa IPSEC cho lưu lượng giữa các container.
--scope swarm được áp dụng tự động với trình điều khiển overlay trong chế độ swarm.
Hiểu các cờ --scope và --attachable
--scope swarm: Chỉ ra mạng khả dụng trên tất cả node trong swarm. Chỉ các dịch vụ swarm (không phải container độc lập) có thể dùng mạng này trừ khi chỉ định --attachable.
--attachable: Cho phép container độc lập tham gia mạng có phạm vi swarm. Hữu ích để gỡ lỗi hoặc truy cập tạm thời.
Điều này cho phép bạn gắn các container thông thường vào mạng swarm, ngoài các dịch vụ.
Cấu hình và xác thực mạng
Bạn cần đảm bảo các mạng Docker được cấu hình đúng để giao tiếp đúng giữa các container, cung cấp bảo mật cần thiết và dịch vụ hiệu năng. Docker có nhiều công cụ và lệnh để xem xét, khắc phục sự cố và xác thực cấu hình mạng của bạn.
Xác minh cấu hình mạng
Để xem chi tiết cấu hình của bất kỳ mạng Docker nào, hãy dùng lệnh docker network inspect. Bạn sẽ nhận được đầu ra JSON chi tiết bao gồm:
Trình điều khiển mạng (bridge, overlay, v.v.)
Cấu hình subnet và gateway
Phạm vi (local, swarm)
Các container được kết nối và địa chỉ IP của chúng
Truy cập nội bộ hay bên ngoài
Tùy chọn đặc thù trình điều khiển (ví dụ, VXLAN ID cho mạng overlay)
"IPAM": Xác nhận các thiết lập quản lý địa chỉ IP, bao gồm subnet hoặc gateway tùy chỉnh.
"Containers": Hiển thị container nào được gắn và IP được cấp.
"Options": Hiển thị cấu hình nâng cao như mã hóa (encrypted: true) hoặc kích thước MTU.
Kỹ thuật xác thực
Để xác nhận mạng hoạt động như mong đợi:
Trước tiên bạn phải xác minh cấu hình IPAMBạn hãy kiểm tra phần "IPAM" trong đầu ra docker network inspect. Đảm bảo subnet và gateway khớp với thiết lập dự kiến. Subnet cấu hình sai có thể dẫn đến vấn đề kết nối hoặc xung đột IP.
Sau đó kiểm tra các định danh VXLAN (chỉ Overlay)Mạng overlay dùng VXLAN để đóng gói lưu lượng container qua nhiều máy chủ. Kiểm tra phần "Options" với các khóa như:
"com.docker.network.driver.overlay.vxlanid_list":"4097"Được hỗ trợ bởi
Điều này xác nhận đường hầm VXLAN đang hoạt động và cấu hình đúng. Nếu thiếu hoặc sai, dịch vụ có thể không truy cập được giữa các node.
Cuối cùng, kiểm thử kết nối giữa các containerTừ một container, hãy thử ping hoặc truy cập container khác bằng tên hoặc IP. Điều này xác nhận phân giải DNS và định tuyến nội bộ đang hoạt động:
Container kết nối vào các mạng do người dùng định nghĩa sẽ dùng máy chủ DNS nhúng của Docker. Để xác nhận, hãy kiểm tra /etc/resolv.conf bên trong container và thử phân giải tên dịch vụ.
Xác thực định tuyến gateway
Với các container trên nhiều mạng, Docker chọn gateway mặc định dựa trên gw-priority cao nhất. Để áp đặt định tuyến đúng, gán mức ưu tiên rõ ràng khi tạo container:
$ docker run --networkname=public,gw-priority=1--network private mycontainerĐược hỗ trợ bởi
Dùng nhật ký và công cụ chẩn đoán
Theo dõi nhật ký container để tìm lỗi kết nối, và dùng các công cụ như curl, dig và ip a bên trong container để gỡ lỗi cấp thấp.
Tóm lại, xác thực cấu hình mạng Docker giúp đảm bảo giao tiếp container trơn tru và giảm thiểu lỗi bất ngờ trong ứng dụng đa dịch vụ.
Và điều này dẫn chúng ta đến phần tiếp theo.
Tối ưu bảo mật và hiệu năng
Mạng trong thế giới container không chỉ là bật phương thức giao tiếp. Nhiều trường hợp đòi hỏi cung cấp cô lập cần thiết đồng thời đảm bảo hiệu năng tối đa. Khi bảo vệ kiến trúc và cung cấp dịch vụ, phân đoạn và thông lượng có thể giúp bạn đạt được điều đó.
Chiến lược phân đoạn mạng
Phân đoạn mạng là thực hành nền tảng và phương thức bảo mật cho ứng dụng container hóa. Bằng cách gán container vào các mạng Docker riêng biệt, bạn có thể tách bạch các mối quan tâm chéo như phân đoạn cho dịch vụ frontend, backend và cơ sở dữ liệu. Điều này giúp giảm thiểu rủi ro lộ lọt và tấn công một cách chủ động.
Bạn có thể tận dụng mạng do người dùng định nghĩa để quản lý ranh giới giao tiếp. Container ở các mạng khác nhau sẽ không thể giao tiếp với nhau trừ khi bạn chủ động kết nối chúng. Ví dụ, nếu bạn đặt container cơ sở dữ liệu trên mạng chỉ nội bộ, các dịch vụ công khai sẽ không thể truy cập trực tiếp nó.
Quy tắc và kiểm soát tường lửa tích hợp
Theo mặc định, Docker triển khai các quy tắc iptables để hạn chế các điểm cuối giao tiếp giữa container và thế giới bên ngoài.
Một số cách để mở rộng phân đoạn này gồm:
Tắt giao tiếp giữa các container trên mạng bridge mặc định:
Thêm cấu hình này vào daemon.json của daemon Docker để ngăn container giao tiếp trừ khi ở cùng một mạng do người dùng định nghĩa.
Giới hạn khả năng và đặc quyền bằng các cờ như --cap-drop, --read-only và --no-new-privileges.
Dùng mạng overlay trong chế độ Swarm cho giao tiếp dịch vụ được mã hóa, có phạm vi xác định trên nhiều máy chủ.
Kỹ thuật tối ưu hiệu năng
Có nhiều cách bạn có thể cải thiện hiệu năng thông qua tối ưu hóa với Docker.
Cải thiện thông lượng mạng
Chọn đúng trình điều khiển mạng ảnh hưởng trực tiếp đến hiệu năng. Ví dụ:
Dùng trình điều khiển host khi cần độ trễ thấp, thông lượng cao và không ưu tiên cô lập mạng.
Ưu tiên bridge cho môi trường cục bộ, cô lập.
Triển khai macvlan khi container cần hành xử như thiết bị vật lý trên mạng của bạn.
Tránh quá tải mạng bridge mặc định, và tạo mạng riêng cho dịch vụ nặng hoặc nhóm logic.
Dò hiệu năng với iperf3 và số liệu
Để đo hiệu năng mạng, hãy dùng công cụ dò nhưiperf3:
# Start server in container1docker run -it--rm--name server --network my-net networkstatic/iperf3 -s# Run client in container2docker run -it--rm--network my-net networkstatic/iperf3 -c serverĐược hỗ trợ bởi
Bạn cũng có thể theo dõi thống kê mạng bằng:
docker stats – CPU, bộ nhớ và I/O mạng theo thời gian thực.
Prometheus + cAdvisor – Cho số liệu chuỗi thời gian và giám sát dài hạn.
Script hoặc agent tùy chỉnh xuất số liệu /proc/net/dev từ trong container.
Dò hiệu năng định kỳ giúp phát hiện nút thắt sớm và định hướng quyết định về bố trí container, chọn trình điều khiển hoặc nâng cấp mạng máy chủ.
Khắc phục sự cố mạng
Ngay cả khi tuân thủ thực hành tốt nhất, sự cố mạng vẫn có thể xảy ra. Chẩn đoán và khắc phục nhanh là chìa khóa duy trì thời gian hoạt động. Phần này cung cấp công cụ và kỹ thuật để xác định và sửa các vấn đề mạng Docker thường gặp.
Chẩn đoán vấn đề mạng
Một container tối giản có thể thiếu công cụ như ping, dig hoặc netstat, gây khó gỡ lỗi. Thay vì chỉnh sửa container, hãy khởi chạy một container mới chia sẻ namespace mạng của nó:
docker run -it--network container:my-container alpineĐược hỗ trợ bởi
Sau đó cài công cụ mạng:
apk add --no-cache iproute2 bind-tools net-toolsĐược hỗ trợ bởi
Ngoài ra, hãy dùng nicolaka/netshoot, một image chuyên dụng chứa nhiều công cụ chẩn đoán:
docker run -it--rm--network container:my-container nicolaka/netshootĐược hỗ trợ bởi
Các công cụ như ip, nslookup, netstat và traceroute sẽ giúp xác định vấn đề định tuyến hoặc DNS.
Giải quyết vấn đề kết nối
Một số nguyên nhân phổ biến và cách khắc phục:
Lỗi phân giải DNS: Đảm bảo container ở trên mạng do người dùng định nghĩa để hưởng lợi từ DNS nhúng của Docker. Kiểm tra /etc/resolv.conf và dùng dig hoặc nslookup để thử phân giải tên.
Không khớp MTU: Container trên các mạng hoặc máy chủ khác nhau có thể bị rơi gói do MTU không khớp. Giảm MTU trong mạng overlay nếu có dùng tunneling:
docker network create --driver overlay --optcom.docker.network.driver.mtu=1200 my-overlayĐược hỗ trợ bởi
Subnet xung đột
Tránh các subnet chồng lấn giữa các mạng Docker hoặc với mạng vật lý của máy chủ. Dùng --subnet để xác định dải không xung đột.
Cổng bị tường lửa máy chủ chặn
Đảm bảo các cổng Docker cần thiết được mở:
2377 (quản lý Swarm)
7946 TCP/UDP (khám phá container)
4789 UDP (dữ liệu overlay)
Khắc phục sự cố hiệu quả kết hợp giữa chẩn đoán và hiểu rõ cách container tương tác với mạng của chúng. Với công cụ và cách tiếp cận đúng, hầu hết vấn đề có thể được cô lập và giải quyết trong vài phút.
Kết luận
Docker Networking là thành phần nền tảng của kiến trúc container hóa, cho phép giao tiếp an toàn, hiệu quả và có thể mở rộng giữa các dịch vụ, dù chạy trên một máy chủ hay trên một cụm phân tán.
Với hỗ trợ tích hợp cho nhiều trình điều khiển mạng, quản lý IP có thể tùy biến và mạng overlay gốc cho Swarm, Docker trao quyền cho nhà phát triển và đội DevOps cô lập khối lượng công việc, kiểm soát luồng dữ liệu và tối ưu hiệu năng trong môi trường phức tạp.
Không phải giải pháp phù hợp cho mọi tình huống, nhưng nếu dùng một cách thấu đáo, nó mang lại năng lực vững chắc để xây dựng microservices hiện đại, pipeline tự động hóa và hệ thống phân tán an toàn.
Muốn tiếp tục mài giũa kỹ năng Docker và containerization?
Dưới đây là một số tài nguyên được khuyến nghị cao để tiếp tục hành trình học tập của bạn:
Introduction to Docker: Bắt đầu với các nguyên tắc cơ bản về container và quản lý image.
Intermediate Docker: Đi sâu vào mạng, volumes và điều phối đa container với Docker Compose.
Josep là một Nhà khoa học dữ liệu tự do chuyên về các dự án châu Âu, có chuyên môn về lưu trữ dữ liệu, xử lý, phân tích nâng cao và kể chuyện bằng dữ liệu tạo tác động.
Với vai trò giảng dạy, anh phụ trách môn Dữ liệu lớn trong chương trình Thạc sĩ tại Đại học Navarra và chia sẻ góc nhìn qua các bài viết trên các nền tảng như Medium, KDNuggets và DataCamp. Josep cũng viết về Dữ liệu và Công nghệ trong bản tin Databites (databites.tech).
Anh có bằng Cử nhân Vật lý Kỹ thuật từ Đại học Bách khoa Catalonia và bằng Thạc sĩ Hệ thống Tương tác Thông minh từ Đại học Pompeu Fabra.
Tìm hiểu về Docker và khám phá tầm quan trọng của nó trong bộ công cụ của chuyên gia dữ liệu. Tìm hiểu về Docker container, Docker image và nhiều nội dung khác.
Mạng là khái niệm cốt lõi của ứng dụng container hóa. Nó cho phép giao tiếp liền mạch giữa tất cả container, hệ thống máy chủ và dịch vụ bên ngoài. Các tính năng mạng tích hợp của Docker là thiết yếu để cô lập dịch vụ hiệu quả, bảo mật luồng dữ liệu và điều phối kiến trúc microservices có thể mở rộng.
Một trong những công cụ mạnh mẽ nhất trong bối cảnh này là lệnh Docker network create, cho phép kỹ sư DevOps và nhà phát triển xác định các mạng tùy chỉnh phù hợp với nhu cầu ứng dụng.
Vì vậy hôm nay, tôi sẽ hướng dẫn bạn từng bước cách tạo và quản lý những mạng Docker này một cách hiệu quả.
Nếu bạn mới bắt đầu với Docker, hãy xem lộ trình kỹ năng về Containerization and Virtualization with Docker and Kubernetes để có trải nghiệm thực hành.
Docker Networking là gì?
Xây dựng ứng dụng hiện đại thường bao gồm nhiều dịch vụ trong các container riêng lẻ, cô lập. Mạng Docker cung cấp cách linh hoạt và mạnh mẽ để kết nối các container đó với nhau, cũng như với hệ thống bên ngoài, thông qua bất kỳ mô hình mạng nào bạn chọn, bất kể hạ tầng bên dưới.
Phần này sẽ cung cấp cho bạn kiến thức cơ bản về mạng Docker, một thành phần then chốt của Docker, và cách đánh giá cấu hình mạng nào sẽ phù hợp với nhu cầu ứng dụng của bạn. Nhưng trước khi bắt đầu, nếu bạn hoàn toàn mới với Docker, tôi rất khuyến khích bạn xem Introduction to Docker để xây nền tảng vững chắc trước khi đi sâu vào mạng Docker.
Trình điều khiển mạng: nền tảng của Docker networking
Docker sử dụng các trình điều khiển mạng để xác định cách container kết nối và giao tiếp. Mỗi trình điều khiển quy định cách xử lý mạng của container. Do đó, mỗi trình điều khiển mạng chính của Docker có mức hiệu năng, mức độ cô lập và độ phức tạp khác nhau.
Tổng quan về các trình điều khiển mạng cốt lõi của Docker
Dưới đây là các trình điều khiển tích hợp chính mà Docker hỗ trợ:
Mỗi trình điều khiển ảnh hưởng đến cách container tương tác với nhau, với máy chủ và với mạng bên ngoài.
Bạn tò mò các kiểu mạng này phối hợp ra sao? Khóa học Intermediate Docker của chúng tôi đề cập chi tiết thực tiễn về mạng Docker, volumes và Compose. Hiểu các khác biệt này là chìa khóa để thiết kế kiến trúc an toàn và hiệu năng.
Tôi nên dùng loại mạng nào?
Chọn đúng trình điều khiển mạng phụ thuộc vào kiến trúc ứng dụng và mục tiêu vận hành của bạn:
Hãy cân nhắc các yếu tố như tô-pô máy chủ, nhu cầu bảo mật và chiến lược mở rộng khi chọn trình điều khiển mạng.
Vẫn đang phân vân mạng nào phù hợp khối lượng công việc của bạn? Tìm hiểu Docker so với Kubernetes trong triển khai thực tế với Kubernetes vs Docker.
Tạo mạng Docker tùy chỉnh
Mạng Docker tùy chỉnh cho phép bạn kiểm soát cách container giao tiếp nội bộ với nhau cũng như với hệ thống bên ngoài, giúp bạn cô lập dịch vụ tốt hơn, gán IP dự đoán được hoặc thiết kế kiến trúc hướng hiệu năng hay bảo mật.
Phần này sẽ hướng dẫn bạn từ những kiến thức cơ bản đến các tính năng nâng cao trong quá trình tạo mạng Docker tùy chỉnh, bao gồm các lệnh và cấu hình IP tùy biến.
Cấu trúc lệnh cơ bản
Để tạo một mạng tùy chỉnh, hãy dùng lệnh docker network create. Lệnh này cho phép bạn xác định trình điều khiển mạng, subnet và các tùy chọn khác để kiểm soát tốt hơn việc giao tiếp giữa container.
Dưới đây là ví dụ đơn giản dùng trình điều khiển bridge mặc định:
Lệnh này tạo một mạng bridge tên là demo-network. Docker trả về một ID mạng duy nhất để xác nhận. Tại thời điểm này, mạng đã tồn tại nhưng chưa kết nối container nào.
Bạn có thể xem các mạng hiện có bằng:
Để kết nối một container vào mạng mới, dùng cờ --network:
Để thêm một container hiện có vào mạng:
Và để gỡ nó ra:
Cuối cùng, khi không còn cần mạng nữa, bạn có thể xóa nó:
Để dọn dẹp tất cả mạng không dùng đến:
Quản lý địa chỉ IP nâng cao
Khi làm việc với hệ thống lớn hơn hoặc chính sách mạng cụ thể, Docker cho phép bạn quản lý thủ công dải địa chỉ IP trong các mạng tùy chỉnh.
Bạn có thể định nghĩa subnet và gateway bằng các cờ
--subnetvà--gateway:Để có thêm kiểm soát, hãy dùng:
--ip-range: Gán một pool IP mà container có thể lấy động, tách biệt với toàn bộ dải subnet.--aux-address: Dành riêng các địa chỉ IP cụ thể trong subnet cho hệ thống bên ngoài hoặc mục đích tài liệu.Ví dụ:
Thiết lập này:
Nếu bạn cần ví dụ có hướng dẫn hơn, hãy khám phá các chiến lược thiết lập nâng cao trong 10 Docker Project Ideas: From Beginner to Advanced.
Mạng trong chế độ Swarm
Chế độ Docker Swarm cho phép triển khai dịch vụ được điều phối trên một cụm các máy chủ Docker. Một phần quan trọng của điều phối này là mạng, đảm bảo các dịch vụ chạy trên các node khác nhau có thể giao tiếp liền mạch và an toàn với nhau.
Kiến trúc mạng nhận biết Swarm
Docker Swarm là giải pháp gom cụm gốc của Docker, biến một nhóm máy chủ Docker thành một động cơ ảo duy nhất. Nó cho phép bạn triển khai và quản lý container như các dịch vụ phân tán. Một trong những điểm mạnh lớn là mạng đa máy chủ, cho phép dịch vụ trên các máy khác nhau giao tiếp như thể chúng ở cùng một máy.
Mạng Swarm hỗ trợ hai loại lưu lượng chính:
Swarm sử dụng mạng overlay để hỗ trợ giao tiếp dịch vụ giữa các node và routing mesh để cân bằng tải lưu lượng bên ngoài qua các bản sao dịch vụ.
Tạo mạng cho swarm
Để hỗ trợ khám phá dịch vụ và giao tiếp đa máy chủ an toàn, Docker Swarm sử dụng mạng overlay với phạm vi
swarm. Các mạng này có thể được tạo thủ công hoặc tự động khi khởi chạy dịch vụ.Cách tạo một mạng overlay có phạm vi swarm:
Mạng này không bị giới hạn trong một máy chủ; bất kỳ node nào tham gia swarm đều có thể kết nối container vào đó. Bạn có thể kiểm tra bằng:
Tùy chỉnh mạng Overlay
Mạng overlay hỗ trợ cấu hình nâng cao, chẳng hạn:
--subnetvà--gatewayxác định tô-pô mạng.--opt encryptedbật mã hóa IPSEC cho lưu lượng giữa các container.--scope swarmđược áp dụng tự động với trình điều khiển overlay trong chế độ swarm.Hiểu các cờ --scope và --attachable
--scope swarm: Chỉ ra mạng khả dụng trên tất cả node trong swarm. Chỉ các dịch vụ swarm (không phải container độc lập) có thể dùng mạng này trừ khi chỉ định--attachable.--attachable: Cho phép container độc lập tham gia mạng có phạm vi swarm. Hữu ích để gỡ lỗi hoặc truy cập tạm thời.Ví dụ:
Điều này cho phép bạn gắn các container thông thường vào mạng swarm, ngoài các dịch vụ.
Cấu hình và xác thực mạng
Bạn cần đảm bảo các mạng Docker được cấu hình đúng để giao tiếp đúng giữa các container, cung cấp bảo mật cần thiết và dịch vụ hiệu năng. Docker có nhiều công cụ và lệnh để xem xét, khắc phục sự cố và xác thực cấu hình mạng của bạn.
Xác minh cấu hình mạng
Để xem chi tiết cấu hình của bất kỳ mạng Docker nào, hãy dùng lệnh docker network inspect. Bạn sẽ nhận được đầu ra JSON chi tiết bao gồm:
bridge,overlay, v.v.)local,swarm)Ví dụ, bạn có thể làm như sau:
Hãy chú ý các trường chính như:
Kỹ thuật xác thực
Để xác nhận mạng hoạt động như mong đợi:
Điều này xác nhận đường hầm VXLAN đang hoạt động và cấu hình đúng. Nếu thiếu hoặc sai, dịch vụ có thể không truy cập được giữa các node.
Kiểm tra hành vi DNS
Container kết nối vào các mạng do người dùng định nghĩa sẽ dùng máy chủ DNS nhúng của Docker. Để xác nhận, hãy kiểm tra /etc/resolv.conf bên trong container và thử phân giải tên dịch vụ.
Xác thực định tuyến gateway
Với các container trên nhiều mạng, Docker chọn gateway mặc định dựa trên gw-priority cao nhất. Để áp đặt định tuyến đúng, gán mức ưu tiên rõ ràng khi tạo container:
Dùng nhật ký và công cụ chẩn đoán
Theo dõi nhật ký container để tìm lỗi kết nối, và dùng các công cụ như curl, dig và ip a bên trong container để gỡ lỗi cấp thấp.
Tóm lại, xác thực cấu hình mạng Docker giúp đảm bảo giao tiếp container trơn tru và giảm thiểu lỗi bất ngờ trong ứng dụng đa dịch vụ.
Và điều này dẫn chúng ta đến phần tiếp theo.
Tối ưu bảo mật và hiệu năng
Mạng trong thế giới container không chỉ là bật phương thức giao tiếp. Nhiều trường hợp đòi hỏi cung cấp cô lập cần thiết đồng thời đảm bảo hiệu năng tối đa. Khi bảo vệ kiến trúc và cung cấp dịch vụ, phân đoạn và thông lượng có thể giúp bạn đạt được điều đó.
Chiến lược phân đoạn mạng
Phân đoạn mạng là thực hành nền tảng và phương thức bảo mật cho ứng dụng container hóa. Bằng cách gán container vào các mạng Docker riêng biệt, bạn có thể tách bạch các mối quan tâm chéo như phân đoạn cho dịch vụ frontend, backend và cơ sở dữ liệu. Điều này giúp giảm thiểu rủi ro lộ lọt và tấn công một cách chủ động.
Bạn có thể tận dụng mạng do người dùng định nghĩa để quản lý ranh giới giao tiếp. Container ở các mạng khác nhau sẽ không thể giao tiếp với nhau trừ khi bạn chủ động kết nối chúng. Ví dụ, nếu bạn đặt container cơ sở dữ liệu trên mạng chỉ nội bộ, các dịch vụ công khai sẽ không thể truy cập trực tiếp nó.
Quy tắc và kiểm soát tường lửa tích hợp
Theo mặc định, Docker triển khai các quy tắc iptables để hạn chế các điểm cuối giao tiếp giữa container và thế giới bên ngoài.
Một số cách để mở rộng phân đoạn này gồm:
daemon.jsoncủa daemon Docker để ngăn container giao tiếp trừ khi ở cùng một mạng do người dùng định nghĩa.--cap-drop,--read-onlyvà--no-new-privileges.Kỹ thuật tối ưu hiệu năng
Có nhiều cách bạn có thể cải thiện hiệu năng thông qua tối ưu hóa với Docker.
Cải thiện thông lượng mạng
Chọn đúng trình điều khiển mạng ảnh hưởng trực tiếp đến hiệu năng. Ví dụ:
Tránh quá tải mạng bridge mặc định, và tạo mạng riêng cho dịch vụ nặng hoặc nhóm logic.
Dò hiệu năng với iperf3 và số liệu
Để đo hiệu năng mạng, hãy dùng công cụ dò như iperf3:
Bạn cũng có thể theo dõi thống kê mạng bằng:
docker stats– CPU, bộ nhớ và I/O mạng theo thời gian thực./proc/net/devtừ trong container.Dò hiệu năng định kỳ giúp phát hiện nút thắt sớm và định hướng quyết định về bố trí container, chọn trình điều khiển hoặc nâng cấp mạng máy chủ.
Khắc phục sự cố mạng
Ngay cả khi tuân thủ thực hành tốt nhất, sự cố mạng vẫn có thể xảy ra. Chẩn đoán và khắc phục nhanh là chìa khóa duy trì thời gian hoạt động. Phần này cung cấp công cụ và kỹ thuật để xác định và sửa các vấn đề mạng Docker thường gặp.
Chẩn đoán vấn đề mạng
Một container tối giản có thể thiếu công cụ như ping, dig hoặc netstat, gây khó gỡ lỗi. Thay vì chỉnh sửa container, hãy khởi chạy một container mới chia sẻ namespace mạng của nó:
Sau đó cài công cụ mạng:
Ngoài ra, hãy dùng nicolaka/netshoot, một image chuyên dụng chứa nhiều công cụ chẩn đoán:
Các công cụ như ip, nslookup, netstat và traceroute sẽ giúp xác định vấn đề định tuyến hoặc DNS.
Giải quyết vấn đề kết nối
Một số nguyên nhân phổ biến và cách khắc phục:
Subnet xung đột
Tránh các subnet chồng lấn giữa các mạng Docker hoặc với mạng vật lý của máy chủ. Dùng
--subnetđể xác định dải không xung đột.Cổng bị tường lửa máy chủ chặn
Đảm bảo các cổng Docker cần thiết được mở:
Khắc phục sự cố hiệu quả kết hợp giữa chẩn đoán và hiểu rõ cách container tương tác với mạng của chúng. Với công cụ và cách tiếp cận đúng, hầu hết vấn đề có thể được cô lập và giải quyết trong vài phút.
Kết luận
Docker Networking là thành phần nền tảng của kiến trúc container hóa, cho phép giao tiếp an toàn, hiệu quả và có thể mở rộng giữa các dịch vụ, dù chạy trên một máy chủ hay trên một cụm phân tán.
Với hỗ trợ tích hợp cho nhiều trình điều khiển mạng, quản lý IP có thể tùy biến và mạng overlay gốc cho Swarm, Docker trao quyền cho nhà phát triển và đội DevOps cô lập khối lượng công việc, kiểm soát luồng dữ liệu và tối ưu hiệu năng trong môi trường phức tạp.
Không phải giải pháp phù hợp cho mọi tình huống, nhưng nếu dùng một cách thấu đáo, nó mang lại năng lực vững chắc để xây dựng microservices hiện đại, pipeline tự động hóa và hệ thống phân tán an toàn.
Muốn tiếp tục mài giũa kỹ năng Docker và containerization?
Dưới đây là một số tài nguyên được khuyến nghị cao để tiếp tục hành trình học tập của bạn: