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.pswp.cn/news/536030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536030.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536030.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

17-Docker的數據持久化介紹

17-Docker的數據持久化介紹 回顧容器與鏡像 容器是在鏡像之上創建的一層運行時層,這一層是可以讀寫的,我們能夠在容器內添加數據,讀取數據。 也就是說我們在創建容器的時候,我們能夠在容器內創建文件,安裝軟件等等&a…

18-數據持久化-Data Volume

18-數據持久化-Data Volume Data Volume 使用場景。一般來講有些容器自己會產生一些數據,我們不想數據隨著容器的銷毀而銷毀,我們想保存數據,正常一般用在數據庫,比如我們想保存數據庫中的數據,這個時候我們就會使用 …

19-數據持久化-Bind Mounting

19-數據持久化-Bind Mounting Bind Mounting 與 Data Volume區別 Data Volume 需要在 Dockerfile 內聲明需要創建的 volume 目錄。 Bind Mounting 則不需要在 Dockerfile 聲明 volume,只需要在創建容器的時候,也就是 run 的時候聲明即可。 如: dock…

go自定義包教程

go自定義包教程 而是環境為 go version go1.11 linux/amd64linux mint 19 創建一個自定義的包 切換到src目錄下,創建demo目錄 cd src mkdir demo再創建smap 文件夾 cd demo mkdir smap創建包文件 cd smap touch map.gomap.go文件內容 package smapimport "…

在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…

javascript編譯壓縮

javascript編譯 js是JavaScript 源碼文件, .min.js是壓縮版的js文件。 .min.js文件經過壓縮,相對編譯前的js文件體積較小,傳輸效率快。經過編碼將變量和函數原命名改為毫無意義的命名,以防止他人窺視和竊取 js 源代碼 在線版 g…

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的話就是全部編譯,只想…

C++通過原子變量代替互斥量

C通過原子變量代替互斥量 廢話不多說&#xff0c;直接上代碼。 實現類似lock_guard功能 #include <atomic> #include <thread>class ClockGuard { public:ClockGuard(std::atomic_flag & atomic):m_lockedFlag(atomic){lock();}~ClockGuard(){unlock();}voi…

conky安裝配置

conky安裝配置 安裝conky sudo apt-get install conky-all修改配置 在主目錄下創建’.conkyrc’ 文件內容&#xff1a; # 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 內了&#xff0c;你說 微軟 屌不屌&#xff1f; 言歸正傳。 安裝Xlaunch 因為這個是最靠譜的圖形化界面了&#xff0c;所以不解…

C++ 判斷類是否有某變量

C 判斷類是否有某變量 話不多說上代碼。 #define HAS_MEMBER(member)\template<typename T, typename... Args>struct has_member_##member\ {\private:\template<typename U> static auto Check(int) -> decltype(std::declval<U>().member(std::declv…

C++將地址轉換為字符串

C將地址轉換為字符串 有時候在做程序設計的時候&#xff0c;有可能需要做一個類似messageBus的功能&#xff0c;并且需要一個key保證唯一&#xff0c;那么如何實現這個key的唯一呢&#xff1f;大致兩種思路: 使用函數簽名&#xff0c;因為messagebus綁定的是一個函數&#xf…

Angular 8之升級和新功能摘要

Angular 8之升級和新功能摘要 Angular 8已經到來,并帶來了大量的工作流程和性能改進。就像我們之前發布的幾個版本一樣,讓我們回顧一下Angular 8的新功能,以及如何將Angular 7應用程序升級到Angular 8。 Angular 8中明顯的新功能數量有限,但確實還有一些好東西: Differen…

Linux下查看顯卡PCIE速率x16x8x4及設定

Linux下查看顯卡PCIE速率x16x8x4 由于linux軟件并不是很齊全所以查看顯卡占用PCIE的帶寬并不直觀&#xff0c;所以本文介紹如何查看。 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&#xff0c;是基于debian 9發布的&#xff0c;不排除后續deepin升級為debian 10&#xff0c;就目前來看是和ubuntu 16.04一樣&#xff0c;使用的是debian 9&#xff0c;所以下載安裝包等…

Anaconda安裝Tensorflow環境

Anaconda安裝Tensorflow環境 Anaconda安裝 下載安裝包&#xff0c;請到這個地址下載 安裝 打開終端執行&#xff1a; bash Anaconda3-5.3.1-Linux-x86_64.sh安裝過程全部yes即可。 然后重新啟動。 驗證是否安裝成功 conda --version如果沒有報錯&#xff0c;并且輸出下面內容…

Windows下Qt Creator設置IDE菜單字體樣式

Windows下Qt Creator設置IDE菜單字體樣式 本文為解決以下問題&#xff1a; IDE的菜單字體太小IDE的菜單字體樣式&#xff0c;可以更換為微軟雅黑 創建樣式文件 在Qt Creator目錄下C:\Qt\Qt5.12.2創建 custom-style.css 文件&#xff0c;內容如下&#xff1a; QWidget { fo…

Clonezilla再生龍備份與還原linux系統

文章目錄Clonezilla再生龍備份與還原linux系統簡介功能與要求一、制作再生龍啟動盤1.下載鏡像2.制作啟動盤二、系統分區三、備份系統四、還原系統注意事項Clonezilla再生龍備份與還原linux系統 簡介 再生龍&#xff08;Clonezilla&#xff09;是一個免費的災難恢復、硬盤克隆…