您好,登錄后才能下訂單哦!
本篇內容主要講解“Docker中怎么讓多個container協調工作”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Docker中怎么讓多個container協調工作”吧!
在如何使用docker的章節里我們通過網路連接到了一個跑在docker里的服務. 這是一種和docker里的servie交互的方法。(譯者:docker的理念是一個service一個container, 所以link 是非常重要的) 在這章里我們會介紹一些吧docker的各個服務連接起來的進階方法。
網絡接口映射
在如何使用docker的章節里, 我們創建了一個運行Flask應用的container.
$ sudo docker run -d -P training/webapp python app.py
注 每個container都有自己的網絡和IP地址. (回憶一下在如何使用docker的章節里 我們如何使用
docker inspect
來顯示container的IP地址) Docker 可以有各種網絡配置, 詳情參閱 Docker的網絡.
當我們創建一個container的時候使用 -P
的時候, docker內部暴露的Port自動分配到 宿主機的一個隨機的,范圍在49000到49900的Port上去。在創建之后使用 docker ps
命令 我們可以看到container內部的5000端口被綁到了宿主機的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內部的IP綁定到一個你定義的宿主機的端口上去。
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
這個方法不怎么好, 因為一個宿主端口只能被一個container的端口綁定。 (譯者:似乎沒看到下面有啥比這個更好的, 似乎想說明的是port是屬于IP的, 加上IP就可以多搞幾個了?見下面一段)
還有一些其他的使用 -p
的方法。 默認的情況下 -p
會把container的Port綁到宿主機上的所有ip的該端口號上。 (譯者:如果你的宿主機有多個IP, 每個IP的那個端口都會被綁到container的那個port上) 我們可以通過指定接口, 例如下面的例子, 端口就只綁定到了 localhost
上。
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
這會吧container內部的5000端口綁定到宿主機的 127.0.0.1
的5000端口上去.
如果只指定了網絡接口而沒有指定端口號, 則container的端口會綁到這個網絡接口上的一個隨機端口上.
$ 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
可以查看當前的container的端口的綁定情況, 和特殊的端口的配置。 例如, 如果我們吧container的端口綁到了宿主機的 localhost
, 我們輸入 docker port
的時候輸出會是:
$ docker port nostalgic_morse 127.0.0.1:49155
注
-p
可以被多次使用用來吧多個container里的port綁定到宿主機上
映射網絡端口不是吧container彼此連接起來的唯一方法。Docker的linking系統允許你吧多個 container連接起來, 讓他們彼此交互信息。Docker的linking會創建一種父子級別的關系。 父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.
Docker的linking系統依賴于container的名字。我們已經注意到了每個container都會被自動的 分配一個名字, 在本教程里大家可能已經熟悉了 nostalgic_morse
這個名字(譯者:docker 自動分配的名字都是確實存在的詞, 有些名字比較有意思 例如我的一個container就叫做tender einstein 溫柔的愛因斯坦, 對于大多數情況, 這些名字絕對是考驗你英語單詞量的機會, 比如 backstabbing nobel, stoic carson). 我們可以自己對container命名. 命名有兩個用處:
好記 比如命名一個承載web服務的container為web
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
標記. 這樣container停止的時候就會自動被刪除。 (譯者: 如果你使用過一段時間docker, 用docker ps -a
你可能會發現一大堆的已經停止了的container, 在很多的docker教程里, 在啟動container的時候都會帶上--rm
.)
Links運行container之間發現彼此并且彼此間安全的通訊。使用 --link
可以創建一個link. 讓我們創建一個運行數據庫的container。
$ sudo docker run -d --name db training/postgres
這里我們基于 training/postgres
image創建了一個叫做 db
的container, 上面提供PostgreSQL 數據庫服務.
現在讓我們創建一個叫做 web
的container, 并且把他和 db
container連接到一起。
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
這個命令會吧 db
和 web
連接到一起 --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
這里我們可以看到我們創建的兩個分別叫 db
和 web
的container, 注意 web
container 在name列里還顯示了另外一個名字 db/web
。 這個名字告訴我們 web
container 被連接到了 db
container, 并且建立了一種父子關系。
linking到底有什么用呢?我們已經看到了link在兩個container間創建了一個 父子 關系. 父container 這個例子里的 db
可以得到他的子container web
上的信息. Docker是通過在 兩個container建立了一個安全通道來實現的, 這樣container就不用對外暴露端口了. 你可能已經注意到了 我們在啟動 db
container的時候沒有使用 -p
或者 -P
。 因為我們已經吧兩個container通過 link連接起來了, 所以沒必要通過端口暴露數據庫的服務了.
Docker通過下述兩種方法吧子container里的信息暴露給父container:
環境變量
更新 /etc/host
文件
我們先看下docker設定的環境變量。 在 web
containre里, 讓我們運行 env
命令 列出所有的環境變量。
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 . . .
注: 這些環境變量只是為第一個在container里的進程設置的。 類似的守護進程(例如
sshd
) 會在新建子shell的時候抹除這些變量。
我們可以看到Docker創建了一些列的對于我們使用db很有用的環境變量。 每一個變量都以 DB
開頭, 這個 DB
就是上面的那個別名。(譯者: 為啥用別名這里就清楚了, image 不用知道其他container的名字, 只用在run的時候把名字映射為自己了解的就可以了) 如果我們起的別名是 db1
那么環境變量的名字的前綴就是 DB1_
. 你可以使用這些環境 變量來配置你的應用程序來連接 db
container 里的數據庫。 連接是安全的、私有的 僅限于 web
和 db
之間。
除了環境變量之外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
我們可以看到, 有兩個相關的host配置項。 第一個是給 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的, 因為我們使用的container里沒有安裝。
我們可以使用這個host吧web服務和數據庫服務連接到一起。
注
一個父container可以連接多個子container。 例如, 我們可以把多個web服務的container連接 到一個數據庫container上
我們已經知道了在Docker里如何把多個container聯起來協同工作,下面我們會講解一下如何 在docker中管理數據、volumne。
跳轉到 如何管理container的數據.
到此,相信大家對“Docker中怎么讓多個container協調工作”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。