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

要是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容器,并且也仍然需要知道目标容器所在的物理主机的地址。

docker集群部署的更多相关文章

  1. 27.Docker集群部署

    对于scrapy的部署方式 1.Scrapyd 安装扩展组件,远程控制scrapy任务,包括部署源代码,启动任务,监听任务.scrapy-client .scrapyd api 协助完成部署和监听操作 ...

  2. RocketMQ(2)---Docker集群部署RocketMQ

    RocketMQ(2)-Docker集群部署RocketMQ =前言= 1.因为自己只买了一台阿里云服务器,所以RocketMQ集群都部署在单台服务器上只是端口不同,如果实际开发,可以分别部署在多台服 ...

  3. Docker集群部署SpringCloud应用

    整体架构 docker环境准备 # linux下的安装,自行百度 # windows docker toolbox下载地址 https://download.docker.com/win/stable ...

  4. Spring Eureka 本地Docker集群部署

    故事背景 最近因为产线使用的服务与发现服务,使用的是Spring Cloud Eureka集群部署,为了以后调试产线的问题,想在本地搭建和产线一样的环境.产线的所有服务都是基于K8s和Docker部署 ...

  5. Clickhouse Docker集群部署

    写在前面 抽空来更新一下大数据的玩意儿了,起初架构选型的时候有考虑Hadoop那一套做数仓,但是Hadoop要求的服务器数量有点高,集群至少6台或以上,所以选择了Clickhouse(后面简称CH). ...

  6. Kubernetes&Docker集群部署

    集群环境搭建 搭建kubernetes的集群环境 环境规划 集群类型 kubernetes集群大体上分为两类:一主多从和多主多从. 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单 ...

  7. Nacos Docker集群部署

    参考文档:https://nacos.io/zh-cn/docs/quick-start-docker.html 1.从git上下载nacos-docker项目,本地目录为/docksoft/naco ...

  8. 使用Docker构建持续集成与自动部署的Docker集群

    为什么使用Docker " 从我个人使用的角度讲的话  部署来的更方便 只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 虚拟化让集群的管理和控制部署都更方便 hub.docke ...

  9. Docker集群管理工具 - Kubernetes 部署记录 (运维小结)

    一.  Kubernetes 介绍 Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernete ...

随机推荐

  1. postman—集成到jenkins

    前言 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 将postman导出的脚本,持续集成到 ...

  2. protocol buffers的编码原理

    protocol buffers使用二进制传输格式传递消息,因此相比于xml,json来说要轻便很多. 示例:假设定义了一个Message message Test1 { required int32 ...

  3. 使用gitlab, jenkins搭建CI(持续集成)系统(1) -- 准备环境

    1. 环境设计 搭建一个从开发到测试知道发布上线可以自动换完成的CI系统.这个系统中包含4个环境. 开发(dev)环境: 码农使用. 测试(test)环境: 测试人员使用. 预发布(prepublis ...

  4. composer如何自动验证并获取gitlab的私有库?

        近期购买了Laravel的nova以后,需要对它的核心代码做一些修改,为方便与团队其他成员分享,以及在nova官方库更新后方便对差异管理.便将nova库挂在自己的gitlab,通过compos ...

  5. eclipse/myEclipse 代码提示和快捷键

    一.设置自动提示 设置eclipse/myEclipse代码提示可以方便开发者,不用在记住拉杂的单词,只用打出首字母,就会出现提示代码菜单. 1.菜单window->Preferences-&g ...

  6. CentOS如何挂载U盘(待更新)

    使用Linux系统时,经常需要用到U盘,下面介绍以下如何再CentOS上挂载U盘. 首先,切换到root用户. 首先,切换到root用户. 首先,切换到root用户. 重要的事情说三遍,很多同学都说, ...

  7. Java springmvc 统一异常处理的方案

    前言:为什么要统一异常处理?经常在项目中需要统一处理异常,将异常封装转给前端.也有时需要在项目中统一处理异常后,记录异常日志,做一下统一处理. Springmvc 异常统一处理的方式有三种. 一.使用 ...

  8. Linux:curl

    curl命令用来做HTTP协议的客户端,可以通过命令参数生成各种请求,非常强大. 1. GET 默认情况下下curl执行的是GET操作,所以可以当做wget使用如 $ curl https://www ...

  9. 重构一段基于原生JavaScript的表格绘制代码

    为了在CardSimulate项目中方便的显示技能和效果列表,决定重构以前编写的一段JavaScript代码——att表格绘制库,这段代码的作用是将特定的JavaScript数据对象转化为表格,支持精 ...

  10. PHP生成缩略图(1)--简单缩略图

    原理:就是将大图缩小并另存为小图 以此图为例,使其生成缩略图! 首先要使用到以下函数 imagecopyresampled() 重采样拷贝部分图像并调整大小 bool imagecopyresampl ...