Docker 網(wǎng)絡(luò)-高級(jí)網(wǎng)絡(luò)夸主機(jī)容器之間的通信 Etcd 實(shí)戰(zhàn)篇

實(shí)驗(yàn)網(wǎng)絡(luò)示意圖
  • docker-node1docer-node2 是 Etcd 的成員炫彩,并且都安裝了 Docker
  • redis-clientredis 分別是宿主機(jī) docker-node1docer-node2 的容器實(shí)例
  • 每個(gè) Docker 宿主機(jī)上凳谦,都創(chuàng)建了名為 overlay_netoverlay network

宿主機(jī)操作系統(tǒng): CentOS Linux release 7.6.1810 (Core)
Docker CE:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)

下面就來一步一步的實(shí)現(xiàn)骂远。

1. 搭建Etcd Cluster

這里僅僅是為了演示Doker 夸主機(jī)通信目的而搭建及其簡單的 Etcd 集群刻恭,不可用于生產(chǎn)。

簡單介紹

這將調(diào)出etcd偵聽端口2379以進(jìn)行客戶端通信硼一,并在端口2380上進(jìn)行服務(wù)器到服務(wù)器通信累澡。

etcd是一個(gè)分布式可靠的鍵值存儲(chǔ),用于分布式系統(tǒng)的最關(guān)鍵數(shù)據(jù)般贼,重點(diǎn)是:

  • 簡單:面向用戶定義明確的API(gRPC)
  • 安全:具有可選客戶端證書身份驗(yàn)證的自動(dòng)TLS
  • 快速:基準(zhǔn)測試10,000次/秒
  • 可靠:使用Raft正確分布

etcd是用Go編寫的愧哟,使用Raft一致性算法來管理高度可用的復(fù)制日志。

Etcd 的監(jiān)聽端口

  • 2380 用于集群成員之間的通信
  • 2379 用于監(jiān)聽客戶端的請求

下載

官方提供了二進(jìn)制包 https://github.com/etcd-io/etcd/releases/
可以根據(jù)自己的系統(tǒng)進(jìn)行有選擇的下載哼蛆。

本測試環(huán)境下載的是適合 Linux 64位系統(tǒng)環(huán)境的包


image.png

Etcd 機(jī)器信息

主機(jī)名 IP
docker-node1 192.168.60.10
docker-node2 192.168.60.20

a. docker-node1 的操作

下載解壓

[vagrant@docker-node1 ~]$ wget https://github.com/etcd-io/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz
[vagrant@docker-node1 ~]$ tar -xf etcd-v3.3.10-linux-amd64.tar.gz
[vagrant@docker-node1 ~]$ cd etcd-v3.3.10-linux-amd64/
[vagrant@docker-node1 etcd-v3.3.10-linux-amd64]$

后臺(tái)啟動(dòng)運(yùn)行

[vagrant@docker-node2 etcd-v3.3.10-linux-amd64]$ export NODE1_IP=192.168.60.10
[vagrant@docker-node2 etcd-v3.3.10-linux-amd64]$ export NODE2_IP=192.168.60.20
[vagrant@docker-node2 etcd-v3.3.10-linux-amd64]$ export NODE1_NAME=docker-node1
[vagrant@docker-node2 etcd-v3.3.10-linux-amd64]$ export NODE2_NAME=docker-node2
[vagrant@docker-node1 etcd-v3.3.10-linux-amd64]$ nohup ./etcd \
 --name ${NODE1_NAME} \
  --initial-advertise-peer-urls http://${NODE1_IP}:2380 \
  --listen-peer-urls http://${NODE1_IP}:2380 \
  --listen-client-urls http://${NODE1_IP}:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://${NODE1_IP}:2379 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster ${NODE1_NAME}=http://${NODE1_IP}:2380,${NODE2_NAME}=http://${NODE2_IP}:2380 \
  --initial-cluster-state new &
  • –name 節(jié)點(diǎn)名稱
  • –initial-advertise-peer-urls 告知集群其他節(jié)點(diǎn)自己的URL蕊梧,tcp2380端口用于集群通信
  • –listen-peer-urls 監(jiān)聽URL,用于與其他節(jié)點(diǎn)通訊
  • –advertise-client-urls 告知客戶端的URL,tcp2379端口用于監(jiān)聽客戶端請求
  • –initial-cluster-token 集群的ID
  • --initial-cluster-token # 集群 token腮介,用于成員之間認(rèn)證
  • –initial-cluster 集群中所有節(jié)點(diǎn)
  • –initial-cluster-state 集群狀態(tài)肥矢,new為新創(chuàng)建集群,existing為已存在的集群

b. docker-node2 的操作

下載解壓

[vagrant@docker-node2 ~]$ wget https://github.com/etcd-io/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz
[vagrant@docker-node2 ~]$ tar -xf etcd-v3.3.10-linux-amd64.tar.gz
[vagrant@docker-node2 ~]$ cd etcd-v3.3.10-linux-amd64/

后臺(tái)啟動(dòng)運(yùn)行

[vagrant@docker-node2 etcd-v3.3.10-linux-amd64]$ export NODE1_IP=192.168.60.10
[vagrant@docker-node2 etcd-v3.3.10-linux-amd64]$ export NODE2_IP=192.168.60.20
[vagrant@docker-node2 etcd-v3.3.10-linux-amd64]$ export NODE1_NAME=docker-node1
[vagrant@docker-node2 etcd-v3.3.10-linux-amd64]$ export NODE2_NAME=docker-node2
[vagrant@docker-node2 etcd-v3.3.10-linux-amd64]$ nohup ./etcd \
--name ${NODE2_NAME} \
--initial-advertise-peer-urls http://${NODE2_IP}:2380 \
  --listen-peer-urls http://${NODE2_IP}:2380 \
  --listen-client-urls http://${NODE2_IP}:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://${NODE2_IP}:2379 \
  --initial-cluster-token etcd-cluster-1 \
  --initial-cluster ${NODE1_NAME}=http://${NODE1_IP}:2380,${NODE2_NAME}=http://${NODE2_IP}:2380 \
  --initial-cluster-state new &

集群健康檢查

分別在每個(gè)成員中執(zhí)行如下命令

[vagrant@docker-node2 etcd-v3.3.10-linux-amd64]$ ./etcdctl cluster-health
member d860400699ce61e is healthy: got healthy result from http://192.168.60.10:2379
member f96c6ec64b2090e3 is healthy: got healthy result from http://192.168.60.20:2379
cluster is healthy
[vagrant@docker-node2 etcd-v3.3.10-linux-amd64]$

返回 cluster is healthy 說明正常叠洗。

查看集群成員

在任意節(jié)點(diǎn)上運(yùn)行

[vagrant@docker-node2 etcd-v3.3.10-linux-amd64]$ ./etcdctl  member  list
d860400699ce61e: name=docker-node1 peerURLs=http://192.168.60.10:2380 clientURLs=http://192.168.60.10:2379 isLeader=true
f96c6ec64b2090e3: name=docker-node2 peerURLs=http://192.168.60.20:2380 clientURLs=http://192.168.60.20:2379 isLeader=false

集群正常后甘改,接下來就可以對 Docker 進(jìn)行配置了

關(guān)于 Etcd 的更多配置參考官方文檔

2. 配置 Docker 使用 Etcd

分別在兩臺(tái)宿主機(jī)上停止 dockerd 服務(wù)。
這里一 systemd 為例

sudo systemctl stop docker

docker-node1 上執(zhí)行

sudo dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://${NODE1_IP}:2379 --cluster-advertise=${NODE1_IP}:2375 &

docker-node2 上執(zhí)行

sudo dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://${NODE2_IP}:2379 --cluster-advertise=${NODE2_IP}:2375 &

在其中的一個(gè)節(jié)點(diǎn)上創(chuàng)建 overlay network

  1. 這里我在 docker-node1 上創(chuàng)建名字為: overlay_net 的覆蓋網(wǎng)絡(luò)
docker@docker-node1:~$ docker network create -d overlay  overlay_net
833aa03d003739bf1f5802f8c1ebe0ae617e02e46b09000c03b348b66e1e27c5
docker@docker-node1:~$ docker network inspect overlay_net
[
    {
        "Name": "overlay_net",
        "Id": "833aa03d003739bf1f5802f8c1ebe0ae617e02e46b09000c03b348b66e1e27c5",
        "Created": "2018-12-16T01:52:28.046320149Z",
        "Scope": "global",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
  1. 之后在 docker-node2 上查看網(wǎng)絡(luò)信息
docker@docker-node2:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
31e870259bb0        bridge              bridge              local
ee8cec8939af        host                host                local
8d6c3e3ceb94        none                null                local
833aa03d0037        overlay_net         overlay             global
docker@docker-node2:~$

可以看到在一個(gè)節(jié)點(diǎn)上創(chuàng)建的網(wǎng)絡(luò)信息灭抑,可以同步到集群中的所有節(jié)點(diǎn)上十艾。

運(yùn)行容器并將其連接到 overlay_net 網(wǎng)絡(luò)中

  1. docker-node1 運(yùn)行容器 redis-client
docker@docker-node1:~$ sudo docker run -itd --rm --name=redis-client --network=overlay_net  python:3.6-alpine
65bc05e3801242b2e917775d079a15272a926dab0e38b8039564f50547bef770
ERRO[0000] enabling default vlan on bridge br0 failed open /sys/class/net/br0/bridge/default_pvid: permission denied
ERRO[2018-12-16T01:59:00.903303768Z] reexec to set bridge default vlan failed exit status 1
INFO[0839] shim containerd-shim started                  address="/containerd-shim/moby/65bc05e3801242b2e917775d079a15272a926dab0e38b8039564f50547bef770/shim.sock" debug=false pid=4668

這里的錯(cuò)誤信息暫時(shí)沒解決

  1. docker-node2 運(yùn)行容器 redis
docker@docker-node2:~$ sudo docker run -itd --rm --name=redis --network=overlay_net redis:alpine
58b6cf076675f005d0a0d944fd85762bfe0a6e0bf8a63f94fac3e65d9f74e955
ERRO[0000] enabling default vlan on bridge br0 failed open /sys/class/net/br0/bridge/default_pvid: permission denied
ERRO[2018-12-16T01:59:56.673683047Z] reexec to set bridge default vlan failed exit status 1
INFO[0781] shim containerd-shim started                  address="/containerd-shim/moby/58b6cf076675f005d0a0d944fd85762bfe0a6e0bf8a63f94fac3e65d9f74e955/shim.sock" debug=false pid=4729
  1. docker-node2 進(jìn)入容器 redis 測試連通性
docker@docker-node2:~$ docker exec -it redis sh
/data # ping redis-client
PING redis-client (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.989 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.702 ms
^C
--- redis-client ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.702/0.845/0.989 ms
  1. docker-node1 進(jìn)入容器 redis-client 測試連通性
docker@docker-node1:~$ docker exec -it redis-client sh
/ # ping redis
PING redis (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.998 ms
64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.657 ms
^C
--- redis ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.657/0.827/0.998 ms
  1. 最后在容器 redis-client 中安裝 python3 用的 redis 模塊,并且進(jìn)行端口連通性測試
/ # pip3 install redis
Collecting redis
  Downloading https://files.pythonhosted.org/packages/f5/00/5253aff5e747faf10d8ceb35fb5569b848cde2fdc13685d42fcf63118bbc/redis-3.0.1-py2.py3-none-any.whl (61kB)
    100% |████████████████████████████████| 71kB 115kB/s
Installing collected packages: redis
Successfully installed redis-3.0.1
/ # python3
Python 3.6.7 (default, Nov 16 2018, 06:52:39)
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import redis
>>> r = redis.Redis(host="redis", port=6379)
>>> r.set("name", "shark")
True
>>> r.get("name")
b'shark'
>>> exit()
/ # exit
docker@docker-node1:~$
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腾节,一起剝皮案震驚了整個(gè)濱河市忘嫉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌禀倔,老刑警劉巖榄融,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異救湖,居然都是意外死亡愧杯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門鞋既,熙熙樓的掌柜王于貴愁眉苦臉地迎上來力九,“玉大人耍铜,你說我怎么就攤上這事〉埃” “怎么了棕兼?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抵乓。 經(jīng)常有香客問我伴挚,道長,這世上最難降的妖魔是什么灾炭? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任茎芋,我火速辦了婚禮,結(jié)果婚禮上蜈出,老公的妹妹穿的比我還像新娘田弥。我一直安慰自己,他們只是感情好铡原,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布偷厦。 她就那樣靜靜地躺著,像睡著了一般燕刻。 火紅的嫁衣襯著肌膚如雪只泼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天卵洗,我揣著相機(jī)與錄音辜妓,去河邊找鬼。 笑死忌怎,一個(gè)胖子當(dāng)著我的面吹牛籍滴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榴啸,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼孽惰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸥印?” 一聲冷哼從身側(cè)響起勋功,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎库说,沒想到半個(gè)月后狂鞋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潜的,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年骚揍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡信不,死狀恐怖嘲叔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抽活,我是刑警寧澤硫戈,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站下硕,受9級(jí)特大地震影響丁逝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梭姓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一果港、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糊昙,春花似錦、人聲如沸谢谦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽回挽。三九已至没咙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間千劈,已是汗流浹背祭刚。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留墙牌,地道東北人涡驮。 一個(gè)月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像喜滨,于是被迫代替她去往敵國和親捉捅。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容