?
This document uses PHP Chinese website manual Release
您正在查看傳統(tǒng)獨立群組的文檔。這些主題描述了獨立的 Docker Swarm。在 Docker 1.12 及更高版本中,Swarm 模式與 Docker Engine 集成。大多數(shù)用戶應該使用集成的 Swarm 模式 - 一個好的開始就是 Swarm 模式入門, Swarm 模式 CLI 命令以及 Docker 演練入門。獨立 Docker Swarm 未集成到 Docker Engine API 和 CLI 命令中。
Docker Compose 和 Docker Swarm 旨在實現(xiàn)完全集成,這意味著您可以將一個Compose應用程序指向一個 Swarm 集群,并且只需像使用單個 Docker 主機一樣工作即可。
實際的集成范圍取決于您使用的 Compose 文件格式的版本:
如果您使用的是版本1 links
,則您的應用程序可以正常工作,但Swarm會將所有容器安排在一臺主機上,因為容器之間的鏈接不適用于使用舊網(wǎng)絡系統(tǒng)的主機。
如果您使用的是第2版,則您的應用程序應該無任何更改:
- 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.
閱讀多主機網(wǎng)絡入門以了解如何使用 Docker Machine 和覆蓋驅(qū)動程序設置 Swarm 群集。運行后,將應用程序部署到該應用程序應該如此簡單:
$ eval "$(docker-machine env --swarm <name of swarm master machine>)"$ docker-compose up
Swarm 可以像 Docker 實例一樣通過 Dockerfile 構建鏡像,但生成的鏡像只能存在于單個節(jié)點上,不會分配給其他節(jié)點。
如果您想使用 Compose 將服務擴展到多個節(jié)點,則必須自己構建它,將其推送到注冊表(例如 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
如果一個服務具有強制聯(lián)合調(diào)度類型的多個依賴關系(參見下面的自動調(diào)度),那么 Swarm 可能會調(diào)度依賴關系到不同的節(jié)點上,從而無法安排依賴服務。例如,這里foo
需要被共同調(diào)度與bar
和baz
:
version: "2"services: foo: image: foo volumes_from: ["bar"] network_mode: "service:baz" bar: image: bar baz: image: baz
問題是,群可能會先安排bar
和baz
不同的節(jié)點上(因為他們是不依賴于彼此),使它不可能挑選一個合適的節(jié)點foo
。
要解決此問題,請使用手動調(diào)度來確保所有三個服務都在同一個節(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"
如果服務從主機映射端口,例如80:8000
,那么docker-compose up
在第一次之后運行它時可能會出現(xiàn)類似下面的錯誤:
docker: Error response from daemon: unable to find a node that satisfies container==6ab2dfe36615ae786ef3fc35d641a260e3ea9663d6e69c5b70ce0ca6cb373c02.
這種錯誤的常見原因是容器在沒有顯式映射的情況下具有一個卷(在其圖像或撰寫文件中定義),因此為了保留其數(shù)據(jù),Compose 已指示 Swarm 安排新容器與舊容器相同的節(jié)點。這導致了端口沖突。
解決這個問題有兩個可行的解決辦法:
指定一個已命名的卷,并使用一個卷驅(qū)動程序,該卷驅(qū)動程序能夠?qū)⒃摼頀燧d到容器中,而不管其預定在哪個節(jié)點上。如果服務僅使用命名卷,則Compose不會為Swarm提供任何特定的計劃指示。版本:“2”服務: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
某些配置選項將導致容器在同一個 Swarm 節(jié)點上自動進行調(diào)度,以確保它們正常工作。這些是:
network_mode: "service:..."
和network_mode: "container:..."
(以及net: "container:..."
第一版文件格式)。
volumes_from
links
Swarm 提供了豐富的時間安排和親和力提示,使您能夠控制容器的位置。它們通過容器環(huán)境變量指定,因此您可以使用Compose 的environment
選項來設置它們。
# 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"
有關完整的可用過濾器和表達式,請參閱 Swarm 文檔。