?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
您正在查看傳統(tǒng)獨(dú)立群組的文檔。這些主題描述了獨(dú)立的 Docker Swarm。在 Docker 1.12 及更高版本中,Swarm 模式與 Docker Engine 集成。大多數(shù)用戶應(yīng)該使用集成的 Swarm 模式 - 一個(gè)好的開始就是 Swarm 模式入門, Swarm 模式 CLI 命令以及 Docker 演練入門。獨(dú)立 Docker Swarm 未集成到 Docker Engine API 和 CLI 命令中。
Docker Compose 和 Docker Swarm 旨在實(shí)現(xiàn)完全集成,這意味著您可以將一個(gè)Compose應(yīng)用程序指向一個(gè) Swarm 集群,并且只需像使用單個(gè) Docker 主機(jī)一樣工作即可。
實(shí)際的集成范圍取決于您使用的 Compose 文件格式的版本:
如果您使用的是版本1 links
,則您的應(yīng)用程序可以正常工作,但Swarm會(huì)將所有容器安排在一臺(tái)主機(jī)上,因?yàn)槿萜髦g的鏈接不適用于使用舊網(wǎng)絡(luò)系統(tǒng)的主機(jī)。
如果您使用的是第2版,則您的應(yīng)用程序應(yīng)該無(wú)任何更改:
- subject to the [limitations](index#limitations) described below,- as long as the Swarm cluster is configured to use the [overlay driver](../../engine/userguide/networking/index#an-overlay-network-with-docker-engine-swarm-mode), or a custom driver which supports multi-host networking.
閱讀多主機(jī)網(wǎng)絡(luò)入門以了解如何使用 Docker Machine 和覆蓋驅(qū)動(dòng)程序設(shè)置 Swarm 群集。運(yùn)行后,將應(yīng)用程序部署到該應(yīng)用程序應(yīng)該如此簡(jiǎn)單:
$ eval "$(docker-machine env --swarm <name of swarm master machine>)"$ docker-compose up
Swarm 可以像 Docker 實(shí)例一樣通過 Dockerfile 構(gòu)建鏡像,但生成的鏡像只能存在于單個(gè)節(jié)點(diǎn)上,不會(huì)分配給其他節(jié)點(diǎn)。
如果您想使用 Compose 將服務(wù)擴(kuò)展到多個(gè)節(jié)點(diǎn),則必須自己構(gòu)建它,將其推送到注冊(cè)表(例如 Docker Hub)并從docker-compose.yml
以下位置引用它:
$ docker build -t myusername/web .$ docker push myusername/web $ cat docker-compose.yml web: image: myusername/web $ docker-compose up -d $ docker-compose scale web=3
如果一個(gè)服務(wù)具有強(qiáng)制聯(lián)合調(diào)度類型的多個(gè)依賴關(guān)系(參見下面的自動(dòng)調(diào)度),那么 Swarm 可能會(huì)調(diào)度依賴關(guān)系到不同的節(jié)點(diǎn)上,從而無(wú)法安排依賴服務(wù)。例如,這里foo
需要被共同調(diào)度與bar
和baz
:
version: "2"services: foo: image: foo volumes_from: ["bar"] network_mode: "service:baz" bar: image: bar baz: image: baz
問題是,群可能會(huì)先安排bar
和baz
不同的節(jié)點(diǎn)上(因?yàn)樗麄兪遣灰蕾囉诒舜耍?,使它不可能挑選一個(gè)合適的節(jié)點(diǎn)foo
。
要解決此問題,請(qǐng)使用手動(dòng)調(diào)度來(lái)確保所有三個(gè)服務(wù)都在同一個(gè)節(jié)點(diǎn)上結(jié)束:
version: "2"services: foo: image: foo volumes_from: ["bar"] network_mode: "service:baz" environment: - "constraint:node==node-1" bar: image: bar environment: - "constraint:node==node-1" baz: image: baz environment: - "constraint:node==node-1"
如果服務(wù)從主機(jī)映射端口,例如80:8000
,那么docker-compose up
在第一次之后運(yùn)行它時(shí)可能會(huì)出現(xiàn)類似下面的錯(cuò)誤:
docker: Error response from daemon: unable to find a node that satisfies container==6ab2dfe36615ae786ef3fc35d641a260e3ea9663d6e69c5b70ce0ca6cb373c02.
這種錯(cuò)誤的常見原因是容器在沒有顯式映射的情況下具有一個(gè)卷(在其圖像或撰寫文件中定義),因此為了保留其數(shù)據(jù),Compose 已指示 Swarm 安排新容器與舊容器相同的節(jié)點(diǎn)。這導(dǎo)致了端口沖突。
解決這個(gè)問題有兩個(gè)可行的解決辦法:
指定一個(gè)已命名的卷,并使用一個(gè)卷驅(qū)動(dòng)程序,該卷驅(qū)動(dòng)程序能夠?qū)⒃摼頀燧d到容器中,而不管其預(yù)定在哪個(gè)節(jié)點(diǎn)上。如果服務(wù)僅使用命名卷,則Compose不會(huì)為Swarm提供任何特定的計(jì)劃指示。版本:“2”服務(wù):web:build:。端口: - “80:8000”卷: - web-logs:/ var / log / web卷:web-logs:driver:custom-volume-driver
在創(chuàng)建新容器之前刪除舊容器。您將失去該卷中的任何數(shù)據(jù)。
$ docker-compose stop web
$ docker-compose rm -f web
$ docker-compose up web
某些配置選項(xiàng)將導(dǎo)致容器在同一個(gè) Swarm 節(jié)點(diǎn)上自動(dòng)進(jìn)行調(diào)度,以確保它們正常工作。這些是:
network_mode: "service:..."
和network_mode: "container:..."
(以及net: "container:..."
第一版文件格式)。
volumes_from
links
Swarm 提供了豐富的時(shí)間安排和親和力提示,使您能夠控制容器的位置。它們通過容器環(huán)境變量指定,因此您可以使用Compose 的environment
選項(xiàng)來(lái)設(shè)置它們。
# Schedule containers on a specific node environment: - "constraint:node==node-1"# Schedule containers on a node that has the 'storage' label set to 'ssd'environment: - "constraint:storage==ssd"# Schedule containers where the 'redis' image is already pulled environment: - "affinity:image==redis"
有關(guān)完整的可用過濾器和表達(dá)式,請(qǐng)參閱 Swarm 文檔。