我们搭建一个网络环境,一般遵循一定的网络拓扑结构。由于Linux可以模拟相应的网络设备,并可以创建“虚拟机”(也就是容器),因此在Linux系统内,我们也可以遵循一定的网路拓扑结构,设计一个“内网”,实现容器之间的通信。
本文主要讲述容器跨主机网络通信。
容器跨主机的网络通信,主要实现思路有两种:二层VLAN网络和Overlay网络。
二层VLAN网络的解决跨主机通信的思路是把原先的网络架构改造为互通的大二层网络,通过特定网络设备直接路由,实现容器点到点的之间通信。
Overlay网络是指在不改变现有网络基础设施的前提下,通过某种 约定通信协议 ,把二层报文封装在IP报文之上的新的数据格式。
Libnetwork是Docker团队将Docker的网络功能从Docker核心代码中分离出去,形成一个单独的库。 Libnetwork通过 插件的形式 为Docker提供网络功能。 使得用户可以根据自己的需求实现自己的Driver来提供不同的网络功能。
官方目前计划实现以下Driver:
“Libnetwork所要实现的网络模型(网络拓扑结构)基本是这样的: 用户可以创建一个或多个网络(一个网络就是一个网桥或者一个VLAN ),一个容器可以加入一个或多个网络。 同一个网络中容器可以通信,不同网络中的容器隔离。” 我觉得这才是将网络从docker分离出去的真正含义,即在创建容器之前,我们可以先创建网络(即创建容器与创建网络是分开的),然后决定让容器加入哪个网络。
192.168.56.101
, 192.168.56.102
DOCKER_OPTS=--insecure-registry 192.168.3.56:5000 -H 0.0.0.0:2375 --cluster-store=etcd://192.168.56.101:2379/ --cluster-advertise=192.168.56.101:2375
,重启docker。 192.168.56.101
或 192.168.56.102
执行 docker network create -d overlay net1``docker network create -d overlay net2
192.168.56.101
运行容器net1c1,net2c1 docker run -itd --name net1c1 --net net1 ubuntu:14.04
192.168.56.102
运行容器net1c2,net2c2。 192.168.56.101
上etcd配置 192.168.56.102
上etcd配置 192.168.56.101
执行 docker run --name swarm-agent -d swarm join --addr=192.168.56.101:2375 etcd://192.168.56.101:2379/swarm
192.168.56.102
执行 docker run --name swarm-agent -d swarm join --addr=192.168.56.102:2375 etcd://192.168.56.102:2379/swarm
192.168.56.101
上启动swarm-manager docker run --name swarm-manager -d -p 3375:2375 swarm manage etcd://192.168.56.101:2379/swarm
192.168.56.101
上创建网络net3并启动容器 docker -H tcp://localhost:3375 network create -d overlay net3
docker -H tcp://localhost:3375 run -it --net net3 ubuntu bash
192.168.56.101
上创建网络net4并启动容器,并且指定容器的ip, 这个效果在实际场景中很有用 docker -H tcp://localhost:3375 network create -d overlay net4 --subnet 172.19.0.0/16
docker -H tcp://localhost:3375 run -it --net net4 --ip=172.19.0.6 ubuntu bash
--ip
参数时,必须值定特定的子网 ,参见 https://github.com/docker/docker/issues/20547
192.168.56.101
和 192.168.56.102
,并且 192.168.56.102
是由 192.168.56.101
克隆而来,则你需要清除 xx/docker/key.json
(不同系统位置不同),并重启docker。否则两个主机启动的容器可能具有同一个id,进而导致使用docker swarm时出现问题。参见 https://github.com/docker/swarm/issues/380
docker 真是做的越来越全面了,如果仅仅是用用,一切都是参数配置,搞得人家很没有成就感嘛。