16-多机器通信

16-多机器通信

回顾上节课的思考题。

在这里插入图片描述

flask-redis 想访问 redis,该如何通信?

创建另外一台linux虚拟机

  1. 直接拷贝Vagrantfile文件创建一个 centos 虚拟机

    我们创建一个centos7-2文件夹,然后创建虚拟机

    vagrant up
    

    创建的过程中提示选择网络接口,如果你是wifi选择类似wlp5s0的选项,如果是网线选择类似eth0。具体选择哪个,可以通过ip a查看哪一个接口被分配了实际ip地址则选择哪一个。

  2. 进入虚拟机

    vagrant ssh
    

    查看ip

    ip a
    

    看到 eth1 的地址为 192.168.2.78

  3. 查看之前的虚拟机ip是多少

    在打开一个终端窗口

    vagrant up
    vagrant ssh
    ip a
    

    我们看到 eth1 的地址为 192.168.2.32

    这时这两个ip是可以相互访问的,这个ip地址是由路由器分配的。

  4. 在centos7-2安装docker

    教程参照 docker 安装 这一节。

如何让两台主机中的docker通信

我们讲一下可以通信的过程

  1. 图中的 flask-redis 把要访问 redis 容器的源ip和目标ip以及数据打包存放在http层,也就是在ip层之上。
  2. 发送这个包到另外一台 redis 的主机上
  3. 然后这台主机解包,会得到目标ip是redis容器的ip,这时就会把携带的数据发送到这个redis容器中,返回的时候一样。

这个过程不需要详细了解,我们把这种通信方式叫 隧道(tunnel) ,具体在 docker中这种隧道是使用 VXLAN 实现的。关于 VXLAN 我们不做详细介绍。

想了解关于VXLAN详细信息,可以查看这篇文章 What is VXLAN and how it works?
也可以查看这篇文章 Understanding VXLANs

我们只简单讲一下 VXLAN 的数据包组成。

在这里插入图片描述

从这个 VXLAN 数据包组成可以看到,它在 UDP 上层又增加了 EthernetIPv4TCP,这里其实就是我们docker与docker之间要访问的数据包。而 VXLAN 把它打包在一个数据包内了,一般在网路领域我们把 VXLAN 下面的所有层叫做 underlay。上面的所有层叫 overlay

之前我们讲了docker有 bridge host none 网络,其他docker还有另外一种网络叫 overlay,就是和 VXLANJ技术有关。

通过overlay 我们就可以让分布在两台linux主机上的容器可以通信。那么实现这种方式需要一个第三方的工具,这个工具和分布式存储有关。

关于分布式存储工具有很多,这里我们使用一个开源免费的 etcd。那接下来我们就通过 etcd 来实现分布在两台linux主机上的容器通信。

安装etcd并配置

  1. 下载etcd

    sudo yum install wget
    wget https://github.com/etcd-io/etcd/releases/download/v3.3.12/etcd-v3.3.12-linux-amd64.tar.gz
    

    下载地址查看。

    如果下载太慢,我们可以在主机中先下载好,然后通过scp发送到虚拟机中。

    scp etcd-v3.3.12-linux-amd64.tar.gz  vagrant@192.168.2.32:~
    

    第二太虚拟机同样把 etcd 安装包下载下来。

    如果不能scp 注意用户名是 vagrant,并且不需要加端口号,而且需要修改ssh配置,可以查看 0-安装Vagrant和使用 节。

  2. 解压运行

    第一台 虚拟机中执行

    解压

    tar zxvf etcd-v3.3.12-linux-amd64.tar.gz
    

    运行

    cd etcd-v3.3.12-linux-amd64
    nohup ./etcd --name docker-node1 --initial-advertise-peer-urls \
    http://192.168.2.32:2380 \
    --listen-peer-urls http://192.168.2.32:2380 \
    --listen-client-urls http://192.168.2.32:2379,http://127.0.0.1:2379 \
    --advertise-client-urls http://192.168.2.32:2379 \
    --initial-cluster-token etcd-cluster \
    --initial-cluster docker-node1=http://192.168.2.32:2380,docker-node2=http://192.168.2.78:2380 \
    --initial-cluster-state new &
    

    192.168.2.32 为第一台虚拟机的ip地址,192.168.2.78 为第二台虚拟机的ip地址。

    nohup 命令可以让命令在后台运行,并且关闭终端也不会终止进程,而 & 会。

    第二台 虚拟机中执行

    解压

    tar zxvf etcd-v3.3.12-linux-amd64.tar.gz
    

    运行

    cd etcd-v3.3.12-linux-amd64nohup ./etcd --name docker-node2 --initial-advertise-peer-urls \
    http://192.168.2.78:2380 \
    --listen-peer-urls http://192.168.2.78:2380 \
    --listen-client-urls http://192.168.2.78:2379,http://127.0.0.1:2379 \
    --advertise-client-urls http://192.168.2.78:2379 \
    --initial-cluster-token etcd-cluster \
    --initial-cluster docker-node1=http://192.168.2.32:2380,docker-node2=http://192.168.2.78:2380 \
    --initial-cluster-state new &
    
  3. 检查状态

    在第一台虚拟机中执行下面命令,注意必须在 etcd-v3.3.12-linux-amd64 文件夹下执行,否则找不到命令。

    [vagrant@10 etcd-v3.3.12-linux-amd64]$ ./etcdctl cluster-health
    member a639ee0bdcf9ca8c is healthy: got healthy result from http://192.168.2.78:2379
    member e8b07a1a0cffdc97 is healthy: got healthy result from http://192.168.2.32:2379
    cluster is healthy
    

    再到第二台虚拟机中执行一次

    [vagrant@10 etcd-v3.3.12-linux-amd64]$ ./etcdctl cluster-health
    member a639ee0bdcf9ca8c is healthy: got healthy result from http://192.168.2.78:2379
    member e8b07a1a0cffdc97 is healthy: got healthy result from http://192.168.2.32:2379
    cluster is healthy
    

    我们可以看到 etcd 运行正常,这时我们就搭建好了 分部署存储的 etcd 服务。

docker与etcd连接配置

  1. 停止运行docker

    sudo service docker stop
    

    查看docker是否已经停止

    [vagrant@10 etcd-v3.3.12-linux-amd64]$ docker version
    Client:Version:           18.09.1API version:       1.39Go version:        go1.10.6Git commit:        4c52b90Built:             Wed Jan  9 19:35:01 2019OS/Arch:           linux/amd64Experimental:      false
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    

    如果只有client说明docker已经停掉

  2. 启动docker的cluster

    第一台虚拟机中执行

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

    查看dockerd是否启动了

    docker version 
    
    Client:Version:           18.09.1API version:       1.39Go version:        go1.10.6Git commit:        4c52b90Built:             Wed Jan  9 19:35:01 2019OS/Arch:           linux/amd64Experimental:      falseServer: Docker Engine - CommunityEngine:Version:          18.09.1API version:      1.39 (minimum version 1.12)Go version:       go1.10.6Git commit:       4c52b90Built:            Wed Jan  9 19:06:30 2019OS/Arch:          linux/amd64Experimental:     false
    

    我们可以看到server已经启动,说明工作正常。

    第二台虚拟机中停止docker执行

    sudo service docker stop
    sudo dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock --cluster-store=etcd://192.168.2.78:2379 --cluster-advertise=192.168.2.78:2375 &
    

    注意参数修改为这台虚拟机的ip地址

    查看 docker 是否启动

    docker version 
    

    可以看到server已经起来了。

创建docker overlay

  1. 创建一个demo的overlay

    在第一台虚拟机中创建

    docker network create -d overlay demo
    

    -d 为选择driver

  2. 查看docker 网络

    查看第一台虚拟机

    $: docker network ls
    b048c448196c        demo                overlay             global
    

    查看第二台虚拟机

    $: docker network ls
    b048c448196c        demo                overlay             global
    

    这个demo的overlay已经成功创建了,这时连接到此网络上的容器就可以相互通信了。相互能够连接就是通过 etcd 实现的。

  3. 创建测试容器

    在第一台虚拟机中执行

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

    在第二台虚拟机中执行

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

    这时会报错,这是因为 test1 会被当做 key 存储在 etcd 中,创建的时候 etcd 会发现有两个相同的key,不允许创建。那么我们更改名字为 test2

    docker run -d --name test2 --net demo busybox /bin/sh -c "while true; do sleep 3600; done"
    
  4. 查看两个容器是否连接到 demo的overlay网络上

    docker network inspect demo
    
    "Containers": {"214e805562087e57aa643bd855237ea30282afee1c86e14f357838c553558fe8": {"Name": "test1","EndpointID": "79c482ff74e03eca583f2534555d4c2dd257087b4b266557e381932712b2c438","MacAddress": "02:42:0a:00:00:02","IPv4Address": "10.0.0.2/24","IPv6Address": ""},"ep-796a17e471b63ef8af64ff4d67a5dd63be731708e3c57f1cdbd072ea5acd0c76": {"Name": "test2","EndpointID": "796a17e471b63ef8af64ff4d67a5dd63be731708e3c57f1cdbd072ea5acd0c76","MacAddress": "02:42:0a:00:00:03","IPv4Address": "10.0.0.3/24","IPv6Address": ""}
    }
    

    我们可以看到 test1test2 已经连接到 demo 网络上了,根据之前的知识,我们可以了解到,test1test2 现在可以互相连接了。

  5. 测试容器互联

    进入 test1 容器,并ping test2

    docker exec -it test1 ping test2
    

    进入 test2 容器,并ping test1

    docker exec -it test1 ping test2
    

    是可以连接的。

到此我们就解决了分布在两台linux主机上的docker通信。解决的方式就是借助 分布式存储工具 etcd 和 docker 的overlay 网络。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

17-Docker的数据持久化介绍

17-Docker的数据持久化介绍 回顾容器与镜像 容器是在镜像之上创建的一层运行时层,这一层是可以读写的,我们能够在容器内添加数据,读取数据。 也就是说我们在创建容器的时候,我们能够在容器内创建文件,安装软件等等&a…

在Linux中对硬盘进行分区、格式化和挂载

在Linux中对硬盘进行分区、格式化和挂载 我最近有一个全新的4-TB硬盘加入我的电脑。所以我需要在Linux中安装它。为此,我需要执行以下操作: 分区格式化挂载检查是否已安装硬盘驱动器 分区 首先,在通过SATA和电源线将硬盘连接到计算机后&am…

Angular gitlab持续集成之runner配置

gitlab持续集成 安装Runner 正常安装 sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64sudo chmod x /usr/local/bin/gitlab-runner sudo useradd --comment GitLab Runner --creat…

vscode设置中文

vscode设置中文 当我们安装完成vscode后,会发现它是中文的,因为默认情况下,vscode使用的语言为英文(us)。 那很多同学是不喜欢英文的,不是看不懂,而是不方便哈。 修改语言配置文件 使用快捷键组合【CtrlShiftp】 在…

linux下编译boost

linux下编译boost 下载boot库 官方下载地址 下载完成会解压。 编译 1.进入解压后的文件夹内 cd boost_1_69_0 执行下面的语句 ./bootstrap.sh --with-librariesall --with-toolsetgcc–with-libraries 指定编译哪些boost库,all的话就是全部编译,只想…

conky安装配置

conky安装配置 安装conky sudo apt-get install conky-all修改配置 在主目录下创建’.conkyrc’ 文件内容: # set to yes if you want Conky to be forked in the background background no cpu_avg_samples 2 net_avg_samples 2 out_to_console no # X font w…

Windows子系统安装图形界面

Windows子系统安装图形界面 有很多同学需要使用 linux 系统,但是又不想真正安装一个 linux 系统。于是微软大哥就把 ubuntu 系统集成到 windows 内了,你说 微软 屌不屌? 言归正传。 安装Xlaunch 因为这个是最靠谱的图形化界面了,所以不解…

Linux下查看显卡PCIE速率x16x8x4及设定

Linux下查看显卡PCIE速率x16x8x4 由于linux软件并不是很齐全所以查看显卡占用PCIE的带宽并不直观,所以本文介绍如何查看。 Windows下使用GPU-Z即可查看 Linux 确定当前显卡型号 lspci | grep NVIDIA返回 02:00.0 3D controller: NVIDIA Corporation GM107M [GeFor…

Deepin安装最新显卡RTX2080Ti及CUDA10.1

Deepin安装最新显卡RTX2080Ti及CUDA10.1 废话不多说直接上教程。 本系统为Deepin 15.10.2,是基于debian 9发布的,不排除后续deepin升级为debian 10,就目前来看是和ubuntu 16.04一样,使用的是debian 9,所以下载安装包等…

Clonezilla再生龙备份与还原linux系统

文章目录Clonezilla再生龙备份与还原linux系统简介功能与要求一、制作再生龙启动盘1.下载镜像2.制作启动盘二、系统分区三、备份系统四、还原系统注意事项Clonezilla再生龙备份与还原linux系统 简介 再生龙(Clonezilla)是一个免费的灾难恢复、硬盘克隆…

网页滚动条上下滚动固定元素左右不固定之sticky

网页滚动条上下滚动固定元素左右不固定之sticky 有时候我们需要网页中某元素在上下滚动时可以固定在某一位置,但是左右不固定,也就是会随着左右滚动条滚动。那么我们可以通过 sticky 布局来解决。 position: sticky 我们先看看兼容性: 在使…

Timeshift系统备份与还原

Timeshift系统备份与还原 系统备份 一般Linux系统是比较稳定的,但是一旦崩溃就很难恢复,这里介绍 Timeshift系统备份工具。 安装Timeshift ubuntu 和 linux mint sudo apt-add-repository -y ppa:teejee2008/ppa sudo apt-get update sudo apt-get ins…

图片床

仅供存储图片

Angular实现dialog对话框封装

Angular实现dialog对话框封装 为什么要封装? 对于Angular Material UI库中的dialog组件,实在不是很好用,所以打算简单封装一下啊。 直接代码吧。 封装dialog组件 1.创建一个dialog组件 2.dialog.component.html文件 <ng-template #dialog><!-- 对话框投射内容…

Ubuntu LinuxMint安装微信QQ阿里旺旺

Ubuntu LinuxMint安装微信QQ阿里旺旺 目前linux大部分桌面发行版都可以安装windows版本的微信、QQ、阿里旺旺等软件了&#xff0c;这是deepin系统的功劳&#xff0c;这里还要感谢一下 前深度CEO 勇哥的不懈努力和坚持。 安装 这里推荐一个移植好的安装方法。 zq1997/deepin-w…

Angular消息通知组件ngx-notification

Angular消息通知组件ngx-notification It is a flexible and usable component. Demo Demo Installation 1.You need install @flywine93/ngx-notification by npm npm install @flywine93/ngx-notification --save2.You need install @flywine93/ngx-autounsubscrb npm …

01-go安装

01-go安装 本教程适用于linux发行版安装。 当前系统使用的是linux mint 19.ubuntu deepin 等同理。 下载安装包 下载地址 go downloads。 选择Linux包点击下载。 开始安装 1.设定安装目录 在下载好的压缩包文件夹内打开终端&#xff0c;并设置安装目录环境变量&#xff0c…

02-go的IDE安装

02-go的IDE安装 此篇文章是在go已经安装的前提下进行的&#xff0c;如果go还没有安装请参考这篇文章 01-go安装。 本文章使用的是vscode作为go IDE&#xff0c;所以需要提前安装好vscode&#xff0c;并且是在linux系统下。 当前系统为linux mint 19&#xff0c;ubuntu deepin…

go validator使用教程

go validator使用教程 很多时候在B/S开发过程中,经常会遇到对参数的校验工作,一般客户端需要提前验证一次提交的数据是否合理,以减少后端的压力,而后端是必须要对数据做验证的。 一般验证的方式大多都是if-else,这种方式会让你掉入无底的深渊,就像下面一样。 [图片来源…

golang代理转发基础

golang代理转发基础 go标准库已经实现了一个反向代理工具,通过代理将客户端的请求转发到代理服务器。 什么是反向代理? 维基百科解释: ”In computer networks , a reverse proxy is a type of proxy server that retrieves resources on behalf of a client from one or…