要求
- Docker安裝版本在1.13或以上
- 安裝Docker Compose赁豆。如果是安裝的Docker for Mac和Docker for Windows冗美,那么Docker Compose會一起安裝。在Linux系統(tǒng)上需要直接進行安裝粉洼。如果是在不支持Hyper-v的Windows10以前的操作系統(tǒng),可以使用Docker Toolbox進行安裝
- 已完成Docker入門,Part1的閱讀學(xué)習(xí)
- 學(xué)會如何創(chuàng)建容器属韧,完成Docker入門,Part2的學(xué)習(xí)
- 確保已根據(jù)Docker入門去扣,Part2的知識點樊破,將提到的friendlyhello鏡像上傳推送到你的倉庫注冊地址唆铐。在本節(jié)我們將會用到這個鏡像
- 確保鏡像能夠已經(jīng)能夠在本機作為一個部署的容器運行
docker run -p 4000:80 username/repo:tag
說明介紹
在本節(jié),我們將擴展我們的應(yīng)用艾岂,并實現(xiàn)負載均衡。為了實現(xiàn)這個目的王浴,我們必須在分布式應(yīng)用程序的層次結(jié)構(gòu)中上升到更高一級:服務(wù)
- Stack(堆棧)
- Services(服務(wù),本節(jié)內(nèi)容)
- Container(容器秒裕,在Part2中介紹的相關(guān)概念)
關(guān)于服務(wù)
在分布式應(yīng)用中钞啸,應(yīng)用的不同部分(組件)稱為服務(wù)喇潘。例如梭稚,如果搭建一個視頻分享網(wǎng)站的應(yīng)用,我們這個應(yīng)用就可能會包含一個存儲應(yīng)用數(shù)據(jù)的數(shù)據(jù)庫服務(wù)弧烤,一個在后臺負責處理用戶上傳的視頻轉(zhuǎn)碼的服務(wù)以及一個負責處理前后端業(yè)務(wù)的服務(wù)等。
服務(wù)在生產(chǎn)環(huán)境中就是各類容器暇昂。一個服務(wù)只基于一個鏡像運行,但是它能夠控制對外暴露的端口信息脏毯,能夠控制運行多少個容器的副本以確保該服務(wù)能夠滿足業(yè)務(wù)性能的要求等幔崖。通過擴展服務(wù)能夠改變應(yīng)用中這部分容器實例運行的數(shù)量,能夠分配更多的計算資源給這個服務(wù)赏寇。
在Docker平臺擴展服務(wù)是一件非常容易的事情,僅僅只需要編寫docker-compose.yml文件嗅定。
第一個docker-compose.yml文件
docker-compose.yml采用YAML文件格式定義了在環(huán)境中容器的行為。
將下文提到的內(nèi)容保存到docker-compose.yml并將該文件保存在合適的位置忙迁。這個地方需要確保我們在Part2中的鏡像已經(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í)行以下的動作
- 從公共倉庫注冊地拉取在Part2上傳的鏡像 username/repo:tag
- 運行這個鏡像的5個實例作為名為web的服務(wù),并限制每個實例的資源使用情況恰梢,最多10%的CPU使用已經(jīng)50M的內(nèi)存
- 在遇到錯誤停止時梗掰,立即重啟容器
- 將主機的4000端口映射到web服務(wù)的80端口
- 指定web服務(wù)的容器通過一個名為webnet的負載均衡的網(wǎng)絡(luò)共享80端口(在服務(wù)內(nèi)部,容器會使用一個臨時的端口對應(yīng)到web服務(wù)的80端口)
- 使用默認的配置定義webnet網(wǎng)絡(luò)(默認方式是負載均衡的網(wǎng)絡(luò))
運行新的負載均衡的應(yīng)用
在使用docker stack deploy
前及穗,我們首先需要運行docker swarm init
注意: 在Part4我們將學(xué)習(xí)到這些命令。如果不運行
docker swarm init
那么會在執(zhí)行時報錯"this node is not a swarm manager"
至此埂陆,我們就可以運行我們的命令尘分,我們需要給應(yīng)用命名(這里使用getstartedlab):
docker stack deploy -c docker-compose.yml getstartedlab
這樣由運行在鏡像上的5個容器實例組成的單一服務(wù)的應(yīng)用就啟動起來了丸氛。通過docker service ls
查看所有的服務(wù),查找到以應(yīng)用名稱為前綴的web服務(wù)的信息定续。如果是使用的上文提到
的名稱命名的話禾锤,那么服務(wù)名稱就是getstartedlab_web私股。同時我們也能夠看到服務(wù)的ID恩掷、副本的數(shù)量、鏡像名稱以及端口信息峭状。
在服務(wù)中一個單獨運行的容器就叫做task(任務(wù))逼争。每個任務(wù)都會有一個根據(jù)副本的數(shù)量自增的唯一ID优床,通過docker service ps getstartedlab_web
可以查看到服務(wù)的任務(wù)信息誓焦。
在終端可以多次運行curl -4 http://localhost:4000
,或者在瀏覽器中打開頁面并每隔幾秒鐘進行刷新移层,仔細觀察會發(fā)小頁面的信息會變化赫粥,變化的值實際上是容器的ID。這說明每次提供服務(wù)的容器是不同的傅是,實現(xiàn)了一個簡單的負載均衡的效果蕾羊。
擴展應(yīng)用
我們可以通過修改docker-compose.yml里的replicas的值來擴展應(yīng)用,保存修改龟再,然后重新運行docker stack deploy
命令
docker stack deploy -c docker-compose.yml getstartedlab
Docker實現(xiàn)了熱更新,不需要首先停止服務(wù)或者關(guān)閉容器浆劲。運行完上面的命令后,接著運行docker container ls -q
可以看到變化的情況牌借。如果你是增加了副本的數(shù)量,那么更多的任務(wù)膨报,更多的容器被啟動了
停止應(yīng)用和集群
- 使用
docker stack rm
來停止應(yīng)用,docker stack rm getstartedlab
- 使用
docker swarm leave --force
關(guān)閉集群
使用Docker來啟動和擴展應(yīng)用是一件非常簡單的事情院领。通過上面的介紹和前面幾篇文章的學(xué)習(xí)够吩,已經(jīng)了解了很多在生產(chǎn)環(huán)境運行容器的知識。接下來周循,我們將繼續(xù)學(xué)習(xí)如何在Docker集群上運行應(yīng)用程序使之成為一個真正的應(yīng)用集群
注意: Compose文件定義了如何在Docker中運行應(yīng)用,并能夠使用Docker Cloud上傳到云服務(wù)提供方拟烫。
總結(jié)
本節(jié)使用到的部分命令如下:
docker stack ls #列出應(yīng)用或stacks
docker stack deploy -c <composefile> <appname> #運行指定的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)閉一個單節(jié)點的集群
了解更多
- 微信公眾號搜索“懶得糊涂個人工作室”了解更多
- 博客網(wǎng)站地址:http://www.403studio.com