谁说docker-compose不能水平扩展容器、服务多实例?
雖說我已經(jīng)從docker-compose走上了docker swarm的邪門歪道,目前被迫走在k8s這條康莊大道, 但是我還是喜歡docker-compose簡潔有效的部署方式。
?曾其何時
docker-compose非常適合開發(fā)、測試、快速驗證原型,這個小工具讓單機部署容器變得簡潔、高效。正如我在《docker-compose,docker-stack前世今生》里講,所有人都認為docker-compose是單機部署多容器的瑞士軍刀,沒有docker stack由deploy配置節(jié)體現(xiàn)的生產(chǎn)特性(多實例、滾動部署、故障重啟、負載均衡)。
最近我發(fā)現(xiàn)我錯了:docker-compose還是具備服務多實例的能力的。
?在docker-compose -h中發(fā)現(xiàn)了一個scale參數(shù),這是個啥?
docker-compose還能水平擴展,實現(xiàn)多容器?
docker-compose定義的容器映射的主機端口不會沖突嗎?
號主精心分析,才找到一個完備的理論來支持scale參數(shù)的合理性。在此文中,我們將演示一個示例,說明如何使用Docker Compose運行服務的多實例
version: "3" services:webapp:image: "luksa/kubia"depends_on:- dbports:- "8080:8080" # 主機Port: 容器暴露Port在此文件中,我們定義了一個webapp服務(nodejs程序在8080端口監(jiān)聽)
為webapp容器定義了端口映射:從容器8080端口映射到主機的8080端口,這樣我們可以在主機上使用http://localhost:8080URL訪問服務器。
Docker Compose --scale flag
當我們運行docker-compose up -h命令時, 其中--scale選項顯示為服務指定多實例
--scale SERVICE=NUM Scale SERVICE to NUM instances. Overrides the`scale` setting in the Compose file if present.很顯然,使用目前的DockerCompose配置運行docker-compose up --scale webapp=3
將導致failed: port is already allocated錯誤:
問題在于,我們試圖運行webapp服務的三個實例,并將它們?nèi)坑成涞街鳈C同一端口,而「主機的8080端口只能綁定給一個容器」。
解決錯誤的一種方法是將Docker Compose文件中的端口映射更改為- "8080", 這會將容器的端口8080暴露給主機上的臨時未分配端口。
這個操作延伸出另一個問題:在啟動容器之前,我們將不知道用于訪問服務的端口。
要列出端口映射,請在運行docker-compose up --scale webapp=3之后運行docker-compose ps來查看容器:
添加負載均衡器
為了能夠在不知道特定容器的端口的情況下訪問webapp服務,并使用負載均衡機制將請求分發(fā)到容器,我們需要在容器堆棧中添加負載均衡器。
在此示例中,將使用nginx作為負載均衡器:來完成對外接收、對內(nèi)轉發(fā)。在與docker-compose.yml文件相同的目錄中創(chuàng)建以下nginx.conf文件,代理&轉發(fā)請求
user nginx; events {worker_connections 1000; } http {server {listen 80;location / {proxy_pass http://webapp:8080;}} }這將配置nginx將請求從主機端口80轉發(fā)到 http://webapp:8080。然后將由Docker’s embedded DNS解決尋址:該DNS服務器使用輪詢實現(xiàn)來根據(jù)服務名稱解析DNS請求,并將其分發(fā)給Docker容器。
?由于nginx服務負責對外接收請求、對內(nèi)轉發(fā),因此webapp服務可不直接對外暴露。實際上我們可以從Docker Compose文件中刪除webapp端口映射配置,而僅將端口8080通知給鏈接的nginx服務。
?version: "3" services:webapp:image: "luksa/kubia"nginx:image: nginx:latestvolumes:- type: bindsource: /home/root/test/nginx.conftarget: /etc/nginx/nginx.confdepends_on:- webappports:- "80:80"通過此配置,我們現(xiàn)在可以利用Docker Compose工具的scale水平擴展、實現(xiàn)服務多實例。docker-compose up ?-d --scale ?webapp=3
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05b024964274 luksa/kubia "node app.js" 15 minutes ago Up 15 minutes test_webapp_1 2fb56a22810a luksa/kubia "node app.js" 15 minutes ago Up 15 minutes test_webapp_3 84041c727b6e luksa/kubia "node app.js" 15 minutes ago Up 15 minutes test_webapp_2 3882beae8b56 nginx:latest "nginx -g 'daemon of…" 15 minutes ago Up 15 minutes 0.0.0.0:80->80/tcp test_nginx_1總結輸出
docker-compose利用Docker引擎內(nèi)嵌DNS,提煉出水平擴展容器、服務多實例的能力 (用一個代理就能應用這個能力)
Docker引擎內(nèi)嵌DNS也是docker-compose利用服務名發(fā)現(xiàn)其他容器的關鍵
在需要測試具備水平擴展能力的web服務時,docker-compose up -d --scale 提供了一種快速、簡便的途徑。
以后誰再說docker-compose沒有水平擴展容器、服務多實例的時候,就把這篇文章丟給他。
https://pspdfkit.com/blog/2018/how-to-use-docker-compose-to-run-multiple-instances-of-a-service-in-development/#
https://docs.docker.com/engine/userguide/networking/configure-dns/
總結
以上是生活随笔為你收集整理的谁说docker-compose不能水平扩展容器、服务多实例?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 流传在程序员中的传说,你知道几个?
- 下一篇: 以Blog.Core的方式来打开Abp.