同一个主机上的Docker容器之间通信

docker 引擎会在主机上增加一个docker0网卡,该网卡具有双重身份:

1.从容器视角,网桥(交换机)身份
docker0 对于运行在同一个主机上的各个容器来说,是二层交换机的角色:洪范,维护CAM表,在二层转发数据包;同时,docker0 自身也具有MAC地址,并且绑定了IP,因此在容器中还可以作为默认网关存在。
2.从宿主机视角,网卡身份
物理交换机提供了由硬件实现的高效的背板通道,供连接在交换机上的主机高效实现二层通信;对于开启了三层协议的物理交换机而言,其ip路由的处理
也是由物理交换机管理程序提供的。对于docker0而言,其负责处理二层交换机逻辑以及三层的处理程序其实就是宿主机上的Linux内核
tcp/ip协议栈程序。而从宿主机来看,所有docker0从veth(只是个二层的存在,没有绑定ipv4地址)接收到的数据包都会被宿主机
看成从docker0这块网卡接收进来的数据包,尤其是在进入三层时,宿主机上的iptables就会
对docker0进来的数据包按照rules进行相应处理(通过一些内核网络设置也可以忽略docker0 brigde数据的处理)。

通过,docker0的网桥功能,可以实现在同一个主机上的各个容器之间的通信。

不同主机上的Docker容器之间通信

网上找到一些解决方案:

  1. 使用openvswitch 搭建 xvlan协议隧道
  2. 将多个物理机的容器组到一个物理网络,这需要在每台机器上创建自己的网桥br0,然后将docker默认网桥绑定到br0
  3. 使用docker的swarm集群
  4. 使用docker的overlay网络

swarm集群在上文中已经实现,这里实现方案4,使用docker的overlay网络。

准备
搭建环境:
(1)物理主机 dev-11 IP=162.10575.113, 上面运行docker容器 host1
(2)物理主机 dev-12 IP=162.105.75.220,上面运行docker容器 host2

1. 安装并配置consul
Consul
是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla
Public License 2.0 的协议进行开源. Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对.

(1)直接从官网下载,并解压,将二进制文件拷贝到 /usr/local/bin 目录下即安装完成,同时创建新文件夹 /opt/consul 用于存放consul运行时产生的文件
(2)在dev-11机器上执行nohup consul agent -server -bootstrap -data-dir /opt/consul -bind=162.105.75.113 &,将dev-11作为server节点
(3)在dev-12机器上执行nohup consul agent -data-dir /opt/consul -bind=162.105.75.220 &,将dev-12作为client节点,然后 consul join dev-11 加入集群。
(4)分别在 dev-11和dev-12上执行,consul members来查看集群中是否有两个主机。

[root@dev-12 skc]# consul members
Node Address Status Type Build Protocol DC
dev-11 162.105.75.113:8301 alive server 0.7.5 2 dc1
dev-12 162.105.75.220:8301 alive client 0.7.5 2 dc1
我在搭建的时候一直出现 500 错误,无法建成集群,最后发现是防火墙的原因。**centos 7 下默认防火墙为firewalld,且默认开机启动,一定要注意!**

2. 配置docker启动参数

在配置文件/lib/systemd/system/docker.service 中,

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=consul://localhost:8500 --cluster-advertise=eth0:2375

其中 cluster-store 的主机指定为localhost即可,cluster-advertise的ip可以指定为本机的网卡名。

3. 创建overlay网络
在dev-11上执行,docker network create -d overlay multihost 创建overlay类型网络multihost。然后

[root@dev-11 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
914e62484c33 bridge bridge local
018d41df39c5 docker_gwbridge bridge local
0edff5347b33 host host local
e7b16dd58248 multihost overlay global
1d25e019c111 none null local
说明网络建立成功

此时,在dev-12机器上,

[root@dev-12 skc]# docker network ls
NETWORK ID NAME DRIVER SCOPE
7af47cbb82c8 bridge bridge local
30911dfed7f2 docker_gwbridge bridge local
6e6deb4077c4 host host local
e7b16dd58248 multihost overlay global
dc7f861e601a none null local

说明overlay网络被同步过去了。

4. 创建容器并测试

[root@dev-11 skc]# docker run -it --name=host1 --net=multihost debugman007/ubt14-ssh:v1 bash

[root@dev-12 skc]# docker run -it --name=host2 --net=multihost debugman007/ubt14-ssh:v1 bash

在host1中,

root@d19636118ead:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0a:00:00:02
inet addr:10.0.0.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe00:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
RX packets:24 errors:0 dropped:0 overruns:0 frame:0
TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1904 (1.9 KB) TX bytes:2122 (2.1 KB) eth1 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1018 (1.0 KB) TX bytes:868 (868.0 B) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:970 (970.0 B) TX bytes:970 (970.0 B)
在host2中
root@7bd8ff1ab133:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0a:00:00:03
inet addr:10.0.0.3 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe00:3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
RX packets:25 errors:0 dropped:0 overruns:0 frame:0
TX packets:23 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1966 (1.9 KB) TX bytes:1850 (1.8 KB) eth1 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:22 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2412 (2.4 KB) TX bytes:648 (648.0 B) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:934 (934.0 B) TX bytes:934 (934.0 B)

此时,在host1中ping host2

root@d19636118ead:/# ping host1
PING host1 (10.0.0.2) 56(84) bytes of data.
64 bytes from d19636118ead (10.0.0.2): icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from d19636118ead (10.0.0.2): icmp_seq=2 ttl=64 time=0.057 ms
^C
--- host1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.047/0.052/0.057/0.005 ms
root@d19636118ead:/# ping host2
PING host2 (10.0.0.3) 56(84) bytes of data.
64 bytes from host2.multihost (10.0.0.3): icmp_seq=1 ttl=64 time=0.917 ms
64 bytes from host2.multihost (10.0.0.3): icmp_seq=2 ttl=64 time=0.975 ms
64 bytes from host2.multihost (10.0.0.3): icmp_seq=3 ttl=64 time=0.935 ms
^C
--- host2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.917/0.942/0.975/0.034 ms

能够ping通,说明跨主机的容器搭建完成。

参考

理解Docker单机容器网络
理解Docker跨多主机容器网络
基于consul的Docker-overlay跨多宿主机容器网络

docker应用-5(使用overlay 网络进行容器间跨物理主机通信)的更多相关文章

  1. [docker]docker自带的overlay网络实战

    overlay网络实战 n3启动consul docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -b ...

  2. docker 环境下创建 overlay 网络方案

    一.环境 三台机器,其中一台安装 consul(192.168.1.21), 两台创建网络(192.168.1.32,33) 二.实现步骤 1.构建环境 1)三台机器部署docker环境 2)选择一台 ...

  3. docker容器间跨主机通信

    http://jnzg905.iteye.com/blog/2269583 https://blog.csdn.net/pingpangbing0902/article/details/7823889 ...

  4. CentOS安装etcd和flannel实现Docker跨物理机通信

    1.安装etcd yum install etcd systemctl stop etcd systemctl start etcd systemctl status etcd systemctl e ...

  5. etcd和flannel实现docker跨物理机通信

    实验目标 跨物理机的容器之间能直接访问docker通过Flannel可以实现各容器间的相互通信,即宿主机和容器,容器和容器之间都能相互通信 实验环境 192.168.3.50 //etcd.flann ...

  6. Vmware虚拟机网络模式及虚拟机与物理机通信方法

    [转]http://www.cqeis.com/news_detail/newsId=1477.html Vmware虚拟机软件是一个“虚拟PC”软件,它使你可以在一台机器上同时运行二个或更多Wind ...

  7. 第 8 章 容器网络 - 065 - 容器在 Weave 中如何通信和隔离?

    首先在host2 执行如下命令: weave launch 10.12.31.22 这里必须指定 host1 的 IP 10.12.31.22,这样 host1 和 host2 才能加入到同一个 we ...

  8. Docker容器跨主机通信--overlay网络

    一.Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接 ...

  9. Docker 新网络 overlay 网络

    Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式. 这样不但能够充分利用成熟的IP路由协议进程数据分发,而且在Overlay技术 ...

随机推荐

  1. Intel处理器技术文档

    1.intel程序员手册(1986).pdf 下载地址 2.Intel® 64 and IA-32 Architectures Software Developer Manuals   下载链接 3. ...

  2. Linux压力测试工具stress的参数详解

    为了测试服务器的负载情况,可以使用stress这个压力测试工具,可以在环境上验证测试下. stress安装 sudo yum install -y epel-release sudo yum inst ...

  3. VUE温习:nextTick、$refs、嵌套路由、keep-alive缓存、is特性、路由属性用法、路由钩子函数

    一.$nextTick 1.vue的dom执行异步更新,只要观察到数据变化,vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变. 2.vue.$nextTick(cb),数据发生变化,更新 ...

  4. A Sample Linker Script

    from:http://www.hertaville.com/a-sample-linker-script.html A sample script file that will work with ...

  5. PL/SQL学习笔记程序单元

    一:程序单元组成 一个PL/SQL程序单元主要包括三部分: 声明与定义部分:声明变量.常量.类型等:定义过程.函数等: 执行部分:执行PL/SQL语句:调用过程.参数:处理游标等: 异常处理部分:处理 ...

  6. 【redis持久化】redis持久化理解

    1.以下内容仅为个人理解和总结,仅供参考,万万不可全盘真信,内容会进行实时改进和修正 2.redis持久化: 参考链接1.https://redis.io/topics/persistence  -- ...

  7. Docker入门 - 002 Docker 的简单操作

    系统要求:CentOS 7.2 64 位操作系统. Docker 的简单操作 下载镜像 下载一个官方的 CentOS 镜像到本地 docker pull centos 下载好的镜像就会出现在镜像列表里 ...

  8. Atitit s2018.5 s5 doc list on com pc.docx  v2

    Atitit s2018.5 s5  doc list on com pc.docx  Acc  112237553.docx Acc Acc  112237553.docx Acc baidu ne ...

  9. [lvs]lvs的三种模式

    回顾了下lvs的三种模式的调度机制 1.lvs的dr模式中的arp的抑制,eth用自己口arp回应. 2.keepalive是否直接操作rs? 不直接操作, 只操作dr(配lvs) 3.tunnel模 ...

  10. c groups

    https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt https://developer.ibm.com/hadoop/2017 ...