溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Docker中怎么讓多個container協(xié)調(diào)工作

發(fā)布時間:2021-07-28 18:55:29 來源:億速云 閱讀:167 作者:chen 欄目:云計(jì)算

本篇內(nèi)容主要講解“Docker中怎么讓多個container協(xié)調(diào)工作”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Docker中怎么讓多個container協(xié)調(diào)工作”吧!

把container連接起來協(xié)同工作

在如何使用docker的章節(jié)里我們通過網(wǎng)路連接到了一個跑在docker里的服務(wù). 這是一種和docker里的servie交互的方法。(譯者:docker的理念是一個service一個container, 所以link 是非常重要的) 在這章里我們會介紹一些吧docker的各個服務(wù)連接起來的進(jìn)階方法。

Network port mapping refresher

網(wǎng)絡(luò)接口映射

在如何使用docker的章節(jié)里, 我們創(chuàng)建了一個運(yùn)行Flask應(yīng)用的container.

$ sudo docker run -d -P training/webapp python app.py

每個container都有自己的網(wǎng)絡(luò)和IP地址. (回憶一下在如何使用docker的章節(jié)里 我們?nèi)绾问褂?docker inspect 來顯示container的IP地址) Docker 可以有各種網(wǎng)絡(luò)配置, 詳情參閱 Docker的網(wǎng)絡(luò).

當(dāng)我們創(chuàng)建一個container的時候使用 -P 的時候, docker內(nèi)部暴露的Port自動分配到 宿主機(jī)的一個隨機(jī)的,范圍在49000到49900的Port上去。在創(chuàng)建之后使用 docker ps 命令 我們可以看到container內(nèi)部的5000端口被綁到了宿主機(jī)的49155上。

$ sudo docker ps nostalgic_morse
CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse

我們還可以使用 -p (譯者: 注意大小寫)吧container內(nèi)部的IP綁定到一個你定義的宿主機(jī)的端口上去。

$ sudo docker run -d -p 5000:5000 training/webapp python app.py

這個方法不怎么好, 因?yàn)橐粋€宿主端口只能被一個container的端口綁定。 (譯者:似乎沒看到下面有啥比這個更好的, 似乎想說明的是port是屬于IP的, 加上IP就可以多搞幾個了?見下面一段)

還有一些其他的使用 -p 的方法。 默認(rèn)的情況下 -p 會把container的Port綁到宿主機(jī)上的所有ip的該端口號上。 (譯者:如果你的宿主機(jī)有多個IP, 每個IP的那個端口都會被綁到container的那個port上) 我們可以通過指定接口, 例如下面的例子, 端口就只綁定到了 localhost 上。

$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

這會吧container內(nèi)部的5000端口綁定到宿主機(jī)的 127.0.0.1 的5000端口上去.

如果只指定了網(wǎng)絡(luò)接口而沒有指定端口號, 則container的端口會綁到這個網(wǎng)絡(luò)接口上的一個隨機(jī)端口上.

$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py

我們還可以使用UDP

$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

使用 docker port 可以查看當(dāng)前的container的端口的綁定情況, 和特殊的端口的配置。 例如, 如果我們吧container的端口綁到了宿主機(jī)的 localhost, 我們輸入 docker port 的時候輸出會是:

$ docker port nostalgic_morse
127.0.0.1:49155

-p 可以被多次使用用來吧多個container里的port綁定到宿主機(jī)上

Docker Container Linking

映射網(wǎng)絡(luò)端口不是吧container彼此連接起來的唯一方法。Docker的linking系統(tǒng)允許你吧多個 container連接起來, 讓他們彼此交互信息。Docker的linking會創(chuàng)建一種父子級別的關(guān)系。 父container可以看到他的子container提供的信息。

Network port mappings are not the only way Docker containers can connect to one another. Docker also has a linking system that allows you to link multiple containers together and share connection information between them. Docker linking will create a parent child relationship where the parent container can see selected information about its child.

Container naming

Docker的linking系統(tǒng)依賴于container的名字。我們已經(jīng)注意到了每個container都會被自動的 分配一個名字, 在本教程里大家可能已經(jīng)熟悉了 nostalgic_morse 這個名字(譯者:docker 自動分配的名字都是確實(shí)存在的詞, 有些名字比較有意思 例如我的一個container就叫做tender einstein 溫柔的愛因斯坦, 對于大多數(shù)情況, 這些名字絕對是考驗(yàn)?zāi)阌⒄Z單詞量的機(jī)會, 比如 backstabbing nobel, stoic carson). 我們可以自己對container命名. 命名有兩個用處:

  1. 好記 比如命名一個承載web服務(wù)的container為web

  2. container 之間可以互相引用, 例如一個 web container 使用一個 db container

通過 --name 可以給container命名, 例如:

$ sudo docker run -d -P --name web training/webapp python app.py

你可以看到我們啟動了一個新的container, 啟動的時候使用了 --name 命名這個container為 web。 我們可以通過命令 docker ps 查看container的名字

$ sudo docker ps -l
CONTAINER ID  IMAGE                  COMMAND        CREATED       STATUS       PORTS                    NAMES
aed84ee21bde  training/webapp:latest python app.py  12 hours ago  Up 2 seconds 0.0.0.0:49154->5000/tcp  web

我們也可以用 docker inspect 查看container的名字.

$ sudo docker inspect -f "{{ .Name }}" aed84ee21bde
/web

(譯者: 上面那個乖乖的語法源于golang自帶的模板語言)

Container的名字必須是唯一的。也就是說你只能命名一個container為 web。 要重新使用一個container的名字的時候必須把之前叫這個名字的container刪除, 才能 再使用。刪除container可以使用 docker rm. 還有個便利的方法就是在啟動container的時候 使用 --rm 標(biāo)記. 這樣container停止的時候就會自動被刪除。 (譯者: 如果你使用過一段時間docker, 用 docker ps -a 你可能會發(fā)現(xiàn)一大堆的已經(jīng)停止了的container, 在很多的docker教程里, 在啟動container的時候都會帶上 --rm.)

Container Linking

Links運(yùn)行container之間發(fā)現(xiàn)彼此并且彼此間安全的通訊。使用 --link可以創(chuàng)建一個link. 讓我們創(chuàng)建一個運(yùn)行數(shù)據(jù)庫的container。

$ sudo docker run -d --name db training/postgres

這里我們基于 training/postgres image創(chuàng)建了一個叫做 db 的container, 上面提供PostgreSQL 數(shù)據(jù)庫服務(wù).

現(xiàn)在讓我們創(chuàng)建一個叫做 web的container, 并且把他和 db container連接到一起。

$ sudo docker run -d -P --name web --link db:db training/webapp python app.py

這個命令會吧 dbweb 連接到一起 --link 的用法:

--link name:alias

這里 name 是我們要連接的container的名字, alias 是一link的別名. 下面我們會看到如何使用這個 別名.

下面讓我們用 docker ps 看看被連接到一起的container們。

$ docker ps
CONTAINER ID  IMAGE                     COMMAND               CREATED             STATUS             PORTS                    NAMES
349169744e49  training/postgres:latest  su postgres -c '/usr  About a minute ago  Up About a minute  5432/tcp                 db
aed84ee21bde  training/webapp:latest    python app.py         16 hours ago        Up 2 minutes       0.0.0.0:49154->5000/tcp  db/web,web

這里我們可以看到我們創(chuàng)建的兩個分別叫 dbweb 的container, 注意 web container 在name列里還顯示了另外一個名字 db/web。 這個名字告訴我們 web container 被連接到了 db container, 并且建立了一種父子關(guān)系。

linking到底有什么用呢?我們已經(jīng)看到了link在兩個container間創(chuàng)建了一個 父子 關(guān)系. 父container 這個例子里的 db 可以得到他的子container web上的信息. Docker是通過在 兩個container建立了一個安全通道來實(shí)現(xiàn)的, 這樣container就不用對外暴露端口了. 你可能已經(jīng)注意到了 我們在啟動 db container的時候沒有使用 -p 或者 -P。 因?yàn)槲覀円呀?jīng)吧兩個container通過 link連接起來了, 所以沒必要通過端口暴露數(shù)據(jù)庫的服務(wù)了.

Docker通過下述兩種方法吧子container里的信息暴露給父container:

  • 環(huán)境變量

  • 更新 /etc/host 文件

我們先看下docker設(shè)定的環(huán)境變量。 在 web containre里, 讓我們運(yùn)行 env 命令 列出所有的環(huán)境變量。

root@aed84ee21bde:/opt/webapp# env
HOSTNAME=aed84ee21bde
. . .
DB_NAME=/web/db
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5000_TCP=tcp://172.17.0.5:5432
DB_PORT_5000_TCP_PROTO=tcp
DB_PORT_5000_TCP_PORT=5432
DB_PORT_5000_TCP_ADDR=172.17.0.5
. . .

: 這些環(huán)境變量只是為第一個在container里的進(jìn)程設(shè)置的。 類似的守護(hù)進(jìn)程(例如 sshd) 會在新建子shell的時候抹除這些變量。

我們可以看到Docker創(chuàng)建了一些列的對于我們使用db很有用的環(huán)境變量。 每一個變量都以 DB 開頭, 這個 DB 就是上面的那個別名。(譯者: 為啥用別名這里就清楚了, image 不用知道其他container的名字, 只用在run的時候把名字映射為自己了解的就可以了) 如果我們起的別名是 db1 那么環(huán)境變量的名字的前綴就是 DB1_. 你可以使用這些環(huán)境 變量來配置你的應(yīng)用程序來連接 db container 里的數(shù)據(jù)庫。 連接是安全的、私有的 僅限于 webdb 之間。

除了環(huán)境變量之外Docker會把父container的IP添加到子container的/etc/hosts里。我們 看下一下 web container里的hosts文件:

root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7  aed84ee21bde
. . .
172.17.0.5  db

我們可以看到, 有兩個相關(guān)的host配置項(xiàng)。 第一個是給 web container 的, 名字 就是container的ID。 第二條吧父container的別名和父container的IP綁到了一起。我們 試著通過host的名字ping一下.

root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
root@aed84ee21bde:/opt/webapp# ping db
PING db (172.17.0.5): 48 data bytes
56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms
56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms

上面第一個命令是用來安裝ping的, 因?yàn)槲覀兪褂玫腸ontainer里沒有安裝。

我們可以使用這個host吧web服務(wù)和數(shù)據(jù)庫服務(wù)連接到一起。

一個父container可以連接多個子container。 例如, 我們可以把多個web服務(wù)的container連接 到一個數(shù)據(jù)庫container上

下一步

我們已經(jīng)知道了在Docker里如何把多個container聯(lián)起來協(xié)同工作,下面我們會講解一下如何 在docker中管理數(shù)據(jù)、volumne。

跳轉(zhuǎn)到 如何管理container的數(shù)據(jù).

到此,相信大家對“Docker中怎么讓多個container協(xié)調(diào)工作”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI