zoukankan      html  css  js  c++  java
  • docker集群部署

    一、使用自定义网桥连接跨主机容器

    要是Linux可以工作在网桥模式,必须安装网桥工具bridge-utils,运行命令:# yum install bridge-utils

    查看桥连状态:# brctl show

    1、brctl的使用

      帮助:# brctl --help
      addbr bridge的名称  #添加bridge;
      delbr bridge的名称  #删除bridge;
      addif bridge的名称device的名称  #添加接口到bridge;
      delif bridge的名称device的名称  #从bridge中删除接口
      setageing bridge的名称 时间  #设置老化时间,即生存周期
      setbridgeprio bridge的名称 优先级  #设置bridge的优先级
      setfd bridge的名称 时间  #设置bridge转发延迟时间
      sethello bridge的名称 时间  #设置hello时间
      setmaxage bridge的名称 时间  #设置消息的最大生命周期
      setpathcost bridge的名称 端口 权重  #设置路径的权值
      setportprio bridge的名称 端口 优先级  #设置端口的优先级
      show  #显示bridge列表
      showmacs bridge的名称  #显示MAC地址
      showstp  bridge的名称  #显示bridge的stp信息
      stp bridge的名称{on|off}  #开/关stp
     
      设置linux让网桥运行    配置网桥
      创建一个虚拟的以太网桥接口:# brctl addbr br0

      关闭stp协议:# brctl stp br0 off  

      添加两个(或更多)以太网物理接口:  

      # brctl addif br0 eth0  

      # brctl addif br0 eth1  

      现在他们成了逻辑网桥设备的一部分了,不再需要IP地址。下面我们将这些IP地址释放掉  

      # ifconfig eth0 down    

      # ifconfig eth1 down  

      # ifconfig eth0 0.0.0.0 up  

      # ifconfig eth1 0.0.0.0 up

      最后,启用网桥  # ifconfig br0 up

      我们给这个新的桥接口分配一个IP地址

      # ifconfig br0 10.0.3.129

      或者把最后这两步合成一步:

      # ifconfig br0 10.0.3.129 up

      关闭网桥命令

      # brctl delif br0 eth1

      # brctl delif br0 eth0

      # ifconfig br0 down

      # brctl delbr br0
    2、建立网桥

      宿主机网卡信息: name:ens33

      IP:192.168.1.214

      GATEWAY:192.168.1.1

      DNS:114.114.114.114

      (1)停止docker服务 

        # service docker stop 

      (2)删除docker0网卡

        # ip link set dev docker0 down

        # brctl delbr docker0

      (3)新建桥接物理网络虚拟网卡br0

        # brctl addbr br0

        # ip link set dev br0 up

        # ip addr add 192.168.1.215/24 dev br0  为br0分配物理网络中的ip地址

        # ip addr del 192.168.1.214/24 dev ens33  将宿主机网卡的IP清空

        # brctl addif br0 ens33  将宿主机网卡挂到br0上 (若xshell端操作会断开,需进入vmware虚拟机进行操作)  

        # ip route add default via 192.168.1.1 dev br0  为br0设置路由

      (4)设置docker服务启动参数

        # vim /etc/sysconfig/docker #在OPTIONS='--selinux-enabled'这行中修改为OPTIONS='--selinux-enabled -b=br0'

        解决centos7里没有docker没有配置文件

        # vim  /lib/systemd/system/docker.service    

          [Unit]
          Description=Docker Application Container Engine
          Documentation=https://docs.docker.com
          After=network.target docker.socket
          Requires=docker.socket

          [Service]
          Type=notify
          EnvironmentFile=/etc/sysconfig/docker
          ExecStart=/usr/bin/docker -d $OPTIONS -H fd://
          LimitNOFILE=1048576
          LimitNPROC=1048576
          LimitCORE=infinity
          MountFlags=slave

          [Install]
          WantedBy=multi-user.target

        # vim /etc/sysconfig/docker     

          # Modify these options if you want to change the way the docker daemon runs
          OPTIONS='-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock'
          DOCKER_CERT_PATH=/etc/docker

          # If you want to add your own registry to be used for docker search and docker
          # pull use the ADD_REGISTRY option to list a set of registries, each prepended
          # with --add-registry flag. The first registry added will be the first registry
          # searched.
          # ADD_REGISTRY='--add-registry registry.access.redhat.com'

          # If you want to block registries from being used, uncomment the BLOCK_REGISTRY
          # option and give it a set of registries, each prepended with --block-registry
          # flag. For example adding docker.io will stop users from downloading images
          # from docker.io
          # BLOCK_REGISTRY='--block-registry'

          # If you have a registry secured with https but do not have proper certs
          # distributed, you can tell docker to not look for full authorization by
          # adding the registry to the INSECURE_REGISTRY line and uncommenting it.
          INSECURE_REGISTRY='--insecure-registry dl.dockerpool.com:5000'

          # On an SELinux system, if you remove the --selinux-enabled option, you
          # also need to turn on the docker_transition_unconfined boolean.
          # setsebool -P docker_transition_unconfined 1

          # Location used for temporary files, such as those created by
          # docker load and build operations. Default is /var/lib/docker/tmp
          # Can be overriden by setting the following environment variable.
          # DOCKER_TMPDIR=/var/tmp

          # Controls the /etc/cron.daily/docker-logrotate cron job status.
          # To disable, uncomment the line below.
          # LOGROTATE=false

        重启docker

          # systemctl daemon-reload

          # systemctl restart docker

        (5)启动docker服务

        # service docker start

        (6)安装pipework

        # yum install -y git

        # git clone https://github.com/jpetazzo/pipework

        # cp ~/pipework/pipework/usr/local/bin/

        (7)启动一个手动设置网络的容器,这里最好不要让docker自动获取ip,下次启动会有变化而且自动获取的ip可能会和物理网段中的ip冲突

        # docker run -d --net=none --name=test-net centos /bin/bash

        (8)为weifeng容器设置一个与桥接物理网络同地址段的ip@网关

        # pipework br0 test-net 192.168.1.125/24@192.168.1.1

        (9)进入容器查看ip

        # docker exec -it test-net /bin/bash

    二、使用Ambassador容器

      当两个Docker容器在同一主机时,可以通过--link命令让两者直接互相访问。如果要跨主机实现容器互联,则往往需要容器知道其他物理主机的IP地址。利用Ambassador容器机制,可以让互联的容器无需知道所在物理主机的IP地址即可互联。Ambassador容器也是一种Docker容器,它在内部提供了转发服务。当客户端容器要访问服务端容器的时候,直接访问客户端Ambassador容器;这个请求会被客户端Ambassador转发出去,到达服务端主机。服务端Ambassador容器监听在对应端口上,收到请求后再转发请求给服务端容器。

    以redis镜像为例。

      首先在服务端主机上创建一个服务端容器redis-server:

      $ sudo docker run -d -name redis-server crosbymichael/redis

      创建一个服务端Ambassador容器redis_ambassador,连接到服务端容器redis-server,并监听本地的6379端口:

      $ sudo docker run -d -link redis-server:redis -name redis_ambassador -p 6379:6379 svendowideit/ambassador

      在客户端主机上创建客户端Ambassador容器,告诉它服务端物理主机的监听地址是tcp://x.x.x.x:6379,将本地收集到6379端口的流量转发到服务端物理主机:

      $ sudo docker run -d -name redis_ambassador -expose 6379 -e REDIS_PORT_6379_TCP=tcp://x.x.x.x:6379 svendowideit/ambassador

      最后,创建一个客户端容器,进行测试,默认访问6379端口实际上是访问的服务端容器内的redis应用:
      $ sudo docker run -i -t -rm -link redis_ambassador:redis relateiq/redis-cli

      redis 172.17.0.160:6379> ping
      PONG
    Ambassador镜像的Dockerfile
      Ambassador镜像的Dockerfile如下所示。其实现十分简单,主要是一行正则表达式,从环境变量中找到包含“TCP”字符串的变量,然后使用正则表达式`.*_PORT([0-9])_TCP=tcp://(.):(.*)`从中提取IP和端口号,最后利用socat(一个socket转发程序)将流量转发到指定的地址上:
      FROM    docker-ut
      MAINTAINER SvenDowideit@home.org.au
      CMD     env | grep _TCP= | sed 's/.*_PORT_([0-9]*)_TCP=tcp://(.*):(.*)/socat TCP4-LISTEN:1, fork, reuseaddr TCP4:2:3 &/'  | sh && top
      这种情况下,需要额外的Ambassador容器,并且也仍然需要知道目标容器所在的物理主机的地址。

  • 相关阅读:
    【more effective c++读书笔记】【第2章】操作符(1)
    【more effective c++读书笔记】【第1章】基础议题(2)
    【more effective c++读书笔记】【第1章】基础议题(1)
    【effective c++读书笔记】【第9章】杂项讨论
    Spring(十二)Spring整合Mybatis
    Spring(十一)Spring事物
    Spring(九)AspectJ
    Spring(八)两种自动代理
    Spring 考试错题分析
    Sping(七)Sping四种增强和顾问
  • 原文地址:https://www.cnblogs.com/wu-wu/p/10341290.html
Copyright © 2011-2022 走看看