zoukankan      html  css  js  c++  java
  • docker with flannel

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

        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.

     

  • 相关阅读:
    CopyOnWriteArrayList设计思路与源码分析
    点击页面按钮以excel保存到本地
    上传图片
    关于重复点击的
    去首尾空格还有换行问题//把数字换位大写字母//向后台传输数据
    判断输入的时间与当前的时间(判断时间是今天还是以前的)
    前端的一些小技巧
    git 操作大全
    移动web开发常见问题解决方案
    响应式布局
  • 原文地址:https://www.cnblogs.com/bear129/p/8044936.html
Copyright © 2011-2022 走看看