- Networking Overview
- Use bridge networks
- Use host networking
- Use Macvlan networks
- Disable networking for a container
Các loại Network driver
Default bridge network
là driver mặc định được gán cho container khi nó được tạo ra. Nó thường được sử dụng khi app của bạn chạy trong containers độc lâp nhưng cần kết nối.User-defined bridge networks
là sự lựa chọn tốt nhất khi bạn cần nhiều container trên cùng một docker host kết nối với nhau.Host Networks
dùng cho các container độc lập, loại bỏ sự cách ly mạng giữa các container và docker host, sử dụng mạng trực tiếp của host. Sử dụng tốt nhất khi các lớp mạng không nên bị cô lập khỏi docker host, nhưng lại muốn các khía cạnh khác của container bị cô lập.Macvlan networks
cho phép bạn chỉ định địa chỉ MAC cho container, làm cho nó xuất hiện như một physical device trên network của bạn. Khi đó docker deamon sẽ định tuyến các traffic tới các container bằng địa chỉ MAC. Sử dụng tốt nhất khi bạn migrate các setup hoặc muốn container của bạn giống như một physical hots trong network của bạn với một địa chỉ MAC duy nhất cho mỗi máy.
Khi cài đặt Docker, mặc định sẽ tạo ra 3 network driver là bridge
, host
, only
, và một virtual bridge là docker0
. Docker sẽ tự động tim một subnet chưa được dùng trên host gán cho docker0
.
Sau đó, khi chúng ta khởi động một container (với bridge network), một veth (Virtual Ethernet) sẽ được tạo ra nối 1 đầu với docker0 và một đầu sẽ được nối với interface eth0 trên container.
So sánh sự tương đương giữa các chế độ card mạng với các nền tảng ảo hóa khác:
General Virtualization Term | Docker Network Driver |
---|---|
NAT Network | bridge |
Bridged | macvlan, ipvlan (experimental since Docker 1.11) |
Private / Host-only | bridge |
Overlay Network / VXLAN | overlay |
Khi bắt đầu với docker, một Default bridge network
tự động đươc tạo ra gọi lại bridge
, và bạn cũng có thể tự định nghĩa một User-defined bridge networks
, nó vẫn sử dụng bridge driver nhưng do mình tự định nghĩa.
-
User-defined bridge networks
cung cấp sự cô lập và khả năng tương tác tốt hơn giữa các ứng dụng containers. Các container sử dụng chung mạng này sẽ tự động phơi ra tất các các port với nhau nhưng không phơi ra bên ngoài. Điều này cho phép các container giao tiếp với nhau dễ dàng mà không cần lo lắng về sự tấn công từ bên ngoài. -
User-defined bridge networks
cung cấp việc tự động phân giải tên miền giữa các container, các container có thể giao tiếp và liên lạc với nhau bằng tên hoặc alias của nó. -
Các container có thể được gắn vào hoặc tách ra khỏi mạng một cách nhanh chóng.
-
Mỗi một
User-defined bridge networks
được định nghĩa sẽ tạo ra một bridge có thể custom -
Các container được liên kết trong
default bridge network
có thể chia sẻ biến môi trường.
Tạo một user-defined bridge network:
$ docker network create <net-name>
Xóa network:
$ docker network rm <net-name>
Xem danh sách các mạng đã có:
$ docker network ls
Xem chi tiết một mạng cụ thể:
$ docker network inspect <net-name>
Tạo một container mới kết nối tới network đã được định nghĩa sẵn
$ docker create --name my-nginx \
--network <net-name> \
--publish 8080:80 \
nginx:latest
Kết nối tới mạng đã có sẵn:
$ docker network connect my-net my-nginx
$ docker network disconnect my-net my-nginx
Mặc định, traffic từ container kết nối tới default bridge network sẽ không được forword ra ngoài mạng. Để cho phép forwarding, cấu hình như sau:
-
Configure the Linux kernel to allow IP forwarding:
$ sysctl net.ipv4.conf.all.forwarding=1
-
Change the policy for the iptables FORWARD policy from DROP to ACCEPT.
$ sudo iptables -P FORWARD ACCEPT
Khi tạo container, nếu không sử dụng option --network
thì mặc định container sẽ được kết nối với mạng này
Để config default bridge network
, bạn cần chỉ định các tùy chọn trong deamon.json
.
{
"bip": "192.168.1.5/24",
"fixed-cidr": "192.168.1.5/25",
"fixed-cidr-v6": "2001:db8::/64",
"mtu": 1500,
"default-gateway": "10.20.1.1",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}
Restart lại docker để apply các thay đổi
Nếu bạn sử dụng host driver
cho container, mạng của container sẽ không được cô lập với Docker host. Ví dụ:
-
Tạo và chạy một container như một tiến trình riêng biệt với các tùy chọn
--rm
nghĩa là tự động xóa khistop/exit
container.$ docker run --rm -d --network host --name my_nginx nginx
-
Giờ ta có thể truy cập ngnix bằng browser qua http://localhost:80/.
-
Kiểm tra:
-
Liệt kê tất cả các network interface và xác định xem đã tạo được mạng mới vừa rồi chưa
$ ip addr show
-
Kiểm tra port
80
của ngnix$ sudo netstat -tulpn | grep :80
-
-
Stop the container. Nếu khi tạo không có tùy chọn
--rm
để tự động xóa, thì sử dụng command sau:docker container stop my_nginx
Sử dụng tùy chọn --driver macvlan
, và cần chỉ ra parent
là một interface mà các traffic sẽ đi qua trên docker host
$ docker network create -d macvlan \
--subnet=172.16.86.0/24 \
--gateway=172.16.86.1 \
-o parent=eth0 pub_net
If you specify a parent interface name with a dot included, such as eth0.50, Docker interprets that as a sub-interface of eth0 and creates the sub-interface automatically.
$ docker network create -d macvlan \
--subnet=192.168.50.0/24 \
--gateway=192.168.50.1 \
-o parent=eth0.50 macvlan50
Trong ví dụ bên trên, bạn đang sử dụng L3 bridge, nếu muốn sử dụng L2 bridge thì sử dụng ipvlan
thay vì macvlan. Sử dụng -o ipvlan_mode=l2
$ docker network create -d ipvlan \
--subnet=192.168.210.0/24 \
--subnet=192.168.212.0/24 \
--gateway=192.168.210.254 \
--gateway=192.168.212.254 \
-o ipvlan_mode=l2 ipvlan210
Nếu muốn config IPv6 thì cần sử dụng dual-stack IPv4/IPv6 Macvlan networks.
$ docker network create -d macvlan \
--subnet=192.168.216.0/24 --subnet=192.168.218.0/24 \
--gateway=192.168.216.1 --gateway=192.168.218.1 \
--subnet=2001:db8:abc8::/64 --gateway=2001:db8:abc8::10 \
-o parent=eth0.218 \
-o macvlan_mode=bridge macvlan216
Bạn có thể sử dụng --network none
khi start container. Ví dụ:
- Tạo một container
$ docker run --rm -dit \
--network none \
--name no-net-alpine \
alpine:latest \
ash
-
Check the container’s network stack, chú ý là
eth0
không được tạo ra~# docker exec no-net-alpine ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
Và sẽ không có routing table, lệnh sau sẽ trả về none
$ docker exec no-net-alpine ip route
-
Stop container
$ docker container rm no-net-alpine
Container có thể sẽ tự động được xóa bởi vì nó được tạo với flag --rm
$ docker stop no-net-alpine
$ docker container stop <container-name>
$ docker container rm <container-name>
$ docker network rm <network-name>