** 原创文章,请勿转载 **

docker的单host,多container环境下,是使用host的docker0网桥进行通信的。如果跨host, container之间要通信怎么办呢?
答案是flannel(当然也有其它方案)。
    
    本文记录下实验过程。

1. 环境

三个VM (都是CentOS 7.3 64位)
          192.168.1.120 etcd
          192.168.1.121 flannel, docker
          192.168.1.122 flannel, docker
   
   etcd, flannel, docker都是通过yum安装。 flannel是0.7.6版本, docker是17.09.0-ce版本

# yum install etcd
# yum install flannel
# yum install docker-ce

如果是yum install docker, 应该安装的是1.12.6。

2. 向etcd添加配置项

先在192.168.1.120上,用etcdctl向etcd添加一个flannel的配置项,名称任意。
   网上有/flannel/network/config, 有/coreos.com/network/config, ... 都行,无所谓。我用的是/flannel/network/config

# etcdctl set /flannel/network/config '{"Network": "10.80.0.0/16"}' 

这个10.80.0.0也是随便写的,10.20.0.0也行,反正随便, 习惯上一般是10.x.x.x, 或172.x.x.x 或192.x.x.x。
     /16, 掩码。
  
3. 启动flannel
   在192.168.1.121, 192.168.1.122两个vm上做同样的工作:

启动前,要对flannel进行配置

# vi /etc/sysconfig/flanneld

# 这个指定etcd集群的地址,多个地址用逗号分开
FLANNEL_ETCD_ENDPOINTS="http://192.168.1.120:2379"
# 这个是etcd里配置项的key的前缀, flannel是通过这个key,从etcd查询网络配置信息的
FLANNEL_ETCD_PREFIX="/flannel/network"

启动:

 # systemctl daemon-reload
# systemctl start flanneld

启动后,两个vm的docker0的ip,不再是172.17.0.1, 而是变成10.80.x.x,
   比如, 192.168.1.121的docker0的ip, 变成10.80.55.1
          192.168.1.122的docker0的ip, 变成10.80.17.1


   10.80.55.0/24, 10.80.17.0/24, 是10.80.0.0/16的子网, 这两个子网的网段就是flannel根据etcd里的配置,自动分配的。
   如果重新实验, 就不再是55和17,而是别的数字.

那么在192.168.1.121这台vm上, docker container分配的地址就是
   10.80.55.2, 10.80.55.3, ... 依此类推
   在192.168.1.122这个vm上, docker container的ip就是
   10.80.17.2, 10.80.17.3, ...

4. 启动docker
 
   那么现在的问题是,docker怎么就那么听话,使用你指定的子网呢? 默认docker是使用172.17.0.0段
   这个是通过dockerd的--bip参数指定的。

就是启动docker的时候要这样

# /usr/bin/dockerd --bip="10.80.55.1/24"

但这样是hardcode, 也就是ip是写死的,不能够啊。

flannel在安装时,会生成几个配置文件,具体是哪几个记不住不写了,网上都有。

经过参数化后,docker启动变成这个样子:

# vi /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd 改成
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPOTIONS 就OK了。 (DOCKER_NETWOKR_OPTIONS就是配置文件里的变量, 会映射到docker.service里)

启动

# systemctl daemon-reload
# systemctl start docker

5. 启用ip转发

如果不启用这个,跨host的容器间是不能通信的, 即使关掉selinux, firewalld也不行。

# iptables -P FORWARD ACCEPT

6. 测试
   测试使用alpine,或busybox,它们都有ping命令,这里以alpine为例 
   
   192.168.1.121:

192.168.1.122

如果不启动ip转发,可以ping通10.80.17.0, 10.80.17.1, 但ping不通10.80.17.2。

至此,实验成功!

7. 再补充一点

docker run 每启动一个container, host的主机上就会多出一个vethxxxxxx设备, 它对应着容器里的eth0.

最新文章

  1. 微软往年校招招面试题AC全解。
  2. java.io.Serializable 序列化接口
  3. log4j 文档
  4. Android composite adb interface
  5. Ubuntu 14.10 下grep命令详解
  6. ASP.NET Web.Config配置数据库连接的一种方法
  7. 【linux设备模型】之platform设备驱动
  8. j
  9. SQL with as 替代临时表的用法
  10. 怎么查看mysql执行过的sql。
  11. IOC 在Mvc中的使用
  12. php中__clone() shallow copy 只是浅复制
  13. 【扩展欧几里得】NOIP2012同余方程
  14. vue不是内部或外部命令,配置一个Path系统变量就可以解决
  15. JS基础整理
  16. 极光推送API
  17. 【C++】C++中assert和ENDEGU预处理语句
  18. 【03月04日】A股滚动市盈率PE历史新低排名
  19. 关于redux
  20. 安装配置php

热门文章

  1. Codeforces Round #257 (Div. 2) A. Jzzhu and Children(简单题)
  2. 5个步骤,将 storyboard 从 iphone 版转变为 ipad 版
  3. 《31天成为IT服务达人》最新文件夹
  4. SpringMVC+Mybatis架构中的问题记录
  5. 深入理解JSP
  6. Elasticsearch和MongoDB分片及高可用对比
  7. [LeetCode] 动态规划入门题目
  8. iOS 轻松实现自定义TabBar
  9. iOS知识点集合--更改(2)
  10. 1.QT开发第一个程序