docker 的容器五种网络模型工作机制
Docker 网络管理
docker 容器创建后,通常需要和其它主机或容器进行网络通信
官方文档:
https://docs.docker.com/network/
Docker的默认的网络通信

Docker安装后默认的网络设置
Docker服务安装完成之后,默认在每个宿主机会生成一个名称为docker0的网卡其IP地址都是
172.17.0.1/16
范例: 安装Docker的默认的网络配置
[root@master2 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:9e:7c:16 brd ff:ff:ff:ff:ff:ff altname enp2s1 inet 192.168.3.61/24 brd 192.168.3.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe9e:7c16/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 46:8a:23:82:0d:54 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever [root@master2 ~]#
dnf install -y epel-release
dnf install -y bridge-utils
brctl show
创建容器后的网络配置
veth(Virtual Ethernet)是Linux内核中的一种虚拟网络设备,通常用于连接两个网络命名空间。veth
设备总是成对出现,当在一个网络命名空间中创建veth设备时,会同时创建两个端点。veth设备的两个
端点可以被看作是一个虚拟的以太网电缆,任何发送到其中一个端点的数据包都会被立即从另一个端点
传出。以下是veth设备的一些主要特性:
1. 命名空间间通信:veth设备主要用于连接不同的网络命名空间,允许它们之间进行通信。这使得在一个隔离的环境中运行的进程可以与外部世界交互,而不会影响到其它网络命名空间。
2. 成对出现:veth设备总是成对创建的,形成一个虚拟的双向通道。当数据包发送到一个端点时,它会从另一个端点出来。因此,你可以把veth设备看作是一个虚拟的以太网电缆。
3. 灵活性:veth设备的两个端点可以分别位于不同的网络命名空间中,甚至可以在同一命名空间中。这为设置复杂的网络拓扑提供了很大的灵活性。
4. 和其他网络设备相互操作:veth设备可以和Linux的其他网络设备(如bridge、veth pair、physical NIC等)一起使用,创建复杂的网络配置。
veth设备在一些网络虚拟化技术中被广泛使用,例如Docker容器。每一个Docker容器都有自己的网络
命名空间,Docker使用veth设备连接容器的网络命名空间和主机的网络命名空间,使得容器可以和外部
网络进行通信。
每次新建容器后
- 宿主机多了一个虚拟网卡vethxxxxx,和容器的网卡组合成一个网卡,比如: 137:veth8ca6d43@if136,而在容器内的网卡名为136,可以看出和宿主机的网卡之间的关联
- 容器会自动获取一个172.17.0.0/16网段的随机地址,默认从172.17.0.2开始,第二次容器为172.17.0.3,以此类推
- 容器获取的地址并不固定,每次容器重启,可能会发生地址变化
创建第一个容器后的网络状态
范例: 创建容器,容器自动获取IP地址
docker run -it --name rocky01 --rm rockylinux:9 bash
dnf install ethtool net-tools iproute -y
#if14 表示容器的eth0网卡对应宿主机的14号网卡
[root@6673d1863052 /]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 92:d8:9e:97:3f:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
#宿主机查看14号网卡
[root@master2 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:9e:7c:16 brd ff:ff:ff:ff:ff:ff altname enp2s1 inet 192.168.3.61/24 brd 192.168.3.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe9e:7c16/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 46:8a:23:82:0d:54 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::448a:23ff:fe82:d54/64 scope link valid_lft forever preferred_lft forever 14: vethfc562f3@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether fe:b1:ff:25:f7:40 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::fcb1:ffff:fe25:f740/64 scope link valid_lft forever preferred_lft forever [root@master2 ~]#
#查看容器的类型为veth
[root@6673d1863052 /]# ethtool -i eth0 driver: veth version: 1.0 firmware-version: expansion-rom-version: bus-info: supports-statistics: yes supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no
#查看容器网卡和宿主机网卡的对应关系
[root@6673d1863052 /]# ethtool -S eth0 NIC statistics: peer_ifindex: 14 rx_queue_0_xdp_packets: 0 rx_queue_0_xdp_bytes: 0 rx_queue_0_drops: 0 rx_queue_0_xdp_redirect: 0 rx_queue_0_xdp_drops: 0 rx_queue_0_xdp_tx: 0 rx_queue_0_xdp_tx_errors: 0 tx_queue_0_xdp_xmit: 0 tx_queue_0_xdp_xmit_errors: 0 [root@6673d1863052 /]#
#查看宿主机网卡类型
root@master2 ~]# ethtool -i vethfc562f3 driver: veth version: 1.0 firmware-version: expansion-rom-version: bus-info: supports-statistics: yes supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no [root@master2 ~]#
范例: 查看新建容器后桥接状态
[root@master2 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.468a23820d54 no vethfc562f3
创建第二个容器后面的网络状态
范例: 再次创建第二个容器
docker run -it --name rocky02 --rm rockylinux:9 bash
dnf install ethtool net-tools iproute -y
root@224530316b56 /]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether b6:40:10:b7:dd:b7 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever [root@224530316b56 /]#
范例: 新建第二个容器后宿主机又多了一个虚拟网卡
root@master2 ~]# [root@master2 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:9e:7c:16 brd ff:ff:ff:ff:ff:ff altname enp2s1 inet 192.168.3.61/24 brd 192.168.3.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe9e:7c16/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 46:8a:23:82:0d:54 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::448a:23ff:fe82:d54/64 scope link valid_lft forever preferred_lft forever 14: vethfc562f3@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether fe:b1:ff:25:f7:40 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::fcb1:ffff:fe25:f740/64 scope link valid_lft forever preferred_lft forever 15: veth2ce33b6@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether fa:47:fa:e8:6e:9b brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet6 fe80::f847:faff:fee8:6e9b/64 scope link valid_lft forever preferred_lft forever [root@master2 ~]#
范例: 查看新建第二个容器后桥接状态
[root@master2 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.468a23820d54 no veth2ce33b6 vethfc562f3
容器间的通信
同一个宿主机的不同容器可相互通信
默认情况下
同一个宿主机的不同容器之间可以相互通信
不同宿主机之间的容器IP地址重复,默认不能相互通信
修改默认docker0网桥的网络配置
默认docker后会自动生成一个docker0的网桥,使用的IP是172.17.0.1/16,可能和宿主机的网段发生冲突,
可以将其修改为其它网段的地址,避免冲突
范例: 将docker0的IP修改为指定IP
#方法1
vim /etc/docker/daemon.json
{ "bip": "192.168.100.1/24", "registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"] }
#方法2
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
--bip=192.168.100.1/24
systemctl daemon-reload
systemctl restart docker.service
#注意两种方法不可混用,否则将无法启动docker服务
Docker 网络连接模式(重点)
网络模式介绍

Docker 的网络支持 5 种网络模式:
- none
- host
- bridge
- container
- network-name
范例: 查看默认的网络模式有三个
docker network ls
[root@master2 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 9e751de0f76a bridge bridge local c169b2366f46 host host local 29bfa655c46d none null local
网络模式指定
默认新建的容器使用Bridge模式,创建容器时,docker run 命令使用以下选项指定网络模式
格式
docker run --network <mode> docker run --net=<mode> <mode>: 可是以下值 none bridge host container:<容器名或容器ID> <自定义网络名称>
Bridge网络模式
Bridge 网络模式架构(默认模式)

本模式是docker的默认模式,即不指定任何模式就是bridge模式,也是使用比较多的模式,此模式创建
的容器会为每一个容器分配自己的网络 IP 等信息,并将容器连接到一个虚拟网桥与外界通信
可以和外部网络之间进行通信,通过SNAT访问外网,使用DNAT可以让容器被外部主机访问,所以此模
式也称为NAT模式
此模式宿主机需要启动ip_forward功能
bridge网络模式特点
- 网络资源隔离: 不同宿主机的容器无法直接通信,各自使用独立网络
- 无需手动配置: 容器默认自动获取172.17.0.0/16的IP地址,此地址可以修改
- 可访问外网: 利用宿主机的物理网卡,SNAT连接外网
- 外部主机无法直接访问容器: 可以通过配置DNAT接受外网的访问
- 低性能较低: 因为可通过NAT,网络转换带来更的损耗
- 端口管理繁琐: 每个容器必须手动指定唯一的端口,容器产生端口冲容
Bridge 模式的默认设置
范例: 查看bridge模式信息
docker network inspect bridge
Host 模式

如果指定host模式启动的容器,那么新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网
卡和IP地址,因此在容器里面查看到的IP信息就是宿主机的信息,访问容器的时候直接使用宿主机IP+容
器端口即可,不过容器内除网络以外的其它资源,如: 文件系统、系统进程等仍然和宿主机保持隔离
此模式由于直接使用宿主机的网络无需转换,网络性能最高,但是各容器内使用的端口不能相同,适用
于运行容器端口比较固定的业务
Host 网络模式特点:
- 使用参数 --network host 指定
- 共享宿主机网络
- 默认自动加载宿主机的/etc/hosts文件
- 各容器网络无隔离
- 网络性能无损耗
- 网络故障排除相对简单
- 容易产生端口冲突
- 网络资源无法分别统计
- 不支持端口映射
范例:
#查看宿主机的网络设置
[root@master2 ~]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 ether d6:b1:9b:f0:93:de txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 2 overruns 0 carrier 0 collisions 0 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.61 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::20c:29ff:fe9e:7c16 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:9e:7c:16 txqueuelen 1000 (Ethernet) RX packets 526 bytes 60835 (59.4 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 342 bytes 50399 (49.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@master2 ~]#
docker run -it --rm --name c1 --network host alpine:3.23.3
[root@master2 ~]# [root@master2 ~]# docker run -it --rm --name c1 --network host alpine:3.23.3 / # 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP qlen 1000 link/ether 00:0c:29:9e:7c:16 brd ff:ff:ff:ff:ff:ff inet 192.168.3.61/24 brd 192.168.3.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe9e:7c16/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether d6:b1:9b:f0:93:de brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::d4b1:9bff:fef0:93de/64 scope link valid_lft forever preferred_lft forever
docker run -it --name redis01 --network host -d redis:8.6.2-alpine3.23
直接访问宿主机6379访问redis容器
redis-cli -h 192.168.3.61 -p 6379
但是启动第二个redis容器就端口冲突了
范例: host模式下端口映射无法实现
#host模块下端口映射不成功,但是容器可以启动
docker run -it --name redis01 -p 6379:6379 --network host -d redis:8.6.2-alpine3.23
None 模式
在使用 none 模式后,Docker 容器不会进行任何网络配置,没有网卡、没有IP也没有路由,因此默认无法与外界通信,需要手动添加网卡配置IP等,所以极少使用
none 模式特点
- 使用参数 --network none 指定
- 默认无网络功能,无法和外部通信
- 无法实现端口映射
- 适用于测试环境
范例: 启动none模式的容器
docker run -it --rm --name c1 --network none alpine:3.23.3
[root@master2 ~]# docker run -it --rm --name c1 --network none alpine:3.23.3 / # 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 / #
Container 模式

使用此模式创建的容器需指定和一个已经存在的容器共享一个网络,而不是和宿主机共享网络,新创建
的容器不会创建自己的网卡也不会配置自己的IP,而是和一个被指定的已经存在的容器共享IP和端口范
围,因此这个容器的端口不能和被指定容器的端口冲突,除了网络之外的文件系统、进程信息等仍然保
持相互隔离,两个容器的进程可以通过lo网卡进行通信
Container 模式特点
- 使用参数 –-network container:名称或ID 指定
- 与宿主机网络空间隔离
- 空器间共享网络空间,直接使用对方的网络
- 第一个容器的网络可能是bridge,或none,或者host,而第二个容器模式依赖于第一个容器,它们共享网络
- 如果第一个容器停止,将导致无法创建第二个容器
- 第二个容器可以直接使用127.0.0.1访问第一个容器
- 适合频繁的容器间的网络通信
- 默认不支持端口映射,较少使用
范例:第一个容器使用none网络模式,第二个容器与之共享网络
docker run -it --rm --name c1 --network none alpine:3.23.3
docker run -it --rm --name c2 --network container:c1 alpine:3.23.3
[root@master2 ~]# docker run -it --rm --name c1 --network none alpine:3.23.3 / # 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 / #
[root@master2 ~]# docker run -it --rm --name c2 --network container:c1 alpine:3.23.3 / # 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 / #
范例: 第一个容器使用host网络模式,第二个容器与之共享网络
docker run -it --rm --name c1 --network host alpine:3.23.3
docker run -it --rm --name c2 --network container:c1 alpine:3.23.3
root@master2 ~]# docker run -it --rm --name c1 --network host alpine:3.23.3 / # 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP qlen 1000 link/ether 00:0c:29:9e:7c:16 brd ff:ff:ff:ff:ff:ff inet 192.168.3.61/24 brd 192.168.3.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe9e:7c16/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether a6:f1:b0:4b:94:ba brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever / #
[root@master2 ~]# [root@master2 ~]# docker run -it --rm --name c2 --network container:c1 alpine:3.23.3 / # 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP qlen 1000 link/ether 00:0c:29:9e:7c:16 brd ff:ff:ff:ff:ff:ff inet 192.168.3.61/24 brd 192.168.3.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe9e:7c16/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether a6:f1:b0:4b:94:ba brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever / #
范例: 通过容器模式实现 wordpress
#为wordpress暴露端口
docker run -d -p 80:80 --name wordpress --restart=always registry.cn-beijing.aliyuncs.com/wangxiaochun/wordpress:php8.2-apache
docker run --network container:wordpress -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=123456 --name mysql -d --restart=always registry.cn-beijing.aliyuncs.com/wangxiaochun/mysql:8.0.29-oracle
#注意:数据库主机地址为127.0.0.1或wordpress容器的IP,不支持localhost

自定义网络模式
除了以上的网络模式,也可以自定义网络,使用自定义的网段地址,网关等信息
可以使用自定义网络模式,实现不同集群应用的独立网络管理,而互不影响,而且在网一个网络内,可以直接
利用容器名相互访问,非常便利
注意: 自定义网络内的容器可以直接通过容器名进行相互的访问,而无需使用 --link
自定义网络实现
创建自定义网络
#man docker-network-create docker network create -d <mode> --subnet <CIDR> --gateway <网关> <自定义网络名称> #注意mode不支持host和none,默认是bridge模式 -d <mode> 可省略,默认为bridge,支持bridge,overlay,macvlan等driver模式
实战案例: 自定义网络
创建自定义的网络
docker network create wordpress-test-net
[root@master2 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 10b44d3d7b5a bridge bridge local c169b2366f46 host host local 29bfa655c46d none null local a83da1ff9540 wordpress-test-net bridge local
[root@master2 ~]# brctl show bridge name bridge id STP enabled interfaces br-a83da1ff9540 8000.b2dde6e9b50f no docker0 8000.a6f1b04b94ba no veth115ab53
宿主机多了网桥
[root@master2 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:9e:7c:16 brd ff:ff:ff:ff:ff:ff altname enp2s1 inet 192.168.3.61/24 brd 192.168.3.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe9e:7c16/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether a6:f1:b0:4b:94:ba brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::a4f1:b0ff:fe4b:94ba/64 scope link valid_lft forever preferred_lft forever 4: veth115ab53@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether e2:15:1b:4d:9f:49 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::e015:1bff:fe4d:9f49/64 scope link valid_lft forever preferred_lft forever 6: br-a83da1ff9540: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether b2:dd:e6:e9:b5:0f brd ff:ff:ff:ff:ff:ff inet 172.18.0.1/16 brd 172.18.255.255 scope global br-a83da1ff9540 valid_lft forever preferred_lft forever [root@master2 ~]#
docker run -it --rm --name c1 --network wordpress-test-net alpine:3.23.3
[root@master2 ~]# docker run -it --rm --name c1 --network wordpress-test-net alpine:3.23.3 / # 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@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether 4e:6b:9e:7a:cc:18 brd ff:ff:ff:ff:ff:ff inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0 valid_lft forever preferred_lft forever / #
[root@master2 ~]# brctl show bridge name bridge id STP enabled interfaces br-a83da1ff9540 8000.b2dde6e9b50f no vethbd9169e docker0 8000.a6f1b04b94ba no veth115ab53 [root@master2 ~]#
[root@master2 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:9e:7c:16 brd ff:ff:ff:ff:ff:ff altname enp2s1 inet 192.168.3.61/24 brd 192.168.3.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe9e:7c16/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether a6:f1:b0:4b:94:ba brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::a4f1:b0ff:fe4b:94ba/64 scope link valid_lft forever preferred_lft forever 4: veth115ab53@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether e2:15:1b:4d:9f:49 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::e015:1bff:fe4d:9f49/64 scope link valid_lft forever preferred_lft forever 6: br-a83da1ff9540: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether b2:dd:e6:e9:b5:0f brd ff:ff:ff:ff:ff:ff inet 172.18.0.1/16 brd 172.18.255.255 scope global br-a83da1ff9540 valid_lft forever preferred_lft forever inet6 fe80::b0dd:e6ff:fee9:b50f/64 scope link valid_lft forever preferred_lft forever 7: vethbd9169e@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-a83da1ff9540 state UP group default link/ether 6e:8a:35:6c:a4:73 brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet6 fe80::6c8a:35ff:fe6c:a473/64 scope link valid_lft forever preferred_lft forever
docker run -it --rm --name c2 --network wordpress-test-net alpine:3.23.3
[root@master2 ~]# docker run -it --rm --name c2 --network wordpress-test-net alpine:3.23.3 / # 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@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether aa:66:dd:e4:99:5d brd ff:ff:ff:ff:ff:ff inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0 valid_lft forever preferred_lft forever / #
docker network create wordpress-prod-net
[root@master2 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 10b44d3d7b5a bridge bridge local c169b2366f46 host host local 29bfa655c46d none null local 52bd893c60f7 wordpress-prod-net bridge local a83da1ff9540 wordpress-test-net bridge local
docker run -it --rm --name c3 --network wordpress-prod-net alpine:3.23.3
docker run -it --rm --name c4 --network wordpress-prod-net alpine:3.23.3
[root@master2 ~]# docker run -it --rm --name c3 --network wordpress-prod-net alpine:3.23.3 / # 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@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether 8e:00:3c:67:d8:9b brd ff:ff:ff:ff:ff:ff inet 172.19.0.2/16 brd 172.19.255.255 scope global eth0 valid_lft forever preferred_lft forever / #
测试环境和生产环境网络隔离
[root@master2 ~]# [root@master2 ~]# docker run -it --rm --name c2 --network wordpress-test-net alpine:3.23.3 / # 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@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether aa:66:dd:e4:99:5d brd ff:ff:ff:ff:ff:ff inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0 valid_lft forever preferred_lft forever / # ping 172.19.0.2 PING 172.19.0.2 (172.19.0.2): 56 data bytes
实战案例: 自定义网络中的容器之间通信
同一个网络可以通过名字访问 c1 c2
[root@master2 ~]# docker run -it --rm --name c2 --network wordpress-test-net alpine:3.23.3 / # 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@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether aa:66:dd:e4:99:5d brd ff:ff:ff:ff:ff:ff inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0 valid_lft forever preferred_lft forever / # ping 172.19.0.2 PING 172.19.0.2 (172.19.0.2): 56 data bytes ^C --- 172.19.0.2 ping statistics --- 2 packets transmitted, 0 packets received, 100% packet loss / # / # / # ping c2 PING c2 (172.18.0.3): 56 data bytes 64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.057 ms 64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.063 ms 64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.056 ms
结论: 自定义网络中的容器之间可以直接利用容器名进行通信
实战案例: 利用自定义网络实现 Wordpress (练习)
范例:
docker run -d -p 80:80 --network wordpress-prod-net --name wordpress --restart=always registry.cn-beijing.aliyuncs.com/wangxiaochun/wordpress:php8.2-apache
docker run --network wordpress-prod-net -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=123456 --name mysql -d --restart=always registry.cn-beijing.aliyuncs.com/wangxiaochun/mysql:8.0.29-oracle

docker run -d -p 81:80 --network wordpress-test-net --name wordpress02 --restart=always registry.cn-beijing.aliyuncs.com/wangxiaochun/wordpress:php8.2-apache
docker run --network wordpress-test-net -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=123456 --name mysql2 -d --restart=always registry.cn-beijing.aliyuncs.com/wangxiaochun/mysql:8.0.29-oracle
[root@master2 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e27c50b60242 registry.cn-beijing.aliyuncs.com/wangxiaochun/mysql:8.0.29-oracle "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 3306/tcp, 33060/tcp mysql2 9a6aaa4249bf registry.cn-beijing.aliyuncs.com/wangxiaochun/wordpress:php8.2-apache "docker-entrypoint.s…" 13 seconds ago Up 13 seconds 0.0.0.0:81->80/tcp, [::]:81->80/tcp wordpress02 e869ef6ce002 registry.cn-beijing.aliyuncs.com/wangxiaochun/wordpress:php8.2-apache "docker-entrypoint.s…" 33 seconds ago Created wordpress-test 31a36c054e2f registry.cn-beijing.aliyuncs.com/wangxiaochun/mysql:8.0.29-oracle "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 3306/tcp, 33060/tcp mysql 9e0eb44f9fea registry.cn-beijing.aliyuncs.com/wangxiaochun/wordpress:php8.2-apache "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp wordpress
#wordpress连接数据库时,数据库主机是容器的名称mysql2

浙公网安备 33010602011771号