Tổng quan
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
- 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ủabridge
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ềndb
, mà không cần cấu hình DNS. Trong khi đó, các container củabridge
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àobridge
mặc định. Điều này tạo ra rủi ro rò rỉ thông tin. Sử dụngbridge
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ỏibridge
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ủabridge
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ácbridge
tự định nghĩa được tạo ra bởi lệnhdocker 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ênbridge
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
hayconfigs
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:
One Reply to “Sử dụng mạng Docker Bridge”