美文网首页
docker的网络(一)

docker的网络(一)

作者: JohnYuCN | 来源:发表于2020-04-05 00:58 被阅读0次

一、Network对象的管理

Network做docker管理的四大对象之一,被设计成为容器运行时的网络功能对象。
它是使用docker network命令行进行管理docker network

  1. docker内置的Network对象:
    (1)none,代表着不使用container外网。
    (2)bridge,代表着利用虚拟路由器与host通信的功能(默认项)。
    (3)host,代表着共享host网络资源。
  2. 我们可以使用命令进行管理:
    (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 [网络名称]查看详细内容。

  1. none
    容器将只保留回环地址,即不需要与任何网络连接。
  2. 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)

  1. 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网络:

  1. 除了可以使用默认提供的三个网络以外,我们可以自定义网络:
    方法如下:
root@ali001:~# docker network create --driver=bridge john_net1
  1. 可以使用--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
  1. 額外的福利,可以使用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必须处于运行中)

相关文章

网友评论

      本文标题:docker的网络(一)

      本文链接:https://www.haomeiwen.com/subject/ilajphtx.html