文章目录

  • bridge自定义网络
  • bridge自定义网络
  • 自定义网段



除了none、host、bridge 这三个自动创建的网络,用户也可以根据业务需要创建user-defined网络。

自定义网络模式中,docker提供了三种自定义网络驱动:brdgeoverlaymacvlan。通过bridge驱动创建类似默认的bridge网络模式,但增加了一些新的功能,overlay和macvlan是用于创建跨主机网络。

建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。

bridge自定义网络

自定义网桥中会自己分配ip地址和网关地址

bridge自定义网络

1.创建自定义网桥并查看

指定驱动模式,默认为bridge ,也可以通过 --driver明文指定

[root@EMS3 ~]# docker network create --driver bridge my_net
cc45c8c6184fcf041b093651a5855b344fc056f12a9fa23783219aecea464e43

查看当前host的网络结构变化:

[root@EMS3 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
c2585d639e79        bridge              bridge              local
67aeb22154d9        host                host                local
cc45c8c6184f        my_net              bridge              local
1e53c547efb6        none                null                local

多了一行 cc45c8c6184f my_net bridge local,说明新增一个网桥 cc45c8c6184f,这里的cc45c8c6184f正好是新建bridge网络 my_net 的短id

使用brctl show查看新增的网桥:

[root@EMS3 ~]# brctl show
bridge name             bridge id               STP enabled     interfaces
br-cc45c8c6184f         8000.0242d6732256       no
docker0                 8000.024233d7824a       no              veth06086f6

多了br-cc45c8c6184f

查看 my_net 的配置信息:

[root@EMS3 ~]#  docker network inspect my_net
[
    {
        "Name": "my_net",
        "Id": "cc45c8c6184fcf041b093651a5855b344fc056f12a9fa23783219aecea464e43",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

这里的172.18.0.0/16是Docker自动分配的IP网段

自定义网段

上面的例子是自动分配的号段,我们可以指定网段。在创建时指定参数:–subnet 、–gateway

[root@EMS3 ~]# docker network create --subnet=172.21.0.0/24 --gateway=172.21.0.1 my_net2
06977f67da4800c142f96f08b71cf59516fe07e4cd847a269f365f1e99f75fd1

这里我们创建了新的bridge网络my_net2网段为172.21.0.0/24网关为172.21.0.1

指定网络和静态IP
容器要使用新的网络,需要在启动时通过 --network指定。同时可以通过--ip指定一个静态的IP(可以不指定,会自动分配)。

[root@EMS3 ~]#  docker run --name kubia-container3 -p 8082:8080  --network=my_net2 --ip=172.21.0.100 -d  docker.artnj.test.com.cn/cci/kubia:v3
644cc15c850fb93a654626d83c63035bef0ad612485e7e58a97641cf8973412e

我们指定了--network=my_net2 --ip=172.21.0.100

注:只有使用 --network创建的网络才能指定静态IP

我们看下容器的ip:

[root@EMS3 ~]# docker exec -it 644cc15c850f sh
# ip a
...
386: eth0@if387: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:15:00:64 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.21.0.100/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe15:64/64 scope link
       valid_lft forever preferred_lft forever

IP确实为172.21.0.100

注意: 在指定网络参数 --network时,需要把参数放在镜像位置前面,如果放在后面,则会不生效

比如 docker run --name kubia-container4 -p 8083:8080 -d docker.artnj.test.com.cn/cci/kubia:v3 --network=my_net2 --ip=172.21.0.101

[root@EMS3 ~]# docker run --name kubia-container4 -p 8083:8080 -d docker.artnj.test.com.cn/cci/kubia:v3 --network=my_net2 --ip=172.21.0.101
0cb96be0dfd31a6b161046b1f878b062f9bd7ec32a7e613e452260aca660293e
[root@EMS3 ~]# docker exec -it 0cb96be0dfd3 sh
# ip a
...
388: eth0@if389: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:0e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.14/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:e/64 scope link
       valid_lft forever preferred_lft forever

我们发现地址为172.17.0.14/16 ,仍然为docker0的号段

我们来测试访问情况:

1.同一网段访问

为了测试my_net2 的访问情况, 我们保证有2个容器都挂在该网络上

[root@EMS3 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br-06977f67da48         8000.0242d27a16be       no              veth189d9fe
                                                        veth3783cc1

容器id

容器名称

--network

--ip

644cc15c850f

kubia-container3

my_net2

172.21.0.100

1bc6625fcf0b

kubia-container4

my_net2

172.21.0.101

我们在kubia-container3访问 kubia-container4,结果是OK的

[root@EMS3 ~]# docker exec -it kubia-container3 sh
# curl 172.21.0.101:8080
This is v3 running in pod 1bc6625fcf0b

2.跨网段
假使我们存在使用默认docker0网桥的容器,我们来测试下访问情况
docker 入门 2 启动一个kubia镜像

容器id

容器名称

--network

--ip

f4a9983fb72c

kubia-container

docker0(默认)

172.17.0.9(自动分配的)

我们在kubia-container3访问 kubia-container,结果是失败的

[root@EMS3 ~]# docker exec -it kubia-container3 sh
# curl 172.17.0.9:8080
curl: (7) Failed to connect to 172.17.0.9 port 8080: Connection timed out

直接ping也是失败的,如下结果0 received,没有收到响应消息:

[root@EMS3 ~]# docker exec -it kubia-container3 sh
# ping 172.17.0.10
PING 172.17.0.10 (172.17.0.10) 56(84) bytes of data.
^C
--- 172.17.0.10 ping statistics ---
58 packets transmitted, 0 received, 100% packet loss, time 57014ms

注意:虽然无法ping通ip,但是此时可以ping通网关
我们验证下:

[root@EMS3 ~]# docker exec -it kubia-container3 sh
# ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.116 ms

3.让不同网桥间的容器进行通信
通过上面的例子,我们发现kubia-container和kubia-container3之间是不通的,那么怎样才能让二者通信呢?
答案是为kubia-container添加一块my_net2 的网卡,通过docker network connect命令实现。

[root@EMS3 ~]# docker network connect my_net2 kubia-container

进入kubia-container,通过ip a命令查看,发现多了一块网卡

[root@EMS3 ~]# docker exec -it kubia-container sh
# ip a
370: eth0@if371: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:09 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.9/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:9/64 scope link
       valid_lft forever preferred_lft forever
394: eth1@if395: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:15:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.21.0.2/24 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe15:2/64 scope link
       valid_lft forever preferred_lft forever

发现kubia-container多了eth1@if395,ip为172.21.0.2/24,与kubia-container3在相同的号段内, 可以对比之前的ip信息 docker 入门 2 启动一个kubia镜像

容器id

容器名称

--network

--ip

f4a9983fb72c

kubia-container

docker0(默认)

my_net2

172.17.0.9(自动分配的)

172.21.0.2(新加的)

brctl show显示my_net2 下挂了3个容器的veth

[root@EMS3 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br-06977f67da48         8000.0242d27a16be       no              veth189d9fe
                                                        veth2ee80f2
                                                        veth3783cc1

下面我们来测试下访问情况,结果是OK的:

[root@EMS3 ~]# docker exec -it kubia-container3 sh
# curl 172.21.0.2:8080
 This is pod f4a9983fb72c