docker 容器之间通信容器跨主机通信方案选哪一种

Docker容器的跨主机访问
视频太卡?试试切换线路
本课时介绍Docker容器跨主机网络访问的主要实现方式,以及本课程的课时安排
本课时介绍如何使用最基础的网桥技术实现Docker容器跨主机访问,包括测试环境的准备、网桥的配置、Docker守护进程的配置,并讲解了使用网桥在不同虚拟机中配置的注意事项和优缺点。
本课时介绍了如何使用Open vSwitch配置Docker的跨主机容器访问,包含Open vSwitch的简介、GRE隧道的简介,以及如何安装和使用Open vSwitch,并利用其实现Docker容器的跨主机访问配置
本课时介绍如何借助weave工具简化Docker容器的跨主机网络配置,包含weave的安装和如何使用weave指定ip地址来启动容器
只有成为VIP会员才能提问&回复,快吧!如果你还没有账号你可以一个账号。
添加新技术问题
课程 [Docker容器跨主机网络访问简介]
中已存在问题
添加新技术问题
问题描述越详细,被解答的速度越快
有新回答时请邮件提醒我
着急,拜托快点
不急,慢慢解决
关联课程 [Docker容器跨主机网络访问简介]
服务热线:400-678-8266利用虚拟网桥实现Docker容器的跨主机访问
时间: 22:27:30
&&&& 阅读:1301
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&最近在研究Docker,Docker的网络配置是比较令人头疼的部分,尤其是跨主机的容器间通信,很多解决方案都比较复杂,这里,我只用虚拟网桥来实现Docker的跨主机访问,分享出来,希望对Docker学习的各位有一定的启发。
基本思想:
由于Docker容器通过docker0 网桥实现同一主机间中,容器的ip地址分配和访问,所以,如果希望Docker跨主机访问,最简单的方式就是将不同主机的docker0 设置为同一网段。
那么怎么实现跨主机呢?我这里将本机网卡也通过网桥来连接,那么,整体网络拓扑结构就是这样:
但是通过这种桥接,所有网卡都要在一个网段下,所以要对每个Docker守护进程对ip的分配做出限制
下面,我们就来实现这个结构:
我的两台Ubuntu 14.04 的虚拟机ip:
Host1 : 10.211.55.3 &网卡:eth0
Host2 :10.211.55.5 & 网卡 & eth1
网关:10.211.55.1
对容器ip的划分:
Host1: 10.211.55.64/26
  地址范围: 10.211.55.65~10.211.55.126
Host2: 10.211.55.128/26
  地址范围: 10.211.55.129~10.211.55.190
需要的操作:
以下,以Host1 为例,Host2 上操作相似,只是网卡名字不一样,我在这里,没有使用默认的docker0 网桥,而是新建了虚拟网桥
1. 分别在Docker主机上建立虚拟网桥:
   Host1: $ sudo brctl addbr br0
2. 为网桥分配一个同网段ip
  Host1: $ sudo ifconfig br0 10.211.55.10 netmask 255.255.255.0  
  Host2: $ sudo ifconfig br0 10.211.55.20 netmask 255.255.255.0
3. 桥接本地网卡:
  Host1: $ sudo brctl addif br0 eth0
这里,我们就准备好了网桥设置
下面我们来修改Docker的配置,使用我们新建的网桥代替docker0:
1. 修改 /etc/default/docker文件
  $sudo vim /etc/default/docker
2. 添加守护进程的启动选项:
  Host1: DOCKER_OPTS=" -b=br0 --fixed-cidr=‘10.211.55.64/26‘ "&&
  Host2: DOCKER_OPTS=" -b=br1 --fixed-cidr=‘10.211.55.128/26‘ "
& & & 这里,-b 用来指定容器连接的网桥名字
     --fixed-cidr用来限定为容器分配的IP地址范围
3. 保存文件并重启Docker服务
  $ sudo service docker restart
下面,就可以来验证:
1.分别在两个Host上启动一个容器
  $ docker run -it ubuntu /bin/bash
&2.在容器中运行ping命令查看连接情况 &
  标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/ruiqingzhang/p/4463971.html
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!3509人阅读
容器|Windows Container(2)
容器|Docker(26)
前面我们已经针对Docker容器进行了简单介绍,相信感兴趣的朋友已经能在相关帮助下部署一个docker环境感受了容器带给我们的另一种技术进步。
当然,如果你慢慢深入容器的技术研究,你会发现,尽管容器是虚拟机的未来趋势,但是容器还有很多需要进步,特别是关于网络方面,虚拟化技术可以支持非常丰富的网络需求,但是现在容器可能在这一块还需要继续进步和完善,最大的需求就是如果我们构建容器集群,我们可能只在一个宿主机上创建多个容器,可能需要N个宿主机,每个宿主机上又包含M个容器,我们需要N*M个容器组成一个大的容器集群网络,那么如何跨宿主机进行容器的网络连接是需要我们关注的,当然,现在也有非常多的方案供我们去选择:
--------------------------------------------------------------------------------------
宗旨:专注于&GIS+&前沿技术的研究与交流,将云计算技术、大数据技术、容器技术、物联网与GIS进行深度融合,探讨&GIS+&技术和行业解决方案
转载说明:文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
--------------------------------------------------------------------------------------
1、利用容器暴露端口方式
2、LinuxBriage方式
3、例如类似weave方式实现
4、也是本博客介绍的利用OpenvSwitch来实现
关于OpenvSwitch不多介绍,我OpenStack的早期版本(K版本之前),关于网络Neutron的实现都是通过OpenvSwitch。
使用VMWare Workstation12
Ubuntu14.04
Docker 1.9.0
1、构建OpenvSwitch安装包
默认安装的版本不符合需求,也可以在一个新环境执行如下步骤
#获取最新存档
wget http://openvswitch.org/releases/openvswitch-2.3.1.tar.gz
tar xzvf openvswitch-2.3.1.tar.gz
cd openvswitch-2.3.1
sudo apt-get install -y build-essential fakeroot debhelper \
autoconf automake bzip2 libssl-dev \
openssl graphviz python-all procps \
python-qt4 python-zopeinterface \
python-twisted-conch libtool
# 构建(不使用并行检查)
DEB_BUILD_OPTIONS='parallel=8 nocheck' fakeroot debian/rules binary
# 得到最新deb文件并复制到某处
ls -al *deb
执行完毕之后可以看到
openvswitch-2.3.1.tar.gz
openvswitch-common_2.3.1-1_amd64.deb
openvswitch-datapath-dkms_2.3.1-1_all.deb
openvswitch-datapath-source_2.3.1-1_all.deb
openvswitch-dbg_2.3.1-1_amd64.deb
openvswitch-ipsec_2.3.1-1_amd64.deb
openvswitch-pki_2.3.1-1_all.deb
openvswitch-switch_2.3.1-1_amd64.deb
openvswitch-test_2.3.1-1_all.deb
openvswitch-vtep_2.3.1-1_amd64.deb
python-openvswitch_2.3.1-1_all.deb
这也是我们需要的相关版本,然后安装即可(默认认为Docker环境以及安装好)
sudo apt-get install -y bridge-utils
sudo dpkg -i openvswitch-common_2.3.1-1_amd64.deb \
openvswitch-switch_2.3.1-1_amd64.deb
2、配置网络
默认两台机器的IP可以互相ping通,然后,只需要设置网络即可
例如在192.168.12.107机器上设置为
# auto:为了有效地在主机启动时启动它
# br0=br0:防止在`ifquery --list`时被找到
auto br0=br0
allow-ovs br0
iface br0 inet manual
ovs_type OVSBridge
ovs_ports gre1 gre2
ovs_extra set bridge ${IFACE} stp_enable=true
# 没有auto,这是ovs的一个额外配置
# 两台主机的gre名字必须相符
allow-br0 gre1
iface gre1 inet manual
ovs_type OVSPort
ovs_bridge br0
ovs_extra set interface ${IFACE} type=gre options:remote_ip=192.168.12.117
# auto:启动时创建
# 定义docker要使用的docker0,并(在可用时)连接到到OpenVSwitch创建的br0网桥上
# 每台主机需要使用不同的IP地址(不要相互冲突!)
auto docker0=docker0
iface docker0 inet static
address 172.17.1.1
network 172.17.0.0
netmask 255.255.0.0
bridge_ports br0
在其他机器上,只需在配对的远程IP修改即可,如果需要更多的宿主机,可以添加更多的gre隧道即可,例如
allow-br0 gre2(新的gre)
iface gre2 inet manual
ovs_type OVSPort
ovs_bridge br0 (都在br0网桥)
ovs_extra set interface ${IFACE} type=gre options:remote_ip=192.168.12.199(新的IP)
生成树协议(Spanning Tree Protocol):如果应用该配置,将在3台服务器中创建一个网络回路,这可不行。给br0网桥添加stp_enable=true将确保一些gre隧道被切断。同时确保网状网络的冗余,允许网络在其中一台主机下线时恢复。MTU:这是一项关键设定!没有这项,你可能获得一些意外“惊喜”:网络看起来工作正常(比如可以ping),但无法支持大数据包(比如BW测试中的iperf、大数据量请求或简单的文件复制)。注意,需要封装多种协议:
以太网:14字节——我们说的是网桥间的第2层;IPv4:20字节——容器/主机间通讯;GRE:4字节——因为,嗯,这是个GRE隧道;也就是物理网卡MTU减去38字节,结果是1462(基于常规的1500 MTU网卡)。
在auto定义中使用“=”:对于具有固定IP的服务器这不是必需的,但有些云服务商(这里就不说是谁了……Digital
Ocean(译者:软广再次乱入))使用了一个依靠ifquery --list --allow auto的init服务(/etc/init/cloud-init-container.conf)。不加上“=”号将包含OpenVSwitch网卡,并延迟整个启动过程直到init脚本失败并超时。docker0网桥:每台服务器都需要自己的IP地址(比如172.17.1.1、172.17.1.2)。由于docker0网桥处在br0网桥之上,它们将(也应该!)可以相互连接。想象一下,要解决IP冲突会有多乱……这也是为什么我们要在启动时定义它,而不依赖docker服务来为我们创建这个网桥。GRE隧道:你可以从gre0(而不是gre1)开始,它能完美工作。但由于某种原因,在输入ifconfig时你可以看到gre0,却看不到其他隧道。这可能是gre0作为的一个副作用。从gre1开始将让所有的gre隧道对ifconfig“隐身”(好过于只能看见一个)。别着急,你还是可以使用ovs-vsctl命令显示隧道/网桥。3台以上主机:你可以遵循相同的逻辑,并且:
添加额外的隧道(iface greX)来连接新主机。在br0网桥定义中更新ovs_ports以包含interfaces文件中定义的所有gre隧道。聪明点……不要将每台服务器跟其他主机一一链接……STP收敛(convergence)将需要更长的时间,并且无法提供任何除了多重额外链路冗余之外的有用价值。
设置完毕之后,建议重启机器,然后可以在任意机器上都可以相互ping通管理IP(192.168.12.xxx)和docker0的IP(172.17.1.xxx)
3、容器添加
现在已经有网络了,需要将各个宿主机的容器都添加到docker0里面
每台主机(192.168.12.107、192.168.17.117)挂接到前面创建的docker0网桥上,其各自的IP地址是172.17.1.1、172.17.1.2;给docker0网卡指定了一个/16的IP范围;给每台主机指定了一小块docker0的IP范围,以/18&fixed-cidr的形式保存在它们的docker服务配置中。分别是172.17.64.0/18、172.17.128.0/18
如果你的主机多于3台,你需要细分一个每个范围,或根据组织需要对整个网络拓扑结构进行重新考虑。
所需,需要为每一个宿主机的docker配置相关IP信息
例如docker1机器(/etc/default/docker)
BRIDGE=docker0
CIDR=172.17.64.0/18
wait_ip() {
address=$(ip add show $BRIDGE | grep 'inet ' | awk '{print $2}')
[ -z &$address& ] && sleep $1 || :
wait_ip 15
DOCKER_OPTS=&
-H unix:///var/run/docker.sock
-H tcp://0.0.0.0:2375
--fixed-cidr=$CIDR
--bridge $BRIDGE
--mtu 1462
其他机器的CIDR参考上述即可。
你可以根据需要修改DOCKER_OPTS配置,添加镜像、不安全的registry、DNS等等。
wait_ip:由于docker0网桥最后被创建,获取IP地址可能需要花点时间。使用wait_ip“功能”,你可以在返回docker
init脚本前安全地等待几秒钟。该配置文件是被真正的init脚本(/etc/init/docker.conf)所引用。mtu:与前面相同原因,只是一个预防措施,用于确保每个网卡被创建时会被指定正确的MTU。-H tcp://……:如果你不想通过0.0.0.0将其“公开”(或绑定到服务器“真实”网卡之一),你也可以将它安全地绑定到……该主机的docker0&IP地址(比如172.17.1.2)!这样,你可以从任何一台主机访问到私有网状网络里的任何一个docker服务。
1、分别在docker1和docker2运行容器实例
我在docker1运行了两个ubuntu 14.04实例,相关IP分别是172.17.64.1和172.17.64.2
我在docker2运行了一个ubuntu 14.04实例,相关IP分别是172.17.128.1
首先测试是否可以ping通
然后,我针对docker1的64.2容器,与docker2的128.1进行测试,分别安装了ssh服务,然后为docker2容器创建ss用户,然后通过docker1的64.2容器,进行ssh远程连接。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:222341次
积分:3973
积分:3973
排名:第6567名
原创:170篇
转载:14篇
评论:83条
(2)(3)(7)(1)(3)(4)(3)(3)(6)(3)(9)(3)(21)(15)(14)(19)(1)(2)(3)(6)(9)(15)(8)(22)1504人阅读
docker(2)
在同一宿主机下的Docker的容器之间是默认互相联通的。通过docker inspect
id或name可以查看到ip地址。在不通的容器中来执行ping是可以ping通的。
但我们通过观察发现,每一个启动容器的ip地址不是固定的,所以如果我们通过ip地址来实现互连明显是不靠谱的。但我们发现这些ip又处于同一网段中而且默认是127.0.0.X,这就是Docker容器默认跨主机之间的链接方法的第一种:网桥实现
在docker宿主机上运行ifconfig命令可以看的存在一个docker0的网桥。Docker容器通过docker0 网桥实现同一主机间中,容器的ip地址分配和访问,所以,如果希望Docker跨主机访问,最简单的方式就是将不同主机的docker0 设置为同一网段。
整体网络拓扑结构就是这样:
但是通过这种桥接,所有网卡都要在一个网段下,所以要对每个Docker守护进程对ip的分配做出限制:
下面,我们就来实现这个结构:
两台Ubuntu 的 ip:
Host1 : 10.211.55.3
网卡:eth0
Host2 :10.211.55.5
网关:10.211.55.1
对容器ip的划分:
Host1: 10.211.55.64/26
  地址范围: 10.211.55.65~10.211.55.126
Host2: 10.211.55.128/26
  地址范围: 10.211.55.129~10.211.55.190
需要的操作:
以下,以Host1 为例,Host2 上操作相似,只是网卡名字不一样,我在这里,没有我们不使用默认的docker0 网桥,而是自己新建一个网桥:
apt-get install bridge-utils
分别在Docker主机上建立虚拟网桥:
   Host1: $ sudo brctl addbr br0
为网桥分配一个同网段ip
  Host1: $ sudo ifconfig br0 10.211.55.10 netmask 255.255.255.0
  Host2: $ sudo ifconfig br0 10.211.55.20 netmask 255.255.255.0
桥接本地网卡:
  Host1: $ sudo brctl addif br0 eth0
这里,我们就准备好了网桥设置
下面我们来修改Docker的配置,使用我们新建的网桥代替docker0:
修改 /etc/default/docker文件
  $sudo vim /etc/default/docker
添加守护进程的启动选项:
  Host1: DOCKER_OPTS=” -b=br0 –fixed-cidr=‘10.211.55.64/26‘ “
  Host2: DOCKER_OPTS=” -b=br1 –fixed-cidr=‘10.211.55.128/26‘ “
  这里,-b 用来指定容器连接的网桥名字
     –fixed-cidr用来限定为容器分配的IP地址范围
保存文件并重启Docker服务
  $ sudo service docker restart
下面,就可以来验证:
1.分别在两个Host上启动一个容器
  $ docker run -it ubuntu /bin/bash
2.在容器中运行ping命令查看连接情况
发现是互通的。
Docker跨主机容器链接方法二:Open vSwitch
简称OVS是一个虚拟交换软件.目的是让大规模网络自动化可以通过编程扩展。
先看一下实现这种方式的连接所具备的条件:
1.双网卡,Host-Only & NAT
2.安装Open vSwitch: apt-get install openvswitch-switch
1.在虚拟机中建立ovs网桥
2.添加gre连接
3.配置docker容器虚拟网桥
4.为虚拟网桥添加ovs接口
5.添加不同Docker容器网段路由
具体执行的一些命令如下:
针对10.211.55.3设置
sudo ovs-vsctl show
sudo ovs-vsctl add-br obr0
sudo ovs-vsctl add-port obr0 gre0
sudo ovs-vsctl set interface gre0 type=gre
options:remote_ip=10.211.55.5
sudo ovs-vsctl show
sudo brctl addbr br0
sudo ifconfig br0 10.211.55.1 netmask 255.255.255.0
sudo brctl addif br0 obr0
sudo brctl show
对于10.211.55.5要联通10.221.55.3只需要对其设置路由表即可:
sudo ip route add 10.211.55.0/24 via 10.211.55.5 dev eth0
Docker跨主机容器链接方法三:weave
建立一个虚拟的网络,用于将运行在不同主机的Docker容器连接起来.
要实现这种方式所需要的条件如下:
双网卡,Host-Only & NAT
host1:10.0.2.6
host2:10.0.2.8
host1上应用容器1:192.168.0.2/24
host2上应用容器1:192.168.0.3/24
两台机器上均安装Docker以及weave,并均启动好weave路由容器
在两台机器上均启动一个应用容器.可以直接使用weave run命令,也可以先使用docker run启动好容器,然后使用weave attach命令给容器绑定IP地址
安装好weava之后,便执行绑定:
在10.0.2.6之中:
weava launch 10.0.2.8
c2=$(weava run 192.168.0.2/24 -ti ubuntu /bin/bash)
docker attach $c2
按如上的方法做了后所以主机内的容器通常是全部可以链接成功的,但一般情况下这样很不安全:
我们会使用在/etc/default/docker中配置-icc=false (拒绝容器的所有链接)以及–iptables=true (启动宿主机防火墙规则)而对于需要互连的则使用–link来制定。–link 容器名称:自己定义的别名
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:143741次
积分:2929
积分:2929
排名:第10081名
原创:145篇
转载:15篇
评论:42条
阅读:5393
文章:36篇
阅读:45321
文章:13篇
阅读:14906
(2)(8)(7)(2)(11)(3)(4)(5)(6)(11)(23)(15)(19)(28)(14)目前docker容器跨主机通信有没有稳定的,成熟的方案weave行吗weave行吗关注问题53回答技术总监
, 希云cSphere、赞同了此回答跨主机通信之前都研究过很多个解决方案:1.host 模式,使用宿主机的ip地址通信2.overlay+nat3.开源的软件,满足生产环境的需求有些牵强4.host bridge是目前在企业业务环境中实战过的最为可靠稳定的容器跨主机通信网络模式4.1 管理简单,容器和宿主机在同一个或不同网段,容器有独...跨主机通信之前都研究过很多个解决方案:1.host 模式,使用宿主机的ip地址通信2.overlay+nat3.开源的软件,满足生产环境的需求有些牵强4.host bridge是目前在企业业务环境中实战过的最为可靠稳定的容器跨主机通信网络模式4.1 管理简单,容器和宿主机在同一个或不同网段,容器有独立ip地址4.2 性能高,较其他几种网络模式,host bridge模式是性能最好的4.3 容器ip可固定,利用host bridge网络模式,实现固定容器网络的ip地址也很好实现另外我们还开发另外几个模式,主要为了希云cSphere平台和vmware等平台的对接。 赞同2系统架构师
, 自动化运维专家、赞同了此回答生产环境还是用host-bridge吧原因有4:1. 性能好2.管理简单3. 稳定不出毛病4. 企业生产环境,一台服务器上跑不了那么多的容器,所以,大部分场景,SDN根本不需要生产环境还是用host-bridge吧原因有4:1. 性能好2.管理简单3. 稳定不出毛病4. 企业生产环境,一台服务器上跑不了那么多的容器,所以,大部分场景,SDN根本不需要赞同2系统运维工程师
, 游戏公司赞同了此回答ovs+vxlan、flannel、weave都行,看你熟悉哪个。ovs+vxlan、flannel、weave都行,看你熟悉哪个。 赞同1撰写回答软件开发工程师, rock关注17发布3回答2}

我要回帖

更多关于 docker cp 主机到容器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信