docker网络的5种模式
none
在使用 none 模式后,Docker 容器不会进行任何网络配置,没有网卡、没有IP也没有路由,因此默认无法与外界通信,需要手动添加网卡配置IP等,所以极少使用
none网络特点
使用参数 --network none 指定
默认无网络功能,无法和外部通信
无法实现端口映射
适用于测试环境
host
直接使用宿主机的网卡和IP地址, 此模式由于直接使用宿主机的网络无需转换,网络性能最高,但是各容器内使用的端口不能相同,适用 于运行容器端口比较固定的业务
host网络特点
使用参数 --network host 指定
共享宿主机网络
各容器网络无隔离
网络性能无损耗
网络故障排除相对简单
容易产生端口冲突
网络资源无法分别统计
不支持端口映射
[root@kv1 ~]#docker run -it --rm --network host alpine:20240329
/ #
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP qlen 1000
link/ether 00:0c:29:a5:08:ac brd ff:ff:ff:ff:ff:ff
inet 10.0.0.100/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.0.0.10/24 scope global secondary etho:1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fea5:8ac/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP qlen 1000
link/ether 00:0c:29:a5:08:b6 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.100/24 brd 192.168.10.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fea5:8b6/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:99:0f:fd:03 brd ff:ff:ff:ff:ff:ff
inet 172.27.0.1/24 brd 172.27.0.255 scope global docker0
valid_lft forever preferred_lft forever
bridge
默认模式
会创建容器为每一个容器分配自己的网络信息,并将容器连接到一个虚拟网桥与外界通信,可以和外部网络之间进行通信,通过SNAT访问外网,使用DNAT可以让容器被外部主机访问
此模式宿主机需要启动ip_forward功能
bridge网络特点:
网络资源隔离: 不同宿主机的容器无法直接通信,各自使用独立网络
无需手动配置: 容器默认自动获取172.17.0.0/16的IP地址,此地址可以修改
可访问外网: 利用宿主机的物理网卡,SNAT连接外网
外部主机无法直接访问容器: 可以通过配置DNAT接受外网的访问
低性能较低: 因为可通过NAT,网络转换带来更的损耗
端口管理繁琐: 每个容器必须手动指定唯一的端口,容器产生端口冲容
修改Docker网络地址
方式一1.修改桥接地址
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
--bip=10.100.0.1/24
方式二2.修改Bridge网络配置
[root@ubuntu1804 ~]#vim /etc/docker/daemon.json
{
"hosts": ["tcp://0.0.0.0:2375", "fd://"],
"bip": "192.168.100.100/24", #分配docker0网卡的IP,24是容器IP的netmask
"fixed-cidr": "192.168.100.128/26", #分配容器IP范围,26不是容器IP的子网掩码,只表示地址范围
"fixed-cidr-v6": "2001:db8::/64",
"mtu": 1500,
"default-gateway": "192.168.100.200", #网关必须和bip在同一个网段
"default-gateway-v6": "2001:db8:abcd::89",
"dns": [ "1.1.1.1", "8.8.8.8"]
}
container
用此模式创建的容器需指定和一个已经存在的容器共享一个网络,而不是和宿主机共享网络,新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个被指定的已经存在的容器共享IP和端口范围,因此这个容器的端口不能和被指定容器的端口冲突,除了网络之外的文件系统、进程信息等仍然保 持相互隔离,两个容器的尽程可以通过lo网卡进行通信
container模式特点
- 使用参数 ---network container:名称或ID 指定
- 与宿主机网络空间隔离
- 空器间共享网络空间,直接使用对方的网络 第一个容器的网络可能是bridge,或none,或者host,而第二个容器模式依赖于第一个容器,它们共享网络
- 如果第一个容器停止,将导致无法创建第二个容器
- 第二个容器可以直接使用127.0.0.1访问第一个容器
- 适合频繁的容器间的网络通信
- 默认不支持端口映射,较少使用
自定义网络模式
使用自定义的网段地址,网关等信息,实现不用集群应用的独立网络管理,在同一个网络内,可以直接使用容器名相互访问,非常便利
注意:自定义网络内的容器可以直接通过容器名进行相互的访问,无需使用--link
[root@master1 ~]#docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
创建自定义网络
docker network create -d <mode> --subnet <CIDR> --gateway <网关> <自定义网络名称>
#注意mode不支持host和none,默认是bridge模式
-d <mode> 可省略,默认为bridge
查看自定义网络信息
docker network inspect <自定义网络名称或网络ID>
引用自定义网络
docker run --network <自定义网络名称> <镜像名称>
docker run --net <自定义网络名称> --ip <指定静态IP> <镜像名称>
#注意:静态IP只支持自定义网络模型
#指定自定义网络中的容器的别名
docker run --network <自定义网络名称> --network-alias list <镜像名称>
删除自定义网络
doccker network rm <自定义网络名称或网络ID>
注意:内置的三个网络无法删除
同一个宿主机之间不同网络的容器通信
开两个容器,一个使用自定义网络容器,一个使用默认bridge网络容器,默认因iptables 规则导致无法通信
1.修改iptables实现同意宿主机上的不同网络的容器间通信
2.使用docker network connect命令实现同一宿主机不同网络的容器间相互通信,将container连入指定的network中,使此container可以与network中的其他容器进行通信
docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
--alias strings Add network-scoped alias for the container
--driver-opt strings driver options for the network
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
--link list Add link to another container
--link-local-ip strings Add a link-local address for the container
将container与指定的network断开连接,使此container可以与container中的其他容器进行无法通信
如果将容器从自定义的网络删除,将加入默认的网络,即docker0网桥中,获取172.17.0.0/16
docker network disconnect [OPTIONS] NETWORK CONTAINER
Disconnect a container from a network
Options:
-f, --force Force the container to disconnect from a network
例如test1和test2容器默认无法通信,让默认网络中容器test1可以连通自定义网络test-net的容器test2,之后在test1容器内可以看到新添加了一个网卡,并且分配了test-net网络中的IP信息,test1可以连接test2容器,但test2容器没有变化,仍然无法连接test1,将自定义网络中的容器test2也加入到默认网络中,使之和默认网络中的容器test1通信 ,确认自定义网络的容器test2中添加了新网卡,并设置默认网络的IP信息 ,相当于test1和test2各添加了新网卡。
实现跨宿主机的容器之间网络互联
同一个宿主机之间的各个容器之间是可以直接通信的,但是如果访问到另外一台宿主机的容器,默认是不能通信的 利用桥接实现跨宿主机的容器间互联 利用NAT实现跨主机的容器间互联,在宿主机上做一个网络路由就可以实现A宿主机的容器访问B主机的容器的目的(此方式只适合小型网络,复杂的网络可以使用其他网络插件:flannel和calico)