Docker 入門 第六部分:部署app
先決條件
- 安裝 Docker 1.13 或更高版本
- 按照第三部分中的描述安裝Docker Compose。
- 按照第四部分中描述安裝了Docker Machine,
- 閱讀第一部分
- 在第二部分中學習如何創建容器
- 確保你已經將創建的
friendlyhello
鏡像發布到registry。我們會在這里用到這個鏡像 - 確保你的鏡像已經作為容器被部署運行,運行這個命令,在你的信息中加入
username
,repo
, 和tag
:docker run -p 80:80 username/repo:tag
, 然后查看http://localhost/
。 - 從第五部分獲取
docker-compose.yml
的最終版本.
介紹
現在我們已經為整個教程編輯了Compose文件。這里有好消息,Compose文件在生產環境中的產生的效果和在你計算機上產生的效果是一樣的。在這里,我們會介紹一些運行容器化應用的選項。
選擇一個選項
Docker CE(Cloud provider)
如果你在生產環境中使用Docker社區辦用的很好,你可以使用Docker Cloud來幫助你管理在流行服務提供商(例如Amazon Web Services、DigitalOcean 或者 Microsoft Azure)上的app,
設置和部署:
- 將你首選的提供商鏈接到Docker雲,授權Docker Cloud自動為你配置和“Dockerize”VM的權限。
- 使用Docker Cloud創建你的計算資源和swarm
- 部署你的app
注意: 這里我們不會鏈接到Docker Cloud文檔,完成每個步驟后,請確保重新返回這個頁面。
鏈接Docker Cloud
你可以在標准模式或者Swaram模式中運行Docker Cloud。
如果你在標准模式中運行Docker Cloud,請遵照下面的步驟將你的服務提供商河Docker Cloud鏈接起來。
- Amazon Web Services 配置指南
- DigitalOcean 配置指南
- Microsoft Azure 配置指南
- Packet 配置指南
- SoftLayer 配置指南
- 使用 the Docker Cloud Agent 引用你自己的主機
如果你運行在Swarm模式中(推薦使用Amazon Web Service 或者Microsoft Azure),請跳到下一節有關如何創建swarm。
創建 swarm
准備創建swarm:
- 如果使用的是Amazon Web Services(AWS),你可以在AWS上自動創建一個swarm。
- 如果使用的是微軟的Azure ,你可以在Azure上自動創建awzrm
- 否則,就使用Dcoker Cloud UI界面創建你的節點 ,並運行第四部分里在Docker Cloud上通過ssh學習到的
docker swarm init
和docker swarm join
命令。最后,點擊屏幕頂部的切換按鈕來啟用Swarm模式,並注冊剛剛創建的swarm。
注意:如果你使用Docker Cloud Agent來帶動你自己的主機,則這種方式不支持集群模式。你可以在Docker Cloud 中注冊自己已存在的swarm。
在雲提供商上部署你的應用
-
通過Docker Cloud鏈接你自己的swarm。有幾種不同的連接方式:
- 在Swarm模式的Docker Cloud web界面,選擇頁面頂部的Swarms,點擊你想要連接的swarm,然后將給定的命令復制粘貼到命令行終端。
- 在Docker for Mac 或者Docker for Windows上,你可以通過桌面應用菜單直接連接到你的swarm上。
- 無論哪種方式,都會打開一個上下文是你的本地機器的終端,但其docker命令會被路由到你的雲服務提供商上的swarm上。你可以直接連接本地文件系統和遠程swarm,從而使用
docker
命令。
-
運行
docker stack deploy -c docker-compose.yml getstartedlab
在雲托管的swarm上部署appdocker stack deploy -c docker-compose.yml getstartedlab Creating network getstartedlab_webnet Creating service getstartedlab_web Creating service getstartedlab_visualizer Creating service getstartedlab_redis
現在你的app就運行在雲上了。
運行一些swarm命令來驗證部署
你可以像使用swarm命令行一樣瀏覽和管理swarm。這里會有一些看起來看熟悉的例子:
-
使用
docker node ls
列出節點。[getstartedlab] ~ $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 9442yi1zie2l34lj01frj3lsn ip-172-31-5-208.us-west-1.compute.internal Ready Active jr02vg153pfx6jr0j66624e8a ip-172-31-6-237.us-west-1.compute.internal Ready Active thpgwmoz3qefdvfzp7d9wzfvi ip-172-31-18-121.us-west-1.compute.internal Ready Active n2bsny0r2b8fey6013kwnom3m * ip-172-31-20-217.us-west-1.compute.internal Ready Active Leader
-
使用
docker service ls
列出服務[getstartedlab] ~/sandbox/getstart $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS x3jyx6uukog9 dockercloud-server-proxy global 1/1 dockercloud/server-proxy *:2376->2376/tcp ioipby1vcxzm getstartedlab_redis replicated 0/1 redis:latest *:6379->6379/tcp u5cxv7ppv5o0 getstartedlab_visualizer replicated 0/1 dockersamples/visualizer:stable *:8080->8080/tcp vy7n2piyqrtr getstartedlab_web replicated 5/5 sam/getstarted:part6 *:80->80/tcp
-
使用
docker service ps <service>
查看服務中的任務[getstartedlab] ~/sandbox/getstart $ docker service ps vy7n2piyqrtr ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS qrcd4a9lvjel getstartedlab_web.1 sam/getstarted:part6 ip-172-31-5-208.us-west-1.compute.internal Running Running 20 seconds ago sknya8t4m51u getstartedlab_web.2 sam/getstarted:part6 ip-172-31-6-237.us-west-1.compute.internal Running Running 17 seconds ago ia730lfnrslg getstartedlab_web.3 sam/getstarted:part6 ip-172-31-20-217.us-west-1.compute.internal Running Running 21 seconds ago 1edaa97h9u4k getstartedlab_web.4 sam/getstarted:part6 ip-172-31-18-121.us-west-1.compute.internal Running Running 21 seconds ago uh64ez6ahuew getstartedlab_web.5 sam/getstarted:part6 ip-172-31-18-121.us-west-1.compute.internal Running Running 22 seconds ago
在雲主機上開放服務
現在,你的app作為一個swarm部署在雲服務器上,就像剛剛運行docker
命令驗證的那樣。但你還需要開放端口來實現下面的內容:
- 允許工作節點上的redis服務和web服務可以進行通信
- 允許工作節點上的web服務可以入站訪問,以便可以通過web瀏覽器可以訪問Hello world 和 Visualizer。
- 允許服務器上的SSH入站訪問,以便運行
manager
(這可能已經在你的雲服務商設置了)
下面是每個服務你需要開放的端口
Service | Type | Protocol | Port |
---|---|---|---|
web | HTTP | TCP | 80 |
visualizer | HTTP | TCP | 8080 |
redis | TCP | TCP | 6379 |
表1
執行該操作的方法因與服務商的不同而不同。
這里我們使用Amazon Web Service(AWS)來舉例。
如何使用redis來存儲數據
要是redis正常工作,你需要ssh連接到運行了manager的雲服務器,在運行docker stack deploy
之前先在 /home/docker/ 創建 data/ 目錄。另外一個方法是將docker-stack.yml
文件中的數據路徑更改為manager
服務器上預先存在的路徑。這里的例子不包含該步驟,因此示例輸出中的redis服務沒有運行。
示例:AWS
-
登陸AWS控制台,進入EC2面板,並點擊進入Running Instances 來查看節點。
-
在左側菜單里找到Network & Security > Security Groups
查看關聯到你的swarm的security groups,,getstartedlab-Manager-<XXX>
,getstartedlab-Nodes-<XXX>
,getstartedlab-SwarmWide-<XXX>
-
選擇swarm的“Node”安全組,安全組的名字類似:
getstartedlab-NodeVpcSG-9HV9SMHDZT8C
。 -
為 web、visualizer 和 redis 服務添加入站規則,為上面表格(表1)的每一行內容都設置類型、協議和端口,點擊保存這些規則。
提示: 當你保存新規則時,HTTP 和TCP端口會在IPv4和IPv6地址上自動創建。
-
返回Running Instances列表,獲取其中一個worker的公共DNS名稱,並粘貼到瀏覽器地址欄。
與教程的前幾部分一樣, HelloWorld app會顯示在80端口,Visualizer顯示在8080端口
迭代和清理
從這里開始,你可以做之前部分教程中學到的所有事情,
- 通過修改
docker-compose.yml
文件來擴展app,使用docker stack deploy
命令來及時更新部署。 - 通過修改代碼來更改app行為,然后重建,並推送新的鏡像。(要這樣做,需要按照前面學習的構建app和發布鏡像相同的步驟來實現)。
- 你可以使用
docker stack rm
來刪除stack,例如:
docker stack getstartedlab
與在本地docker機器上運行swarm不同,無論你是否關閉本地主機,你的swarm 和 其上的app都可以繼續運行在雲服務器上。