Docker网络配置的几种常见模式
前言
经常跟Docker打交道,对于容器net参数有了一定程度的认识,常用以下几种:
- none
- bridge
- host
- macvlan
分解
none
字面意思,用于创建无网络的容器。
docker run -it --rm --net none ubuntu:20.04 bash
bridge
默认net参数,bridge使得容器与主机之间存在一层NAT
例如主机分配的网桥地址为172.17.0.1容器则为172.17.0.3
容器可以正常访问外网但外部无法直接访问NAT背后的容器
端口转发需要使用-p
参数
docker run -it --rm -p 8022:22 ubuntu:20.04 bash
host
和主机共享同一个ip因此默认转发所有端口,无网络隔离
无需使用-p
转发端口但服务需要注意规避主机已有端口
docker run -it --rm --net host ubuntu:20.04 bash
macvlan
这个比较特殊,脱胎于kernel的一种模式,放在最后说。
该模式允许容器分配一个有效mac地址并向路由申请一个独立ip地址
相比ipvlan具有高性能的优点,缺陷是vlan的存在使得主机和容器的网络隔离无法互相访问(均可被第三方访问)
部分网卡默认丢弃不属于自己mac地址的数据包,一般建议打开混杂(promisc)后建立macvlan(brige模式)
In bridge mode, macvlan traffic goes through a physical device on the host.
ip link set enp0s3 promisc on
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=enp0s3 -o macvlan_mode=bridge macnet
# assign a IP address
docker run -it --name valn_container --network macnet --ip=192.168.1.180 ubuntu:20.04 bash
# or specify mac and dns on your own
docker run -it --name valn_container --network macnet --ip=192.168.1.180 --dns=114.114.114.114 --mac-address AA:BB:CC:DD:EE:FF ubuntu:20.04 bash