Docker1.9引入了新的网络机制,包括一整套的网络操作命令和跨主机的网络支持。
该网络特性主要是为了实现容器的网络互联(单主机/跨主机),取代了之前的--link网络模式。
docker网络命令:
查看当前的docker网络:
1
2
3
4
5
|
# docker network ls
NETWORK ID NAME DRIVER
a77b0f433ea0 none null
ddc8ce5a4767 host host
fdeed50789ae bridge bridge
|
刚创建的docker,包含3个默认的网络,如上:
-
bridge:容器使用独立网络Namespace,并连接到docker0虚拟网卡(默认模式)。
-
none:容器没有任何网卡,适合不需要与外部通过网络通信的容器。
-
host:容器与主机共享网络Namespace,拥有与主机相同的网络设备。
通过创建新的网络,我们就可以实现容器间的互联。、
单主机容器互联:
1:创建一个新的docker网络。
1
2
3
4
5
6
7
8
|
# docker network create net0
579c19e76a171d293cda54c1d93c5246537c43e01ee523010da378c1a6714f60
# docker network ls
NETWORK ID NAME DRIVER
a77b0f433ea0 none null
ddc8ce5a4767 host host
fdeed50789ae bridge bridge
579c19e76a17 net0 bridge ---出现了一个名为net0的新网络
|
2:创建容器,把容器关联到新建的net0网络。
1
2
3
4
|
# docker run -idt --name net_test1 --net net0 centos
cbe802f86e72f32c50d2d7780489476c7ccfc5badb8e2e6a37196360415ae726
# docker run -idt --name net_test2 --net net0 centos
bdc32d45a9a60007961b5df81782c866036f3f303e282912b606e0a839841649
|
3:测试容器网络互通:
1
2
3
4
5
6
|
# docker exec net_test1 ping net_test2
PING net_test2 (172.19.0.3) 56(84) bytes of data.
64 bytes from net_test2 (172.19.0.3): icmp_seq=1 ttl=64
time
=0.103 ms
64 bytes from net_test2 (172.19.0.3): icmp_seq=2 ttl=64
time
=0.077 ms
64 bytes from net_test2 (172.19.0.3): icmp_seq=3 ttl=64
time
=0.082 ms
64 bytes from net_test2 (172.19.0.3): icmp_seq=4 ttl=64
time
=0.069 ms
|
可以看到两个容器间可以通过容器名直接通信。
进入容器查看/etc/hosts文件,可以看到相应的IP和HOST的映射,docker会把添加到该网络的容器与ip的映射关系写进每一个容器的/etc/hosts文件中。
主机间的容器互联:
在Docker的1.9中版本中正式加入了官方支持的跨节点通信解决方案,它是通过swarm+overlay网络实现的。
1:配置swarm docker集群。参考之前的博客:http://icenycmh.blog.51cto.com/4077647/1789505(swarm+zookeeper配置docker集群)
2:通过集群创建overlay网络:
集群间的swarm网路信息需要有一个存储网络信息的地方,这里可以使用zookeeper,如果没有配置,在通过swarm集群配置overlay网络时会报错。
1
2
|
# vim /etc/sysconfig/docker
OPTIONS=
'--selinux-enabled -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --storage-opt dm.no_warn_on_loop_devices=true --cluster-store=zk://192.168.1.110:2181/store --cluster-advertise=192.168.1.121:2375'
|
如上,在docker启动后台添加--cluster-store=zk://192.168.1.110:2181/store --cluster-advertise=192.168.1.121:2375参数。
创建overlay网络:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# docker -H 192.168.1.121:3376 network create --driver=overlay ovr0
# docker -H 192.168.1.121:3376 network ls
NETWORK ID NAME DRIVER
3e2b6eacf589 node2
/docker_gwbridge
bridge
28a5376c6b19 node2
/none
null
ddc8ce5a4767 node1
/host
host
da1289e78b54 node2
/host
host
98d31593ac87 node2
/bridge
bridge
fdeed50789ae node1
/bridge
bridge
68e6e9d0b0a9 ovr0 overlay ---新建的overlay网络
2df6c6c9b59c node1
/docker_gwbridge
bridge
579c19e76a17 node1
/net0
bridge
a77b0f433ea0 node1
/none
null
|
通过集群查看网络,可以看到所有节点的网络信息,也可以看到集群中新增了一个overlay网络,名为ovr0。
3:通过集群创建容器:
1
2
3
4
5
6
7
8
9
10
11
|
# docker -H 192.168.1.121:3376 run -idt --name test1 --net ovr0 docker.io/centos
ad6e5022af1ad43cd4fe04e10aa1c32d1e8aa45545866b51d8609b6705c8cc0e
# docker -H 192.168.1.121:3376 run -idt --name test2 --net ovr0 docker.io/centos
adf2ec96ef6449364316f2a896246154a221f3899a6b8943fed21f30eea18b0e
# docker -H 192.168.1.121:3376 ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adf2ec96ef64 docker.io
/centos
"/bin/bash"
11 seconds ago Up 10 seconds node1
/test2
ad6e5022af1a docker.io
/centos
"/bin/bash"
15 seconds ago Up 14 seconds node2
/test1
16457b216799 swarm
"/swarm manage -H 0.0"
3 hours ago Up About an hour 2375
/tcp
, 192.168.1.121:3376->3376
/tcp
node1
/lonely_archimedes
479fdbbe3235 swarm
"/swarm join zk://192"
3 hours ago Up About an hour 2375
/tcp
node2
/drunk_bohr
e3674e871486 swarm
"/swarm join zk://192"
3 hours ago Up About an hour 2375
/tcp
node1
/hungry_fermat
|
以上命令在集群中创建了两个容器test1和test2,并添加进ovr0网络。可以看到test1被分配在node2节点,test1被分配在node1节点,两个容器处于不同的主机上。
4:测试不同主机上容器的联通:
1
2
3
4
5
6
|
# docker -H 192.168.1.121:3376 exec test1 ping test2
PING test2 (10.0.0.3) 56(84) bytes of data.
64 bytes from test2 (10.0.0.3): icmp_seq=1 ttl=64
time
=0.601 ms
64 bytes from test2 (10.0.0.3): icmp_seq=2 ttl=64
time
=0.319 ms
64 bytes from test2 (10.0.0.3): icmp_seq=3 ttl=64
time
=0.307 ms
64 bytes from test2 (10.0.0.3): icmp_seq=4 ttl=64
time
=0.389 ms
|
两个容器网络已经互通。
查看两个容器的/etc/hosts文件,可以看到相应的IP:容器映射信息。