码迷,mamicode.com
首页 > 其他好文 > 详细

docker with flannel

时间:2017-12-15 23:35:17      阅读:40      评论:0      收藏:0      [点我收藏+]

标签:lib   exe   补充   启动   lin   测试   mon   star   war   

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

    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

标签:lib   exe   补充   启动   lin   测试   mon   star   war   

原文地址:http://www.cnblogs.com/bear129/p/8044936.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!