安裝 Docker 版本 1.13 或更高版本。前端
獲取 Docker Compose。在適用於 Mac 和 Docker 桌面的 Windows 上,它已預安裝,所以您能夠good-to-go。在 Linux 系統上,您須要直接安裝它。在 Windows 10 系統以前上,沒有 Hyper-V,請使用 Docker Toolbox。node
閱讀第 1 部分中的方向。web
瞭解如何在第 2 部分中建立容器。docker
確保經過將friendlyhello
鏡像推送到registry來發布您建立的鏡像。咱們在這裏使用共享鏡像。數據庫
確保鏡像用做已部署的容器。運行此命令,在信息中鍵入username
、repo
和tag
:docker run -p 4000:80 username/repo:tag
,而後訪問http://localhost:4000/
瀏覽器
在第 3 部分中,咱們擴展應用程序並實現負載平衡。爲此,咱們必須在分佈式應用程序的層次結構中提高一個級別:服務。網絡
Stackapp
Services(您在這裏)curl
Container(第 2 部分涵蓋)tcp
在分佈式應用程序中,應用程序的不一樣部分稱爲"服務"。例如,若是您想象一個視頻共享站點,它大概包括用於在數據庫中存儲應用程序數據的服務、用戶上傳內容後在後臺進行視頻轉碼的服務、前端服務等。
服務實際上只是"生產環境中的容器"。服務只運行一個鏡像,但它編碼了鏡像的運行方式 - 它應該使用什麼端口,容器應運行多少個副本,以便服務具備所需的容量,等等。縮放服務會更改運行該軟件的容器實例數,從而將更多的計算資源分配給進程中的服務。
幸運的是,使用 Docker 平臺定義、運行和擴展服務很是簡單 — 只需編寫一個 docker-compose.yml
文件便可。
docker-compose.yml
文件docker-compose.yml
文件是一個 YAML 文件,用於定義 Docker 容器在生產中應如何操做。
docker-compose.yml
將此文件保存爲 docker-compose.yml
,不管您須要。請確保將第 2 部分中建立的鏡像推送到registry,並經過將username/repo:tag
替換爲鏡像詳細信息來更新此 .yml
。
version: "3" services: web: # replace username/repo:tag with your name and image details image: username/repo:tag deploy: replicas: 5 resources: limits: cpus: "0.1" memory: 50M restart_policy: condition: on-failure ports: - "4000:80" networks: - webnet networks: webnet:
此 docker-compose.yml
文件告訴 Docker 執行如下操做:
從registry中提取咱們在步驟 2 中上傳的圖像。
將該鏡像的 5 個實例做爲稱爲 web
的服務運行,限制每一個實例最多使用單個 CPU 時間 10%(這也能夠例如,"1.5"表示每一個內存爲 1 和半內核),而且限制 50MB 的 RAM。
若是容器發生故障,當即重啓容器。
將主機上的端口 4000 映射到 Web 的端口 80。
指示 web
的容器經過稱爲 webnet
的負載平衡網絡共享端口 80。(在內部,容器自己在臨時端口發佈到 Web 的端口 80。
使用默認設置(負載平衡覆蓋網絡)定義 webnet
網絡。
在使用 docker stack deploy
命令以前,咱們首先運行:
docker swarm init
注意:咱們進入第 4 部分中該命令的含義。若是不運行
docker swarm init
,則會收到一個錯誤,即"this node is not a swarm manager."。
如今讓咱們運行它。您須要爲應用指定名稱。在這裏,它叫getstartedlab
:
docker stack deploy -c docker-compose.yml getstartedlab
咱們的單個服務堆棧在一臺主機上運行部署鏡像的 5 個容器實例。讓咱們來調查一下。
獲取咱們應用程序中一個服務的服務 ID:
docker service ls
查找 web
服務的輸出,並預置應用名稱。若是將其命名爲與本示例中所示相同,則名稱爲 getinitlab_web
。服務 ID 以及副本、鏡像名稱和公開端口的數量也列出。
或者,您能夠運行 docker stack services
,而後是堆棧的名稱。如下示例命令容許您查看與 getstartedlab
堆棧關聯的全部服務:
docker stack services getstartedlab ID NAME MODE REPLICAS IMAGE PORTS bqpve1djnk0x getstartedlab_web replicated 5/5 username/repo:tag *:4000->80/tcp
在服務中運行的單個容器稱爲任務
。任務被賦予以數字遞增的方式得到的惟一標識,最多於您在 docker-compose.yml
中定義的複製replicas
數。列出服務的任務:
docker service ps getstartedlab_web
若是隻是列出系統上的全部容器,任務也會顯示,儘管未按服務進行篩選:
docker container ls -q
您能夠連續運行curl -4 http://localhost:4000
幾回,或者轉到瀏覽器中的該 URL 並點擊刷新幾回。
不管哪一種方式,容器 ID 都發生更改,演示負載平衡;在每一個請求中,以循環方式選擇 5 個任務之一以響應。容器 ID們 與上面的命令(docker container ls -q
)的輸出匹配。
要查看堆棧的全部任務,能夠運行 docker stack ps
後跟應用名稱,如如下示例所示:
docker stack ps getstartedlab ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS uwiaw67sc0eh getstartedlab_web.1 username/repo:tag docker-desktop Running Running 9 minutes ago sk50xbhmcae7 getstartedlab_web.2 username/repo:tag docker-desktop Running Running 9 minutes ago c4uuw5i6h02j getstartedlab_web.3 username/repo:tag docker-desktop Running Running 9 minutes ago 0dyb70ixu25s getstartedlab_web.4 username/repo:tag docker-desktop Running Running 9 minutes ago aocrb88ap8b0 getstartedlab_web.5 username/repo:tag docker-desktop Running Running 9 minutes ago
正在運行 Windows 10?
Windows 10 PowerShell 應該已經有捲曲可用, 但若是沒有,你能夠抓住一個Linux終端模擬器,如Git BASH, 或下載 wget for Windows這是很是相似的.
響應時間慢?
根據環境的網絡配置,容器最多可能須要 30 秒才能響應 HTTP 請求。這不是 Docker 或羣性能的指示,而是本教程後面討論未知足的 Redis 依賴項。目前,訪問者計數器因爲一樣的緣由沒法工做;咱們還沒有添加用於保留數據的服務。
您能夠經過更改 docker-compose.yml
中的replicas
值、保存更改並從新運行 docker stack deploy
命令來縮放應用:
docker stack deploy -c docker-compose.yml getstartedlab
Docker 執行就地更新,無需先將堆棧撕下或終止任何容器。
如今,從新運行 docker container ls -q
以查看已部署的實例從新配置。若是放大了replicas,將啓動更多任務,從而啓動更多容器。
使用 docker stack rm
將應用下掉:
docker stack rm getstartedlab
下掉swarm
:
docker swarm leave --force
使用 Docker 創建並擴展應用很是簡單。您在學習如何在生產環境中運行容器邁出了一大步。接下來,您將學習如何在 Docker 計算機羣集上以真正的羣形式運行此應用程序。
注意:像這樣的Compose文件用於使用 Docker 定義應用程序,而且可使用 Docker Cloud 上載到雲提供商,也能夠上載到使用 Docker 企業版選擇的任何硬件或雲提供商。
歸納地說,雖然鍵入 docker run
很是簡單,但生產中的容器的真正實現是做爲服務運行它。服務在 Compose 文件中編纂容器的行爲,而且此文件可用於擴展、限制和從新部署咱們的應用。
在此階段要探索的一些命令:
docker stack ls # List stacks or apps docker stack deploy -c <composefile> <appname> # Run the specified Compose file docker service ls # List running services associated with an app docker service ps <service> # List tasks associated with an app docker inspect <task or container> # Inspect task or container docker container ls -q # List container IDs docker stack rm <appname> # Tear down an application docker swarm leave --force # Take down a single node swarm from the manager