docker容器的跨主机访问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker容器的跨主机访问相关的知识,希望对你有一定的参考价值。

在同一宿主机下的Docker的容器之间是默认互相联通的。通过docker inspect id或name可以查看到ip地址。在不同的容器中来执行ping是可以ping通的,然而跨容器则行不通,于是总结了以下3种方法

Docker容器默认跨主机之间的链接方法

第一种:网桥实现

在docker宿主机上运行ifconfig命令可以看的存在一个docker0的网桥。Docker容器通过docker0 网桥实现同一主机间中,容器的ip地址分配和访问,所以,如果希望Docker跨主机访问,最简单的方式就是将不同主机的docker0 设置为同一网段。

整体网络拓扑结构就是这样:

技术分享

但是通过这种桥接,所有网卡都要在一个网段下,所以要对每个Docker守护进程对ip的分配做出限制:

下面,我们就来实现这个结构:

两台Ubuntu 的 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

1)以下,以Host1 为例,Host2 上操作相似,只是网卡名字不一样,我们不使用默认的docker0 网桥,而是自己新建一个网桥:

首先安装网桥管理工具 apt-get install bridge-utils
  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

这里,我们就准备好了网桥设置

2)下面我们来修改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 

     

3)  验证

1.分别在两个Host上启动一个容器

  $ docker run -it ubuntu /bin/bash 
   
2.在容器中运行ping命令查看连接情况 发现是互通的。

第二种: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  #ovs状态sudo ovs-vsctl add-br obr0  #增加ovs网桥名为obr0sudo ovs-vsctl add-port obr0 gre0  # 增加gre接口名为obr0sudo ovs-vsctl set interface gre0 type=gre
options:remote_ip=10.211.55.5 
 #设置接口指定链接类型为gre 并指定远程链接的ipsudo ovs-vsctl show  
   #接下来设计本机docker网桥sudo brctl addbr br0  
sudo ifconfig br0 10.211.55.1 netmask 255.255.255.0  sudo brctl addif br0 obr0#为本机网桥设置ovs网桥链接 sudo brctl show  
   #最后设置为docker网桥br0
   #这样本机就可以链接10.211.55.5

对于10.211.55.5要联通10.221.55.3只需要对其设置路由表即可:

route  sudo ip route add 10.211.55.0/24 via 10.211.55.5 dev eth0

第三种方法: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#配置docker处于192.168.0.2/24的网段中c2=$(weava run 192.168.0.2/24 -ti ubuntu /bin/bash)
docker attach $c2


本文出自 “Dr小白” 博客,请务必保留此出处http://1213503.blog.51cto.com/1203503/1945275

以上是关于docker容器的跨主机访问的主要内容,如果未能解决你的问题,请参考以下文章

实战|两种常用的跨主机Docker容器互通方法

8天入门docker系列 —— 第七天 让你的container实现跨主机访问

Docker容器跨主机通信之:直接路由方式

Docker容器跨主机多网段通信解决方案

Docker 容器跨主机多网段通信解决方案

docker从容器中怎么访问宿主机