Sử dụng mạng Docker Bridge

Tổng quan

Docker Bridge Network Driver
https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/

Bridge là một thuật ngữ networking, ám chỉ một thiết bị nằm ở tầng Link của mô hình OSI, đóng vai trò chuyển tiếp lưu thông giữa các phân đoạn của mạng. Bridge có thể là một thiết bị phần cứng hoặc một phần mềm (trong bài viết này gọi là Linux bridge). Mạng các thiết bị đứng sau một bridge được gọi là mạng bridge.

Docker sử dụng một Linux bridge để triển khai mạng Docker bridge (trong bài viết này gọi tắt là bridge), nhằm giúp các container được kết nối vào cùng một mạng bridge để giao tiếp với nhau, trong khi vẫn giữ được sự cô lập với các container khác nằm ngoài mạng.

Mạng bridge được sử dụng cho các container có chung Docker deamon. Để thực hiện thao tác tương đương cho các container nằm trên các Docker daemon khác nhau, cần sử dụng đến mạng overlay thông qua driver mạng Docker Overlay.

Khi khởi động Docker, một bridge mặc định sẽ được tạo ra tự động, và các container khởi động sau đó sẽ mặc định được kết nối vào bridge này, trừ khi chúng được chỉ thị đặc biệt.

Quản trị viên có thể tự định nghĩa một bridge riêng.

Sự khác nhau giữa mạng bridge mặc-định và tự-định-nghĩa

bridge3
https://docs.docker.com/engine/tutorials/networkingcontainers/
  • Các bridge tự định nghĩa cung cấp giải pháp DNS tự động giữa các container. Các container của bridge tự định nghĩa có thể nhận biết được các container còn lại thông qua tên hay bí danh. Một container tên là app có thể kết nối tới container tên là db thông qua tên miền db, mà không cần cấu hình DNS. Trong khi đó, các container của bridge mặc định chỉ có thể truy cập tới các container khác thông qua địa chỉ IP, trừ khi chúng được --link (một giải pháp cổ-điển) với nhau. Các link cần phải được tạo ra từ cả hai phía, kiến cho giải pháp này trở nên phức tạp hơn. Một cách khác là cấu hình /etc/hosts cho các container cần nhận thức nhau, nhưng giải pháp này khiến thao tác debug trở nên khó khăn hơn.
  • Các bridge tự định nghĩa cô lập hơn. Các container được tạo ra mà không được chỉ thị --network sẽ được kết nối vào bridge mặc định. Điều này tạo ra rủi ro rò rỉ thông tin. Sử dụng bridge tự định nghĩa sẽ giúp cô lập phạm vi kết nối xuống còn chỉ duy nhất các container trong mạng.
  • Các container có thể được cắm và rút khỏi bridge tự định nghĩa tại runtime. Trong khi đó, để cắm rút container khỏi bridge mặc định, cần phải dừng xóa và tạo lại container với một --network khác.
  • Mỗi bridge tự định nghĩa sử dụng các Linux bridge có thể cấu hình riêng biệt. Linux bridge của bridge mặc định cũng có thể cấu hình, nhưng việc thay đổi cấu hình xảy ra bên ngoài Docker, nên sẽ cần phải khởi động lại Docker. Các Linux bridge của các bridge tự định nghĩa được tạo ra bởi lệnh docker network create và được điều khiển bởi Docker nên sẽ không yêu cầu khởi động lại.
  • Các container được --link trên bridge mặc định chia sẻ tập biến môi trường với nhau. Và --link là cơ chế duy nhất có khả năng làm được việc đó một cách tự nhiên. Tuy vậy, các phương pháp thay thế tạo hiệu quả tương đương không phải là không có:
    • Các container có thể mount chung một tập tin hay thư mục
    • Các container có thể được khởi động trong cùng một docker-compose stack và theo đó có thể sử dụng chung một tập tin cấu hình biến môi trường.
    • Các container có thể lấy cấu hình từ secrets hay configs của Docker Swarm nếu chúng được khởi động trong swarm mode.

Quản trị mạng bridge tự-định-nghĩa

Để định nghĩa một bridge, sử dụng lệnh docker network create:

$ docker network create my-net

Các thông số subnet, dải IP, gateway… có thể được cấu hình trong lúc khởi tạo. Chi tiết có thể tham khảo tại tài liệu docker network create, hay bằng docker network create --help.

Để hủy bỏ một bridge, sử dụng lệnh docker network rm, sẽ cần phải rút các container đang kết nối vào mạng này trước.

$ docker network rm my-net

Kết nối container tới bridge tự định nghĩa

Khi tạo một container, cờ --network có thể được sử dụng một hoặc nhiều lần để kết nối container vào mạng. Trong ví dụ dưới đây, my-nginx được kết nối vào mạng my-net. Nó cũng xuất bản port 80 của nó tới 8080 của máy host, nhờ đó các client bên ngoài có thể truy xuất vào 80. Tất cả các container khác có kết nối vào my-net đều có thể truy cập tất cả các port của my-nginx, và ngược lại.

$ docker create --name my-nginx \
  --network my-net \
  --publish 8080:80 \
  nginx:latest

Để kết nối các container đang hoạt động, vào bridge tự định nghĩa, sử dụng câu lệnh docker network connect. Ví dụ dưới đây kết nối my-nginx (đang hoạt động) vào my-net (đã được khởi tạo từ trước):

$ docker network connect my-net my-nginx

Rút container khỏi mạng tự-định-nghĩa

Để rút một container đang hoạt động khỏi một bridge tự định nghĩa, sử dụng lệnh docker network disconnect. Ví dụ dưới đây rút container my-nginx khỏi my-net:

$ docker network disconnect my-net my-nginx

Tài nguyên tham khảo:

_

1 Comment

Leave a Comment

Your email address will not be published. Required fields are marked *