中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Docker中怎么讓多個container協調工作

發布時間:2021-07-28 18:55:29 來源:億速云 閱讀:168 作者:chen 欄目:云計算

本篇內容主要講解“Docker中怎么讓多個container協調工作”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Docker中怎么讓多個container協調工作”吧!

把container連接起來協同工作

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

Network port mapping refresher

網絡接口映射

在如何使用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綁定到宿主機上

Docker Container Linking

映射網絡端口不是吧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.

Container naming

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

  1. 好記 比如命名一個承載web服務的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 標記. 這樣container停止的時候就會自動被刪除。 (譯者: 如果你使用過一段時間docker, 用 docker ps -a 你可能會發現一大堆的已經停止了的container, 在很多的docker教程里, 在啟動container的時候都會帶上 --rm.)

Container Linking

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

這個命令會吧 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

這里我們可以看到我們創建的兩個分別叫 dbweb 的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 里的數據庫。 連接是安全的、私有的 僅限于 webdb 之間。

除了環境變量之外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協調工作”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

铜陵市| 泰宁县| 北宁市| 保德县| 三门峡市| 子长县| 普定县| 尼勒克县| 盐池县| 同江市| 萝北县| 商南县| 长沙市| 神农架林区| 灵山县| 青岛市| 天津市| 天门市| 嘉荫县| 夏津县| 万源市| 山东| 德清县| 彭州市| 阿瓦提县| 祁阳县| 仁寿县| 屏东市| 滦平县| 灵璧县| 仙桃市| 临泉县| 阿拉善左旗| 都江堰市| 萨迦县| 纳雍县| 云南省| 梧州市| 高唐县| 如皋市| 丰台区|