Docker 1.9 Overlay Network实现跨主机网络互通

原创 2015年11月20日 15:24:58
11月4日,Docker发布了1.9版本,实现了原本实验性的Networking组件的支持。用户可以在Swarm中使用它或者将其作为Compose 工具。创建虚拟网络并将其连接到容器上,可实现多个主机上容器相互通信,并且实现不同的应用程序或者应用程序不同部分能够相互隔离。互联子系统设计为可插拔式,兼容VXLAN或者IPVLAN等技术。


Docker 容器实现跨主机通讯主要通过几种方式:自带overlay network插件,第三方插件如weave、ovs等,docker swarm(虽然也是通过key value service进行调用)。在这里主要介绍直接使用自带插件,以及通过docker swarm的两种实现方式。


直接使用自带插件实现容器跨主机访问 


测试环境为ubuntu14.04。根据docker建议要求,将内核升级到3.19.如果内核版本过低,将会出现overlay network创建失败或加入失败等一系列问题。


内核升级


#apt-get install linux-generic-lts-vivid


升级完成,重启主机。


# uname -a
Linux ukub09 3.19.0-33-generic #38~14.04.1-Ubuntu SMP Fri Nov 6 18:17:28 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux


启动key value service
可以选择使用zookeeper、etcd、consul等多种组件。本例使用额外一台虚拟机,启用和官方文档相一致的consul镜像。


docker $(docker-machine config consul2) run -d \
    -p "8501:8500" \
    -h "consul" \
    progrium/consul -server -bootstrap


此时可以通过ip:8501对consul服务进行访问。


将key value service信息加入docker daemon
修改希望加入docker overlay network的所有主机上docker daemon服务。


#vi /etc/dafault/docker
DOCKER_OPTS='
-H tcp://0.0.0.0:2376
-H unix:///var/run/docker.sock
--cluster-store=consul://172.25.2.43:8501
--cluster-advertise=eth0:2376


'


通过修改以下两个参数实现
--cluster-store= 参数指向docker daemon所使用key value service的地址
--cluster-advertise= 参数决定了所使用网卡以及docker daemon端口信息


重启docker服务。


#service docker restart


docker 网络的创建与操作
此时可以通过docker network create创建-d overlay属性的驱动。


#docker network create -d overlay over


列出当前网络


root@ukub10:~# docker network ls
NETWORK ID          NAME                DRIVER
b95efb2ab985        over                overlay             
0a4a123fc278        bridge              bridge              
2da9ecadf108        none                null                
5ca3275ec2a9        host                host        


        


在另一台已加入key value service指向的主机上同样可以看到这个网络


root@ukub09:~# docker network ls
NETWORK ID          NAME                DRIVER
b95efb2ab985        over                overlay             
b5f9713c9f2b        bridge              bridge              
16e1cdf30f97        none                null                
cf257529463c        host                host


docker网络的连接方式
可以在两台主机上分别创建容器,互相进行ping或ssh访问。官方文档例子创建一个nginx容器,并在另一个容器内抓取其状态进行验证。这里不再详述。


创建容器接入指定网络


#docker run -itd --name=testcontainer --net=over  nginx


将容器从指定网络中退出


#docker network disconnect over testcontainer 


重新连入指定网络


#docker network connect over testcontainer


连接与断开将会是实时的。在连接之后,即可通过容器名访问本网络中所有容器。

 使用Swarm创建docker cluster实现跨主机管理和网络访问 
根据官方文档,需要搭建起基于swarm的cluster,来实现Docker overlay network。为部署整套Docker cluster,需要安装docker machine/compose/swarm等组件。
使用第三方网络插件实现跨主机容器通讯也变得更容易了。


安装docker machine
docker machine用来进行docker的推送安装,可以在许多driver上安装部署docker:


- amazonec2 azure digitalocean exoscale generic google none
  openstack rackspacesoftlayer virtualboxvmwarevcloudair
  vmwarevsphere


首先需要安装好docker engine,之后下载并将docker machine的库文件移动到bin下。


#curl -L https://github.com/docker/machine/releases/download/v0.5.0/docker-machine_linux-amd64.zip >machine.zip && \
unzip machine.zip && \
rm machine.zip && \
mv docker-machine* /usr/local/bin


验证安装


# docker-machine -v
docker-machine version 0.5.0 (04cfa58)
# docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM


官方文档的使用virtualbox进行各种角色主机的启用。本篇文档则在已有的虚拟机环境中进行。


使用docker-machine进行推送安装
首先需要拥有一台linux系统,并使docker-machine主机可以无密码访问到这台系统。


#ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.25.2.43


之后即可通过docker-machine进行安装。


安装通过internet下载相关包,并通过docker-machine进行设置安装的。必须保证网络畅通,否则可能安装失败。


#docker-machine create -d generic --generic-ip-address=172.25.2.43 --generic-ssh-user=root test5


安装后,可以查看所有被docker-machine安装控制后的主机状态


# docker-machine ls
NAME        ACTIVE   DRIVER    STATE     URL                      SWARM
c0-master   -        generic   Running   tcp://172.25.2.44:2376   c0-master (master)
c0-n1       -        generic   Running   tcp://172.25.2.45:2376   c0-master
c0-n2       -        generic   Running   tcp://172.25.2.46:2376   c0-master
dm01        -        generic   Running   tcp://172.25.2.43:2376   
local       -        generic   Running   tcp://172.25.2.34:2376


可以查看相应主机的环境变量


#docker-machine env local 


把当前操作环境变更为指定主机


#eval "$(docker-machine env local)"


在docker-machine主机上操纵host 


#docker $(docker-machine config local) run -tid ubuntu /bin/bash


通过ssh连接到相应主机


# docker-machine ssh dm01


Docker Compose安装
docker compose用于同时启动多个容器,构成同一组应用环境,在这里用于支持swarm的安装。


#curl -L https://github.com/docker/compose/releases/download/1.5.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose


Docker Swarm集群安装
启用一台主机安装key value service,用于节点、主机发现等工作。
本例使用了consul的镜像,也可以使用如etcd、zookeeper等组件。


在dm01上启动一个consul服务:


docker $(docker-machine config dm01) run -d \
    -p "8500:8500" \
    -h "consul" \
    progrium/consul -server -bootstrap


创建swarm集群可以通过key value服务,也可以使用swarm cluster ID字符串创建。


创建swarm manager


{{{docker-machine create \
  -d generic --generic-ip-address=172.25.2.44 --generic-ssh-user=root\
  --swarm \
  --swarm-master \
  --swarm-discovery="consul://$(docker-machine ip dm01):8500" \
  --engine-opt="cluster-store=consul://$(docker-machine ip dm01):8500" \
  --engine-opt="cluster-advertise=eth0:2376" \
  c0-master}}}


创建swarm node


{{{docker-machine create \
  -d generic --generic-ip-address=172.25.2.45 --generic-ssh-user=root \
  --swarm \
  --swarm-discovery="consul://$(docker-machine ip dm01):8500" \
  --engine-opt="cluster-store=consul://$(docker-machine ip dm01):8500" \
  --engine-opt="cluster-advertise=eth0:2376" \
  c0-n1


docker-machine create \
  -d generic --generic-ip-address=172.25.2.46 --generic-ssh-user=root \
  --swarm \
  --swarm-discovery="consul://$(docker-machine ip dm01):8500" \
  --engine-opt="cluster-store=consul://$(docker-machine ip dm01):8500" \
  --engine-opt="cluster-advertise=eth0:2376" \
  c0-n2}}}


Overlay Network创建
设置环境变量


#eval "$(docker-machine env --swarm c0-master)"


可以用docker info看到现在的集群状况


#docker network create -d overlay myStack1


root@local:~# docker network ls
NETWORK ID          NAME                DRIVER
685ed9e9f701        myStack1            overlay             
4c88e7c52a7c        c0-n1/bridge        bridge              
7fd49a4f6a64        c0-n1/none          null                
8b2372139902        c0-n2/host          host                
d998a91dcfea        c0-n2/bridge        bridge              
afd7a1190fb4        c0-n2/none          null                
0f2b5dae67f7        c0-n1/host          host                
a45b8049f8e6        c0-master/bridge    bridge              
d13eed83f250        c0-master/none      null                
364a592ae9ae        c0-master/host      host  


测试
在c0-n1上启动一个nginx,并加入myStack1网络


#docker run -itd --name=web --net=myStack1 --env="constraint:node==c0-n1" nginx


在c0-n2上启动一个shell,同样加入myStack1网络


#docker run -ti --name=webtest --net=myStack1 --env="constraint:node==c0-n2" ubuntu /bin/bash


在shell中将可以通过容器名或ip获取到web容器的状态


#apt-get install wget
#wget -O- http://web




docker在官方文档上主推以swarm的方式创建cluster,相对比较复杂,但提供了整体Cluster的解决方案,可以将容器进行整体管理、推送、使用。

docker应用-5(使用overlay 网络进行容器间跨物理主机通信)

同一个主机上的Docker容器之间通信 docker 引擎会在主机上增加一个docker0网卡,该网卡具有双重身份: 1.从容器视角,网桥(交换机)身份 docker0 对于运行在同一个...
  • sqzhao
  • sqzhao
  • 2017年04月28日 09:31
  • 2700

理解Docker跨多主机容器网络

理解Docker跨多主机容器网络 二月 15, 2016 2条评论 在Docker 1.9 出世前,跨多主机的容器通信方案大致有如下三种: 1、端口映射 将宿主机A的端口P映射到...
  • ztsinghua
  • ztsinghua
  • 2016年05月31日 14:35
  • 6051

overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)

上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理。...
  • CloudMan6
  • CloudMan6
  • 2017年08月09日 08:52
  • 708

容器跨主机通信之docker default overlay

default docker overlay基于libnetwork和libkv,这里使用etcd作为key value store VM1: 129.107.126.123 VM2: 129...
  • sk1137
  • sk1137
  • 2017年03月22日 11:07
  • 244

docker overlay network测试

docker自1.9版本后,引入了overlay网络(本文不具体分析其背后使用的技术)。重点解决之前docker网络在跨主机通信方面的不足。本文记录,参考官方指导文档,搭建测试overlay网络的过程...
  • asd05txffh
  • asd05txffh
  • 2016年04月12日 08:59
  • 4964

[Docker]Docker1.9后的network

.. 声明: 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 新浪微博:@寻觅神迹内容系本人学习、研究和总结,如有雷同,实属荣...
  • halcyonbaby
  • halcyonbaby
  • 2015年11月28日 16:37
  • 10508

[Kubernetes]Docker的overlay网络模型

上一篇文章[Kubernetes]Docker的网络模型较详细介绍了Docker里的bridge网络模型。本篇介绍Docker的overlay网络模型。Docker内置overlay网路模式驱动lib...
  • zjysource
  • zjysource
  • 2016年07月30日 22:50
  • 1783

使用Docker镜像搭建consul和swarm集群基础环境及overlay网络

Docker的使用中,尤为重要的是服务发现和docker的宿主机集群及跨主机overlay网络的搭建,这里来介绍下常用来配合使用的swarm+consul集群的搭建(此处全基于docker容器)...
  • gsying1474
  • gsying1474
  • 2016年09月30日 15:16
  • 3131

准备 overlay 网络实验环境 - 每天5分钟玩转 Docker 容器技术(49)

overlay 需要 key-value 数据库存储数据,我们将安装并配置 consul。
  • CloudMan6
  • CloudMan6
  • 2017年08月02日 07:04
  • 771

跨主机网络概述 - 每天5分钟玩转 Docker 容器技术(48)

跨主机网络方案包括: 1. docker 原生的 overlay 和 macvlan。 2. 第三方方案:常用的包括 flannel、weave 和 calico。...
  • CloudMan6
  • CloudMan6
  • 2017年07月31日 06:13
  • 823
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Docker 1.9 Overlay Network实现跨主机网络互通
举报原因:
原因补充:

(最多只允许输入30个字)