文章目录
- bridge自定义网络
- bridge自定义网络
- 自定义网段
除了none、host、bridge 这三个自动创建的网络,用户也可以根据业务需要创建user-defined网络。
自定义网络模式中,docker提供了三种自定义网络驱动:brdge
,overlay
,macvlan
。通过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