天天看点

Docker的网络配置 3 user-defined网络

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

自定义网络模式中,docker提供了三种自定义网络驱动:

brdge

overlay

macvlan

。通过

bridge驱动

创建类似默认的bridge网络模式,但增加了一些新的功能,overlay和macvlan是用于创建跨主机网络。

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

bridge自定义网络

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

bridge自定义网络

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

指定驱动模式,

默认为bridge

,也可以通过

--driver

明文指定

[[email protected] ~]# docker network create --driver bridge my_net
cc45c8c6184fcf041b093651a5855b344fc056f12a9fa23783219aecea464e43
           

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

[[email protected] ~]# 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查看新增的网桥:

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

           

多了br-cc45c8c6184f

查看 my_net 的配置信息:

[[email protected] ~]#  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

[[email protected] ~]# 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

(可以不指定,会自动分配)。

[[email protected] ~]#  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:

[[email protected] ~]# docker exec -it 644cc15c850f sh
# ip a
...
386: [email protected]: <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

[[email protected] ~]# 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
[[email protected] ~]# docker exec -it 0cb96be0dfd3 sh
# ip a
...
388: [email protected]: <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个容器都挂在该网络上

[[email protected] ~]# 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的

[[email protected] ~]# 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,结果是失败的

[[email protected] ~]# 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

,没有收到响应消息:

[[email protected] ~]# 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通网关

我们验证下:

[[email protected] ~]# 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

命令实现。

[[email protected] ~]# docker network connect my_net2 kubia-container
           

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

[[email protected] ~]# docker exec -it kubia-container sh
# ip a
370: [email protected]: <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: [email protected]: <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多了

[email protected]

,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

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

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

[[email protected] ~]# docker exec -it kubia-container3 sh
# curl 172.21.0.2:8080
 This is pod f4a9983fb72c
           

继续阅读