docker 的容器五种网络模型工作机制

 

 

Docker 网络管理

docker 容器创建后,通常需要和其它主机或容器进行网络通信

官方文档:

https://docs.docker.com/network/

Docker的默认的网络通信

 

8690832e5fbd057bb594e39d28559c99

 

 

 

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 网络连接模式(重点)

网络模式介绍

image

 

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 网络模式架构(默认模式)

image

 

本模式是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 模式

image

 

如果指定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 模式

image

 

使用此模式创建的容器需指定和一个已经存在的容器共享一个网络,而不是和宿主机共享网络,新创建
的容器不会创建自己的网卡也不会配置自己的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

image

 

自定义网络模式
除了以上的网络模式,也可以自定义网络,使用自定义的网段地址,网关等信息
可以使用自定义网络模式,实现不同集群应用的独立网络管理,而互不影响,而且在网一个网络内,可以直接
利用容器名相互访问,非常便利
注意: 自定义网络内的容器可以直接通过容器名进行相互的访问,而无需使用 --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

image

 

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

image

 

 

posted @ 2026-07-04 07:50  minger_lcm  阅读(8)  评论(0)    收藏  举报