Docker 入門 第六部分:部署app


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鏈接起來。

如果你運行在Swarm模式中(推薦使用Amazon Web Service 或者Microsoft Azure),請跳到下一節有關如何創建swarm。

創建 swarm

准備創建swarm:

注意:如果你使用Docker Cloud Agent來帶動你自己的主機,則這種方式不支持集群模式。你可以在Docker Cloud 中注冊自己已存在的swarm

在雲提供商上部署你的應用

  1. 通過Docker Cloud鏈接你自己的swarm。有幾種不同的連接方式:

    • 在Swarm模式的Docker Cloud web界面,選擇頁面頂部的Swarms,點擊你想要連接的swarm,然后將給定的命令復制粘貼到命令行終端。
    • 在Docker for Mac 或者Docker for Windows上,你可以通過桌面應用菜單直接連接到你的swarm上
    • 無論哪種方式,都會打開一個上下文是你的本地機器的終端,但其docker命令會被路由到你的雲服務提供商上的swarm上。你可以直接連接本地文件系統和遠程swarm,從而使用docker 命令。
  2. 運行 docker stack deploy -c docker-compose.yml getstartedlab 在雲托管的swarm上部署app

     docker 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
  1. 登陸AWS控制台,進入EC2面板,並點擊進入Running Instances 來查看節點。

  2. 在左側菜單里找到Network & Security > Security Groups
    查看關聯到你的swarm的security groups,,getstartedlab-Manager-<XXX>getstartedlab-Nodes-<XXX>getstartedlab-SwarmWide-<XXX>

  3. 選擇swarm的“Node”安全組,安全組的名字類似:getstartedlab-NodeVpcSG-9HV9SMHDZT8C

  4. 為 web、visualizer 和 redis 服務添加入站規則,為上面表格(表1)的每一行內容都設置類型、協議和端口,點擊保存這些規則。

    提示: 當你保存新規則時,HTTP 和TCP端口會在IPv4和IPv6地址上自動創建。

  5. 返回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都可以繼續運行在雲服務器上。

Enterprise(Cloud provider)這里不做介紹

Enterprise(On-premise)這了不做介紹


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM