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

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.

docker with flannel的更多相关文章

  1. docker使用flannel网络

    基础环境我们使用了两台centos 7系统 基础配置为: 两台机器IP为 172.17.3.10 172.17.3.62 hosts文件配置为 172.17.3.10 node1 172.17.3.6 ...

  2. Docker 网络 Flannel

    flannel 安装 sudo yum install kernel-headers golang gccyum install flannel flannel 配置 在etcd中设置变量 etcdc ...

  3. Docker - 用Flannel跨主机

    试了下比较流行的几种SDN,感觉flannel还是比较好用,这里简单记录一下. 用的是virtualbox,3个机器,分别为: genesis : inet 192.168.99.103/24 brd ...

  4. 二进制安装 kubernetes 1.12(二) - 安装docker, 部署Flannel网络

    在 node 节点上安装 docker 参考 https://www.cnblogs.com/klvchen/p/8468855.html Flannel 工作原理: 部署Flannel网络 在 ma ...

  5. k8s1.4.3安装实践记录(1)-etcd、docker、flannel安装配置

    虚拟机:VMware® Workstation 12 Pro 系统:CentOS Linux release 7.2.1511 (Core) 3.10.0-327.el7.x86_64 由于刚开始学习 ...

  6. docker使用 Flannel(etcd+flannel)网络

    一.Flannel网络简介 Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信,Flannel是CoreOS开发,专门用于 ...

  7. 【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别

    From the previous posts, I have analysed 4 different Docker multi-host network solutions - Calico, F ...

  8. docker k8s 1.3.8 + flannel

    docker k8s + flannel kubernetes 是谷歌开源的 docker 集群管理解决方案. 项目地址: http://kubernetes.io/ 测试环境: node-1: 10 ...

  9. 在 Docker 中使用 flannel - 每天5分钟玩转 Docker 容器技术(60)

    上一节我们安装和配置了 flannel,本节在 Docker 中使用 flannel. 配置 Docker 连接 flannel 编辑 host1 的 Docker 配置文件 /etc/systemd ...

随机推荐

  1. 手动搭建express框架

    创建相应的文件夹 在根路径下创建package.json文件并在命令面板里安装相应的模块包(如下) 2.  在根路径下创建app.js, 在根路径下创建routes文件夹,并在文件夹中创建index. ...

  2. POJ 1849 Two(树的直径--树形DP)(好题)

    大致题意:在某个点派出两个点去遍历全部的边,花费为边的权值,求最少的花费 思路:这题关键好在这个模型和最长路模型之间的转换.能够转换得到,全部边遍历了两遍的总花费减去最长路的花费就是本题的答案,要思考 ...

  3. 【Jsp】JSP自己定义标签与MODEL1、MODEL2标准

    在JSP2.0之后支持自己定义标签,如今一般都是jsp2.4的版本号了,所以无须考虑版本号的问题. 直接使用就能够了.尽管一般开发的过程中,非常少会自己定义JSP标签.可是通过一个JSP自己定义标签的 ...

  4. TRIZ系列-创新原理-26-复制原理

    复制原理的详细表述例如以下:1)用简化的,廉价的复制品来替代易碎的或不方便操作的物体;    这样能够减少成本,提高可操作性.2)假设已经使用了可见光的复制品,那么使用红外光或者紫外光的复制品:    ...

  5. A. Arrays(Codeforces Round #317 水题)

    A. Arrays time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  6. hdu 4869 Turn the pokers (思维)

    Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. ABP入门系列(6)——定义导航菜单

    ABP入门系列目录--学习Abp框架之实操演练 完成了增删改查以及页面展示,这一节我们来为任务清单添加[导航菜单]. 在以往的项目中,大家可能会手动在layout页面中添加一个a标签来新增导航菜单,这 ...

  8. 使用javaMail和velocity来发送模板邮件

    之前在ssh项目中有用过javaMail和velocity来发送邮件,实现的效果如下所示. 这类邮件主要用于公司的推广宣传,比如商城的促销等场景. 今天打算将邮件模块也集成到ssm项目,也算是对之前做 ...

  9. SpringCloud四:hystrix-propagation

    注:pom.xml 及配置文件配置与上篇相同 package com.itmuch.cloud.controller; import org.springframework.beans.factory ...

  10. IIS 5.x与ASP.NET

    转自:http://www.cnblogs.com/artech/archive/2009/06/20/1507165.html 我们先来看看IIS 5.x是如何处理基于ASP.NET资源(比如.as ...