一、Network对象的管理
Network做docker管理的四大对象之一,被设计成为容器运行时的网络功能对象。
它是使用docker network命令行进行管理docker network
- docker内置的Network对象:
(1)none,代表着不使用container外网。
(2)bridge,代表着利用虚拟路由器与host通信的功能(默认项)。
(3)host,代表着共享host网络资源。 - 我们可以使用命令进行管理:
(1) create
$ docker network create \
--driver=bridge \
--subnet=172.28.0.0/16 \
--ip-range=172.28.5.0/24 \
--gateway=172.28.5.254 \
br0
以上代表着,使用bridge方式,虚拟路由器的网段,gatway的ip以及可以分配的ip网段。
(2)docker network ls
(3) docker network inspect [网络对象名]
(4)docker network rm/prune
prune是删除已不被任何容器使用的network
(5) connect/diconnect
connect: 是让绑定到其它网络对象的容器对象,再绑定到本网络对象上(见后文)
diconnect: 是让已经绑定到本网络对象的容器对象,解绑定。
二、容器对象启动时绑定网络对象的方法:
docker [run|create] --network=[网络名称] 镜像名
三、docker daemon 提供了三个默认网络对象
可以使用docker network ls查看,并使用docker network inspect [网络名称]查看详细内容。
- none
容器将只保留回环地址,即不需要与任何网络连接。 - bridge
docker daemon会在host上安装一个虚拟网卡docker0(eth0,lo分别真实网卡和回环网卡),并且默认分配172.17.0.1/16地址,同时这也是--network的默认选项
# ip a
# docker inspect bridge
可以使用以下方式进行测试
# docker run --name c1 -d busybox httpd -f
# docker network inspect bridge -f '{{range .Containers}}{{.Name}} ip is: {{.IPv4Address}}{{println}}{{end}}'
c1 ip is: 172.17.0.2/16
说明:c1容器已经绑定到了birdge上了,即使用了host上的docker0与host相连接(实际上是使用一块veth)
- host
将共享主机的所有网卡
root@ali001:~# docker run --name c2 -it --network=host busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:16:3e:07:97:d1 brd ff:ff:ff:ff:ff:ff
inet 172.26.138.7/20 brd 172.26.143.255 scope global eth0
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
link/ether 02:42:7c:4c:88:3a 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
四、user-defined网络:
- 除了可以使用默认提供的三个网络以外,我们可以自定义网络:
方法如下:
root@ali001:~# docker network create --driver=bridge john_net1
- 可以使用--network进行指定
root@ali001:~# docker run -it --name=c3 --network=john_net1 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
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
310: eth0@if311: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:13:00:02 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
可以看到使用了172.19段ip了,不同于172.17段(bridge)
此时可以查看下john_net1
root@ali001:~# docker network inspect john_net1 -f '{{range .Containers}}{{.Name}} ip is: {{.IPv4Address}}{{println}}{{end}}'
c3 ip is: 172.19.0.2/16
- 額外的福利,可以使用dns服务:
root@ali001:~# docker run -d --name=c4 --network=john_net1 busybox httpd -f
docker run --rm --network=john_net1 busybox ping c4
PING c4 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.087 ms
五、网络之间通信:
默认情况下,各个网络之间是不能通信的,但我们可以使用docker network [网络名称] [另一网络容器名称]的方式,将容器加入本网络。
root@ali001:~# docker run -d --name c6 busybox httpd -f
98485f031a75e6bd8194e38119e78eb051a0fe4c345f987bddabd35779c89cfa
root@ali001:~# docker network connect john_net1 c6
root@ali001:~# docker exec c6 ping c4
PING c4 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.093 ms
root@ali001:~# docker exec c4 ping c6
PING c6 (172.19.0.4): 56 data bytes
64 bytes from 172.19.0.4: seq=0 ttl=64 time=0.105 ms
bridge网络的c4容器与john_net1的c6互通,说明网络连接成功。
六、joined到其它容器
此种方式与--network=host 相似,但其共享的是其它容器的网卡。
docker run --rm --network=container:c6 busybox
此时,它将与c6具有相同的ip和hostname(但要求c6必须处于运行中)












网友评论