Docker入門,Part3:服務(wù)

要求

  • Docker安裝版本在1.13或以上
  • 安裝Docker Compose。如果是安裝的Docker for Mac和Docker for Windows,那么Docker Compose會(huì)一起安裝。在Linux系統(tǒng)上需要直接進(jìn)行安裝。如果是在不支持Hyper-v的Windows10以前的操作系統(tǒng),可以使用Docker Toolbox進(jìn)行安裝
  • 已完成Docker入門,Part1的閱讀學(xué)習(xí)
  • 學(xué)會(huì)如何創(chuàng)建容器,完成Docker入門,Part2的學(xué)習(xí)
  • 確保已根據(jù)Docker入門,Part2的知識(shí)點(diǎn),將提到的friendlyhello鏡像上傳推送到你的倉庫注冊(cè)地址。在本節(jié)我們將會(huì)用到這個(gè)鏡像
  • 確保鏡像能夠已經(jīng)能夠在本機(jī)作為一個(gè)部署的容器運(yùn)行 docker run -p 4000:80 username/repo:tag

說明介紹

在本節(jié),我們將擴(kuò)展我們的應(yīng)用,并實(shí)現(xiàn)負(fù)載均衡。為了實(shí)現(xiàn)這個(gè)目的,我們必須在分布式應(yīng)用程序的層次結(jié)構(gòu)中上升到更高一級(jí):服務(wù)

  • Stack(堆棧)
  • Services(服務(wù),本節(jié)內(nèi)容)
  • Container(容器,在Part2中介紹的相關(guān)概念)

關(guān)于服務(wù)

在分布式應(yīng)用中,應(yīng)用的不同部分(組件)稱為服務(wù)。例如,如果搭建一個(gè)視頻分享網(wǎng)站的應(yīng)用,我們這個(gè)應(yīng)用就可能會(huì)包含一個(gè)存儲(chǔ)應(yīng)用數(shù)據(jù)的數(shù)據(jù)庫服務(wù),一個(gè)在后臺(tái)負(fù)責(zé)處理用戶上傳的視頻轉(zhuǎn)碼的服務(wù)以及一個(gè)負(fù)責(zé)處理前后端業(yè)務(wù)的服務(wù)等。
服務(wù)在生產(chǎn)環(huán)境中就是各類容器。一個(gè)服務(wù)只基于一個(gè)鏡像運(yùn)行,但是它能夠控制對(duì)外暴露的端口信息,能夠控制運(yùn)行多少個(gè)容器的副本以確保該服務(wù)能夠滿足業(yè)務(wù)性能的要求等。通過擴(kuò)展服務(wù)能夠改變應(yīng)用中這部分容器實(shí)例運(yùn)行的數(shù)量,能夠分配更多的計(jì)算資源給這個(gè)服務(wù)。
在Docker平臺(tái)擴(kuò)展服務(wù)是一件非常容易的事情,僅僅只需要編寫docker-compose.yml文件。

第一個(gè)docker-compose.yml文件

docker-compose.yml采用YAML文件格式定義了在環(huán)境中容器的行為。
將下文提到的內(nèi)容保存到docker-compose.yml并將該文件保存在合適的位置。這個(gè)地方需要確保我們?cè)赑art2中的鏡像已經(jīng)成功的上傳推送到公共鏡像倉庫,并將文中的username/repo:tag替換為你自己的名稱

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執(zhí)行以下的動(dòng)作

  • 從公共倉庫注冊(cè)地拉取在Part2上傳的鏡像 username/repo:tag
  • 運(yùn)行這個(gè)鏡像的5個(gè)實(shí)例作為名為web的服務(wù),并限制每個(gè)實(shí)例的資源使用情況,最多10%的CPU使用已經(jīng)50M的內(nèi)存
  • 在遇到錯(cuò)誤停止時(shí),立即重啟容器
  • 將主機(jī)的4000端口映射到web服務(wù)的80端口
  • 指定web服務(wù)的容器通過一個(gè)名為webnet的負(fù)載均衡的網(wǎng)絡(luò)共享80端口(在服務(wù)內(nèi)部,容器會(huì)使用一個(gè)臨時(shí)的端口對(duì)應(yīng)到web服務(wù)的80端口)
  • 使用默認(rèn)的配置定義webnet網(wǎng)絡(luò)(默認(rèn)方式是負(fù)載均衡的網(wǎng)絡(luò))

運(yùn)行新的負(fù)載均衡的應(yīng)用

在使用docker stack deploy前,我們首先需要運(yùn)行docker swarm init

注意: 在Part4我們將學(xué)習(xí)到這些命令。如果不運(yùn)行docker swarm init那么會(huì)在執(zhí)行時(shí)報(bào)錯(cuò)"this node is not a swarm manager"

至此,我們就可以運(yùn)行我們的命令,我們需要給應(yīng)用命名(這里使用getstartedlab):

docker stack deploy -c docker-compose.yml getstartedlab

這樣由運(yùn)行在鏡像上的5個(gè)容器實(shí)例組成的單一服務(wù)的應(yīng)用就啟動(dòng)起來了。通過docker service ls查看所有的服務(wù),查找到以應(yīng)用名稱為前綴的web服務(wù)的信息。如果是使用的上文提到
的名稱命名的話,那么服務(wù)名稱就是getstartedlab_web。同時(shí)我們也能夠看到服務(wù)的ID、副本的數(shù)量、鏡像名稱以及端口信息。

在服務(wù)中一個(gè)單獨(dú)運(yùn)行的容器就叫做task(任務(wù))。每個(gè)任務(wù)都會(huì)有一個(gè)根據(jù)副本的數(shù)量自增的唯一ID,通過docker service ps getstartedlab_web可以查看到服務(wù)的任務(wù)信息。

在終端可以多次運(yùn)行curl -4 http://localhost:4000,或者在瀏覽器中打開頁面并每隔幾秒鐘進(jìn)行刷新,仔細(xì)觀察會(huì)發(fā)小頁面的信息會(huì)變化,變化的值實(shí)際上是容器的ID。這說明每次提供服務(wù)的容器是不同的,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的負(fù)載均衡的效果。

擴(kuò)展應(yīng)用

我們可以通過修改docker-compose.yml里的replicas的值來擴(kuò)展應(yīng)用,保存修改,然后重新運(yùn)行docker stack deploy命令
docker stack deploy -c docker-compose.yml getstartedlab
Docker實(shí)現(xiàn)了熱更新,不需要首先停止服務(wù)或者關(guān)閉容器。運(yùn)行完上面的命令后,接著運(yùn)行docker container ls -q可以看到變化的情況。如果你是增加了副本的數(shù)量,那么更多的任務(wù),更多的容器被啟動(dòng)了

停止應(yīng)用和集群

  • 使用docker stack rm來停止應(yīng)用,docker stack rm getstartedlab
  • 使用docker swarm leave --force關(guān)閉集群

使用Docker來啟動(dòng)和擴(kuò)展應(yīng)用是一件非常簡(jiǎn)單的事情。通過上面的介紹和前面幾篇文章的學(xué)習(xí),已經(jīng)了解了很多在生產(chǎn)環(huán)境運(yùn)行容器的知識(shí)。接下來,我們將繼續(xù)學(xué)習(xí)如何在Docker集群上運(yùn)行應(yīng)用程序使之成為一個(gè)真正的應(yīng)用集群

注意: Compose文件定義了如何在Docker中運(yùn)行應(yīng)用,并能夠使用Docker Cloud上傳到云服務(wù)提供方。

總結(jié)

本節(jié)使用到的部分命令如下:

docker stack ls #列出應(yīng)用或stacks
docker stack deploy -c <composefile> <appname> #運(yùn)行指定的compose文件
docker service ls #使用指定的應(yīng)用名稱列出所有的服務(wù)信息
docker service ps <service> #使用指定的應(yīng)用名稱列出任務(wù)信息
docker inspect <tack or container> #檢查任務(wù)和容器的信息
docker container ls -q #列出容器的id信息
docker stack rm <appname> #停止應(yīng)用
docker swarm leave --force #從管理端關(guān)閉一個(gè)單節(jié)點(diǎn)的集群

了解更多

  • 微信公眾號(hào)搜索“懶得糊涂個(gè)人工作室”了解更多
  • 博客網(wǎng)站地址:http://www.403studio.com
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容