Docker 入門 第三部分: 服務

Docker 入門 第三部分: 服務

先決條件

  • 安裝 Docker 1.13 或更高版本
  • 獲取 Docker Compose。在Docker for MacDocker for Windows 上它已經預安裝,所以你能夠隨時使用。在Linux系統上你須要安裝一下Docker Compose。在沒有Hyper-V的win10以前的系統,使用Docker Toolbox
  • 閱讀第一部分的定位介紹
  • 學習第二部分:如何建立容器
  • 確保你已經將你建立的 friendlyhello 鏡像發佈到一個 registry。咱們在這裏使用該鏡像。
  • 確保你的鏡像已經做爲一個部署的容器運行。運行一下命令,將 username、repo 和tag插入你的信息。而後瀏覽 http://localhost:4000/
docker run -p 4000:80 username/repo:tag

介紹

在分佈式應用中,應用的不一樣部分被成爲「服務」。例如,一個視頻分享網站,它可能包含在數據庫中存儲應用數據的服務,用戶上傳視頻後在後臺作視頻轉碼的服務,前端服務,等等。
實際上,服務只是「生產環境中的容器」。一個服務只運行在一個鏡像中,可是它編排了鏡像的運行方式——應該使用那些端口,應該運行多少個容器副原本讓服務有它須要的能力,等等。擴展服務會改變該運行中的軟件部分的容器實例的數量,從而在流程中爲服務分配更多的計算資源。前端

幸運的是,使用Docker 平臺定義、運行和擴展服務都很是容易——只須要編寫一個docker-compose.yml文件便可。node

你的第一個 docker-compose.yml 文件

docker-compose.yml是一個YAML文件,定了一Docker容器在生產環境中應該如何工做。python

docker-compose.yml

將這個文件另存爲 docker-compose.yml,保存到你想保存的位置,確保你在第二部分中建立的鏡像已經發布到registry,經過把username/repo:tag替換爲你的鏡像的信息來更新這個.yml文件。git

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去作如下事情:github

  • 從registry中拉取咱們在第二部分建立的鏡像
  • 把鏡像的5個實例做爲名爲web的服務運行,限制每一個服務最多使用10%的CPU(跨全部核心)和50MB內存。
  • 若是其中一個服務失敗則馬上重啓容器
  • 映射主機的4000端口到web的80端口
  • 指示 web的容器經過叫作webnet的負載均衡網絡來共昂80端口(在內部,容器本身在一個臨時端口發佈web的80湍口)
  • 使用默認設置定義webnet網絡(它是一個負載覆蓋網絡:overlay network覆蓋網絡的定義能夠自定搜索)

運行你新建的負載均衡應用

在咱們使用docker stackdeploy命令以前,先執行:web

docker swarm init

注意:咱們會在第四部門介紹該命令的含義。若是你不運行docker swarm init,你會獲得一個「this node is not a swarm manager」的錯誤消息。redis

如今咱們運行它,你須要給你的應用起一個名字,在這裏,名字是getstartedlabdocker

docker stack deploy -c docker-compose.yml getstartedlab

如今咱們的單服務堆棧在一臺主機上運行了已部署鏡像的5個容器實例。咱們能夠查看一下。
獲取咱們應用程序中的一個服務的服務ID:shell

docker service ls

在輸出中找到以你的應用名字爲前綴的輸出。若是你命名的可本例中的同樣。那它的名字就是getstartedlab_web。還列出了服務ID,以及副本數量、鏡像名稱和暴露的端口。

在服務中運行的單個容器叫作task(任務)。任務被賦予遞增的數字做爲ID,副本運行的最大數量爲你在docker-compose.yml中定義的數量。列出你的服務中的任務:

docker service ps getstartedlab_web

若是你只列出你的系統上的容器,則任務也會被列出,雖然任務不會被服務過濾:

docker container ls -q

你能夠運行幾回 curl -4 http://localhost:4000 或者在你的瀏覽器中訪問這個URL並刷新幾回。

不管哪一種方式,容器ID都會改變,這說明負載均衡在起做用;對於每個請求,都會從5個任務中選一個,以輪詢的方式來響應。容器ID和上一個命令的輸出相匹配(docker container ls -q)。

在Win10中運行?
Win10的 powershell中默認應該可使用curl,若是沒有,你能夠安裝一個相似 GIT BASH 的終端模擬器或者 下載與之相似的wget for Windows

響應時間慢?
依賴於你的環境的網絡配置,容器響應HTTP請求最多可能須要30秒。這並不能代表Docker 或swarm的性能很差,而是一個未知足的redis依賴問題,稍後咱們會在本章討論。如今,由於相同的緣由,訪客計數也不能正常工做,咱們還沒添加保存數據的服務。

擴展應用程序

你能夠經過修改docker-compose.yml中的副本值來擴展應用,保存配置並從新運行docker stack deploy 命令:

docker stack deploy -c docker-compose.yml getstartedlab

Docker執行原地更新,不須要提早關閉服務棧或殺死任何容器。

如今從新運行docker container ls -q,查看部署的從新配置的實例,若是你擴展了副本數量,那麼會啓動更多的任務,也會所以啓動更多的容器。

卸載應用和swarm

  • 使用 docker stack rm 來卸載應用

    docker stack rm getstartedlab
  • 卸載swarm

    docker swarm leave --force

使用Docker 會很是容器啓動和擴展你的應用,你已經向着如何在生產環境運行容器邁出了一大步。接下來,你會學會如何在docker集羣上以集羣的方式運行這個應用。

注意:Compose文件用於定義Docker 的應用程序,而且可使用 Docker Cloud上傳到雲服務商,或任何硬件,或你選擇的Docker Enterprise Edition 的雲服務商。

回覆和備忘

下面會有一個本頁終端操做視頻

bash-3.2$ ls                                                                                                                                                                         
docker-compose.yml           
bash-3.2$ cat docker-compose.yml                                                                                                                                                     
version: "3"                                                                                                                                                                         
services:                                                                                                                                                                            
  web:                                                                                                                                                                               
    image: johndmulhausen/get-started:part1                                                                                                                                          
    deploy:                                                                                                                                                                          
      replicas: 5                                                                                                                                                                    
      restart_policy:                                                                                                                                                                
        condition: on-failure                                                                                                                                                        
      resources:                                                                                                                                                                     
        limits:                                                                                                                                                                      
          cpus: "0.1"                                                                                                                                                                
          memory: 50M                                                                                                                                                                
    ports:                                                                                                                                                                           
      - "80:80"                                                                                                                                                                      
    networks:                                                                                                                                                                        
      - webnet                                                                                                                                                                       
networks:                                                                                                                                                                            
  webnet:                                                                                                                                                                            
 
bash-3.2$ docker stack deploy -c docker-compose.yml getstartedlab                                                                                                                    
Creating network getstartedlab_webnet                                                                                                                                                
Creating service getstartedlab_web     
bash-3.2$ docker ps                                                                                                                                                                  
CONTAINER ID        IMAGE                              COMMAND             CREATED             STATUS              PORTS               NAMES                                         
b429f44ecb54        johndmulhausen/get-started:part1   "python app.py"     6 seconds ago       Up 2 seconds        80/tcp              getstartedlab_web.1.bwvqyil6v2friys3stu1c2rdy 
2c4cec03073c        johndmulhausen/get-started:part1   "python app.py"     6 seconds ago       Up 3 seconds        80/tcp              getstartedlab_web.2.wefoq9ql6p81kf14fpdixalc6 
6fb8a01ff40f        johndmulhausen/get-started:part1   "python app.py"     6 seconds ago       Up 3 seconds        80/tcp              getstartedlab_web.4.xn5kvu19hvrri8zuvshwwed8v 
206a434234ed        johndmulhausen/get-started:part1   "python app.py"     6 seconds ago       Up 2 seconds        80/tcp              getstartedlab_web.3.rhg9v9mn05otfwh3zx6lp9gww 
3ec2903b7cf7        johndmulhausen/get-started:part1   "python app.py"     6 seconds ago       Up 3 seconds        80/tcp              getstartedlab_web.5.qp8nuzn37oddpmxqry1ssyb7a 
3ec2903b7cf7        johndmulhausen/get-started:part1   "python app.py"     6 seconds ago       Up 3 seconds        80/tcp              getstartedlab_web.5.qp8nuzn37oddpmxqry1ssyb7a 

bash-3.2$ curl http://localhost/                                                                                                                                                     
<h3>Hello World!</h3><b>Hostname:</b> 206a434234ed<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
bash-3.2$ curl http://localhost/                               
<h3>Hello World!</h3><b>Hostname:</b> b429f44ecb54<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
bash-3.2$ curl http://localhost/                               
<h3>Hello World!</h3><b>Hostname:</b> 2c4cec03073c<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
bash-3.2$ curl http://localhost/                               
<h3>Hello World!</h3><b>Hostname:</b> 6fb8a01ff40f<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
bash-3.2$ curl http://localhost/                               
<h3>Hello World!</h3><b>Hostname:</b> 3ec2903b7cf7<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
bash-3.2$ curl http://localhost/                               
<h3>Hello World!</h3><b>Hostname:</b> 206a434234ed<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
bash-3.2$ curl http://localhost/                               
<h3>Hello World!</h3><b>Hostname:</b> b429f44ecb54<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
bash-3.2$ curl http://localhost/                               
<h3>Hello World!</h3><b>Hostname:</b> 2c4cec03073c<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
bash-3.2$

回顧一下,輸入docker run很簡單,在生產環境中容器的真正實現是將其做爲一個服務運行,服務在Compose文件中指定容器的行爲,而且這個文件能夠被用於擴展、限制、重部署咱們的app。使用和啓動服務相同的命令,能夠在服務運行時,對其進行適當的更改。

在這裏須要瞭解的一些命令以下:

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
相關文章
相關標籤/搜索