將堆疊部署至叢集
當在 Swarm 模式下執行 Docker Engine 時,您可以使用 docker stack deploy 將完整的應用程式堆疊部署到 Swarm。deploy 指令接受以 Compose 檔案格式描述的堆疊。
注意
docker stack deploy指令使用舊版的 Compose 檔案版本 3 格式,這是由 Compose V1 所使用。由 Compose 規範定義的最新格式與docker stack deploy指令不相容。關於 Compose 演進的更多資訊,請參閱 Compose 的歷史。
要完成本教學課程,您需要:
一個在 Swarm 模式下執行的 Docker Engine。如果您不熟悉 Swarm 模式,建議您閱讀 Swarm 模式關鍵概念 以及 服務運作方式。
注意如果您是在本地開發環境中進行嘗試,可以使用
docker swarm init將您的引擎切換至 Swarm 模式。如果您已經執行了多節點的 Swarm,請記住所有
docker stack和docker service指令都必須從管理員節點 (Manager Node) 執行。目前的 Docker Compose 版本。
設定 Docker Registry
由於 Swarm 由多個 Docker Engine 組成,因此需要一個 Registry 來將映像檔分發給所有節點。您可以使用 Docker Hub 或自行維護 Registry。以下說明如何建立一個臨時 Registry,事後即可刪除。
在您的 Swarm 上將 Registry 啟動為一項服務
$ docker service create --name registry --publish published=5000,target=5000 registry:2使用
docker service ls檢查其狀態$ docker service ls ID NAME REPLICAS IMAGE COMMAND l7791tpuwkco registry 1/1 registry:2@sha256:1152291c7f93a4ea2ddc95e46d142c31e743b6dd70e194af9e6ebe530f782c17當
REPLICAS欄位顯示1/1時,表示它正在執行。如果顯示0/1,則表示可能仍在拉取映像檔。使用
curl測試其是否運作正常$ curl http://127.0.0.1:5000/v2/ {}
建立範例應用程式
本指南中使用的應用程式基於 Docker Compose 入門指南中的計數器應用程式。它由一個 Python 應用程式組成,該程式會在 Redis 實例中維護一個計數器,並在您每次造訪時遞增該計數器。
為專案建立一個目錄
$ mkdir stackdemo $ cd stackdemo在專案目錄中建立一個名為
app.py的檔案並貼上以下內容from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='redis', port=6379) @app.route('/') def hello(): count = redis.incr('hits') return 'Hello World! I have been seen {} times.\n'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", port=8000, debug=True)建立一個名為
requirements.txt的檔案並貼上這兩行內容flask redis建立一個名為
Dockerfile的檔案並貼上以下內容# syntax=docker/dockerfile:1 FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"]建立一個名為
compose.yaml的檔案並貼上以下內容services: web: image: 127.0.0.1:5000/stackdemo build: . ports: - "8000:8000" redis: image: redis:alpineWeb 應用程式的映像檔是使用上述的 Dockerfile 構建的。它也被標記為
127.0.0.1:5000,即稍早建立的 Registry 位址。這對於將應用程式分發到 Swarm 至關重要。
使用 Compose 測試應用程式
使用
docker compose up啟動應用程式。這會構建 Web 應用程式映像檔、拉取 Redis 映像檔(如果您尚未擁有),並建立兩個容器。您會看到一則關於引擎處於 Swarm 模式的警告。這是因為 Compose 不會利用 Swarm 模式的功能,而是將所有內容部署到單一節點。您可以安全地忽略此訊息。
$ docker compose up -d WARNING: The Docker Engine you're using is running in swarm mode. Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers are scheduled on the current node. To deploy your application across the swarm, use `docker stack deploy`. Creating network "stackdemo_default" with the default driver Building web ...(build output)... Creating stackdemo_redis_1 Creating stackdemo_web_1使用
docker compose ps檢查應用程式是否正在執行$ docker compose ps Name Command State Ports ----------------------------------------------------------------------------------- stackdemo_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp stackdemo_web_1 python app.py Up 0.0.0.0:8000->8000/tcp您可以使用
curl測試該應用程式$ curl https://:8000 Hello World! I have been seen 1 times. $ curl https://:8000 Hello World! I have been seen 2 times. $ curl https://:8000 Hello World! I have been seen 3 times.關閉應用程式
$ docker compose down --volumes Stopping stackdemo_web_1 ... done Stopping stackdemo_redis_1 ... done Removing stackdemo_web_1 ... done Removing stackdemo_redis_1 ... done Removing network stackdemo_default
將產生的映像檔推送至 Registry
若要將 Web 應用程式的映像檔分發到整個 Swarm,需要將其推送到您稍早設定的 Registry。使用 Compose,這非常簡單
$ docker compose push
Pushing web (127.0.0.1:5000/stackdemo:latest)...
The push refers to a repository [127.0.0.1:5000/stackdemo]
5b5a49501a76: Pushed
be44185ce609: Pushed
bd7330a79bcf: Pushed
c9fc143a069a: Pushed
011b303988d2: Pushed
latest: digest: sha256:a81840ebf5ac24b42c1c676cbda3b2cb144580ee347c07e1bc80e35e5ca76507 size: 1372
現在堆疊已準備好進行部署。
將堆疊部署至 Swarm
使用
docker stack deploy建立堆疊$ docker stack deploy --compose-file compose.yaml stackdemo Ignoring unsupported options: build Creating network stackdemo_default Creating service stackdemo_web Creating service stackdemo_redis最後一個參數是堆疊名稱。每個網路、磁碟區和服務名稱都會加上該堆疊名稱作為前綴。
使用
docker stack services stackdemo檢查其是否正在執行$ docker stack services stackdemo ID NAME MODE REPLICAS IMAGE orvjk2263y1p stackdemo_redis replicated 1/1 redis:3.2-alpine@sha256:f1ed3708f538b537eb9c2a7dd50dc90a706f7debd7e1196c9264edeea521a86d s1nf0xy8t1un stackdemo_web replicated 1/1 127.0.0.1:5000/stackdemo@sha256:adb070e0805d04ba2f92c724298370b7a4eb19860222120d43e0f6351ddbc26f一旦執行,您應該會在兩個服務的
REPLICAS欄位看到1/1。如果您擁有一個多節點的 Swarm,這可能需要一些時間,因為映像檔需要被拉取。與之前一樣,您可以使用
curl測試應用程式$ curl https://:8000 Hello World! I have been seen 1 times. $ curl https://:8000 Hello World! I have been seen 2 times. $ curl https://:8000 Hello World! I have been seen 3 times.透過 Docker 內建的路由網格 (Routing Mesh),您可以存取 Swarm 中的任何節點並透過連接埠
8000存取應用程式$ curl http://address-of-other-node:8000 Hello World! I have been seen 4 times.使用
docker stack rm關閉堆疊$ docker stack rm stackdemo Removing service stackdemo_web Removing service stackdemo_redis Removing network stackdemo_default使用
docker service rm關閉 Registry$ docker service rm registry如果您只是在本地機器上進行測試,並希望將 Docker Engine 退出 Swarm 模式,請使用
docker swarm leave$ docker swarm leave --force Node left the swarm.