1. 本章实验

2. 环境搭建

  1.编写 Vagrantfile 并创建虚拟机 并虚拟机node1绑定外部 192.168.205.10:8888 node2绑定外部 192.168.205.10:9999

    # -*- mode: ruby -*-

    # vi: set ft=ruby :

    Vagrant.require_version ">= 1.6.0"

    boxes = [

      {

    :name => "docker-node1",

    :eth1 => "192.168.205.10",

    :mem => "1024",

    :cpu => "1",

    :port => "8888"

     },

      {

    :name => "docker-node2",

    :eth1 => "192.168.205.11",

    :mem => "1024",

    :cpu => "1",

    :port => "9999"

    }

    ]

    Vagrant.configure(2) do |config|

    config.vm.box = "centos/7"

    boxes.each do |opts|

    config.vm.define opts[:name] do |config|

    config.vm.hostname = opts[:name]

    config.vm.network "forwarded_port", guest: 80, host: opts[:port]

    config.vm.provider "vmware_fusion" do |v|

    v.vmx["memsize"] = opts[:mem]

    v.vmx["numvcpus"] = opts[:cpu]

  end

    config.vm.provider "virtualbox" do |v|

    v.customize ["modifyvm", :id, "--memory", opts[:mem]]

    v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]

    end

      config.vm.network :private_network, ip: opts[:eth1]

    end

    end

    config.vm.synced_folder "./labs", "/home/vagrant/labs"

    config.vm.provision "shell", privileged: true, path: "./setup.sh"

    end

  2.创建labs 文件夹 及编写 setup.sh 文件

    mkdir labs

    vim setup.sh

    #setup.sh

    #/bin/sh

    # install some tools

    sudo yum install -y wget

    sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak

    sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

    sudo yum makecache

    sudo yum -y update

    sudo yum install -y git vim gcc glibc-static telnet bridge-utils

    # install docker

    curl -fsSL get.docker.com -o get-docker.sh

    sh get-docker.sh

    # start docker service

    sudo groupadd docker

    sudo usermod -aG docker vagrant

    sudo systemctl start docker

    rm -rf get-docker.sh

    sudo tee /etc/docker/daemon.json <<-'EOF'

    {

      "registry-mirrors": ["https://v2ltjwbg.mirror.aliyuncs.com"]

    }

    EOF

    sudo systemctl daemon-reload

    sudo systemctl restart docker

    docker version

3. 实现多级通讯 是 通过 VXLAN 实现的  (原理)

  承载基础网络传输的 叫做 underlay

  承载网络信息或叙述的 叫做 overlay

4.安装分布式存储  (防止 ip 被占用)etcd

  在docker-node1上

    1.获取 etcd

      wget https://github.com/coreos/etcd/releases/download/v3.0.12/etcd-v3.0.12-linux-amd64.tar.gz

    2.解压 etcd 并 进入 etcd 文件夹

      tar zxvf etcd-v3.0.12-linux-amd64.tar.gz && cd etcd-v3.0.12-linux-amd64

    3. 运行监听网络命令

    nohup ./etcd --name docker-node1 --initial-advertise-peer-urls http://192.168.205.10:2380  --listen-peer-urls http://192.168.205.10:2380  --listen-client-urls http://192.168.205.10:2379,http://127.0.0.1:2379  --advertise-client-urls http://192.168.205.10:2379  --initial-cluster-token etcd-cluster --initial-cluster docker-node1=http://192.168.205.10:2380,docker-node2=http://192.168.205.11:2380  --initial-cluster-state new&

  在docker-node2上

    1.获取 etcd

      wget https://github.com/coreos/etcd/releases/download/v3.0.12/etcd-v3.0.12-linux-amd64.tar.gz

    2.解压 etcd 并 进入 etcd 文件夹

       tar zxvf etcd-v3.0.12-linux-amd64.tar.gz && cd etcd-v3.0.12-linux-amd64

    3. 运行监听网络命令

      nohup ./etcd --name docker-node2 --initial-advertise-peer-urls http://192.168.205.11:2380  --listen-peer-urls http://192.168.205.11:2380  --listen-client-urls http://192.168.205.11:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.205.11:2379  --initial-cluster-token etcd-cluster  --initial-cluster docker-node1=http://192.168.205.10:2380,docker-node2=http://192.168.205.11:2380  --initial-cluster-state new&

  

  在docker-node1 和 docker-node2 上 分别查看etcd的状态 在etcd的文件夹内 并停止 etcd

      ./etcdctl cluster-health

  

      sudo service docker stop

  在docker-node1 上

    sudo /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.205.10:2379 --cluster-advertise=192.168.205.10:2375&

  在docker-node2上

    sudo /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.205.11:2379 --cluster-advertise=192.168.205.11:2375&

  为防止 在屏幕上直接打印 log 信息

  先退出 再登陆 到虚拟机

5.创建overlay network

  在docker-node1上创建一个demo的overlay network

  查看原有网络

    sudo docker network ls

  

  创建 overlay 网络

    sudo docker network create -d overlay demo

 

  查看网络详情

    sudo docker network inspect demo

    

  在node2上,这个demo的overlay network会被同步创建

    sudo docker network ls

    

  通过查看etcd的key-value, 我们获取到,这个demo的network是通过etcd从node1同步到node2的

  在docker-node2 上运行

  ./etcdctl ls

  ./etcdctl ls /docker

  ./etcdctl ls /docker/nodes

  ./etcdctl ls /docker/network

  

  ./etcdctl ls /docker/network/v1.0

  

  ./etcdctl ls /docker/network/v1.0/network

  

  可以看出 与上面创建的 overlay 网络是一致的

  

6.在overlay 网络上创建container

  在 docker-node1 上 创建容器

    sudo docker run -d --name test1 --net demo busybox sh -c "while true; do sleep 3600; done"

  查看容器

    sudo docker ps

    

    查看 test1 ip 地址

    docker exec test1 ip a

    

  在docker-node2上创建容器

  如果想再docker-node2 上创建 test1 容器 是不行的 会报错

  

    创建 test2

    sudo docker run -d --name test2 --net demo busybox sh -c "while true; do sleep 3600; done"

  

    查看test2 ip 地址

  

  查看 overlay 网络下的 容器情况

    docker network inspect demo

  

    可以看出两个容器的 ip 地址为 10.0.0.2 和 10.0.0.3

  用 test1 ping test2  或者 用 test2 ping test1  发现是可以ping通的

    在docker-node 1 下运行

      docker exec test1 ping 10.0.0.3  或者  docker exec test1 ping test2

    在docker-node 2 下运行

      docker exec test2 ping 10.0.0.2  或者  docker exec test2 ping test1

6. 为啥 docker exec test ip a  会有三个网络

  

  lo 是 管道

  if8 的 10.0.0.1 是 overlay 的网络

  if11 是 container 连接 docker 的 网络

  如下图

  










19 docker 多机器通信的更多相关文章

  1. 烂泥:openvpn tun模式下客户端与内网机器通信

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 前两篇文章我们介绍了有关openvpn的搭建与配置文件的讲解,这篇文章我们再聊介绍下,在tun模式下openvpn客户端如何与内网机器通信的问题. 一.实 ...

  2. 烂泥:openvpn双网卡客户端与内网机器通信

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 前段时间写了一篇有关openvpn搭建与内网机器通信的文章,那篇文章是基于服务器单网卡 ...

  3. 如何使不同主机上的docker容器互相通信

    docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这 ...

  4. 不同主机的docker容器互相通信

    Docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.0.1/16,一个16位的子网掩码给容器提供了 65534个IP地址. docker0只是一个在绑定到 ...

  5. Docker跨服务器通信Overlay解决方案(下) Consul集群

    承接上文 本文基于上篇文章,详细的场景说明与分析在前篇随笔中业已记录,有兴趣可以移步 Docker跨服务器通信Overlay解决方案(上) Consul单实例 本文主旨 本文为Docker使用Cons ...

  6. docker 不同机器上容器互相通信

    环境说明: 1.系统:centos7 2.docker:Docker version 1.3.2 3.docker启动参数:OPTIONS=--selinux-enabled=false -H fd: ...

  7. Docker跨主机通信之路由

    一.实验环境: 主机名 主机IP Docker0_IP Docker1 192.168.88.130 172.17.0.1 Docker2 192.168.88.131 172.18.0.1 二.实验 ...

  8. Docker 容器的通信(十二)

    目录 一.容器间通信 1.IP 通信 2.Docker DNS Server 3.joined 容器 二.容器访问外部网络 三.外部网络访问容器 1.随机端口 2.指定端口 3.不指定任何端口. 4. ...

  9. Docker跨主机通信(九)--技术流ken

    容器网络 在前面的博客中已经详细讲解了几种网络方案: none, host, bridge,user-defined.但是他们只是解决了单个主机间的容器的通信问题,并不能实现多个主机容器之间的通信.本 ...

随机推荐

  1. CSS - 解决placeholder不起作用的方法

    input::placeholder {     font-size: 12px;     letter-spacing: 1px;     color: #A8C9FF !important; } ...

  2. Python练习题3

    1.九九乘法表 li = [1,2,3,4,5,6,7,8,9] for i in li: for j in li: if i >= j: print(i,'*',j,'=',i*j,end=& ...

  3. nginx location语法解释

    1.没有修饰符 表示:必须以指定模式开始,如:              默认模式 server { server_name baidu.com; location /abc { …… } } htt ...

  4. tensorflow学习笔记--dataset使用,创建自己的数据集

    数据读入需求 我们在训练模型参数时想要从训练数据集中一次取出一小批数据(比如50条.100条)做梯度下降,不断地分批取出数据直到损失函数基本不再减小并且在训练集上的正确率足够高,取出的n条数据还要是预 ...

  5. 七十三、SAP中清空内表的三种方式

    一.上代码 二.需要注意的是 * CLEAR 只能清空不带WITH HEADER LINE的内表* REFRESH 能清空内表,但是不回收内存* FREE 能清空内表并回收内存,但是此内表还能继续使用

  6. C++的随机数

    C++产生随机数 C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand(). 不过,由于rand()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是 ...

  7. 面向对象-static关键字实战案例

    面向对象-static关键字实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.static关键字概述 1>.static的功能 static关键字用于修饰成员变量和 ...

  8. P 1024 科学计数法

    转跳点:

  9. c++ opencv 数学函数示例

    // ConsoleApplication11.cpp : Defines the entry point for the console application. // #include " ...

  10. EUI库 - 10 - 使用自定义组件

      步骤 1 在根节点,添加一个自定义的命名空间  2 可以设置skinName 自定义组件规范 1 不复用的不要用自定义组件 2 属性必须要有默认值(赋值为null也可以),因为TS编译器会把没有默 ...