Docker Swarm結(jié)合Docker Compose部署集群的實(shí)現(xiàn)
docker swarm 結(jié)合 docker-compose.yml 部署集群
1 )準(zhǔn)備 docker-compose.yml的文件, 示例 demo 如下
version: "3" services: mysql_c: image: mysql environment: MYSQL_ROOT_PASSWORD: 123456 restart: always ports: - 3306:3306 volumes: - /root/mysql/conf.d:/etc/mysql/conf.d - /root/mysql/data:/var/lib/mysql goweb1: image: gowebimg restart: always deploy: replicas: 6 # 副本數(shù)量 resources: # 資源 limits: # 配置cpu cpus: "0.3" # 設(shè)置該容器最多只能使用 30% 的 CPU memory: 500M # 設(shè)置該容器最多只能使用 500M內(nèi)存 restart_policy: # 定義容器重啟策略, 用于代替 restart 參數(shù) condition: on-failure # 只有當(dāng)容器內(nèi)部應(yīng)用程序出現(xiàn)問(wèn)題才會(huì)重啟 depends_on: - mysql_c nginx: image: nginx restart: always ports: - 80:80 depends_on: - goweb1 volumes: - /root/nginx/conf.d/:/etc/nginx/conf.d deploy: replicas: 6 #副本數(shù)量 resources: #資源 limits: #配置cpu cpus: "0.3" # 設(shè)置該容器最多只能使用 30% 的 CPU memory: 500M # 設(shè)置該容器最多只能使用 500M內(nèi)存 restart_policy: # 定義容器重啟策略, 用于代替 restart 參數(shù) condition: on-failure #只有當(dāng)容器內(nèi)部應(yīng)用程序出現(xiàn)問(wèn)題才會(huì)重啟
- 基于 docker-compose可以在一臺(tái)服務(wù)器上創(chuàng)建多個(gè)容器
- 想在多臺(tái)服務(wù)器上一次創(chuàng)建多個(gè)容器, 需要結(jié)合 Swarm
- $
docker stack deploy --compose-file docker-compose.yml swarmName
- swarmName是我們的swarm對(duì)應(yīng)的名稱,可以自行隨意配置, 比如 goWebSwarm
- $
- 以上配置的問(wèn)題是 mysql 沒(méi)有進(jìn)行集群
- mysql 需要單獨(dú)搭建集群,這里涉及到主從數(shù)據(jù)庫(kù)
- 為了方便起見(jiàn),直接配置到了 yml 文件里
- 這里mysql的副本數(shù)量不能配置多個(gè)
- 如果多個(gè),就會(huì)運(yùn)行在多臺(tái)服務(wù)器上,會(huì)出現(xiàn)數(shù)據(jù)異常和不一致的問(wèn)題
2 )搭建集群
- $
docker swarm init --advertise-addr 192.168.1.10
初始化集群并創(chuàng)建管理節(jié)點(diǎn)(當(dāng)前指定的ip為管理節(jié)點(diǎn))- 填入自己主機(jī)的ip
- $
docker swarm join --token SWMTKN-1-52tr219htvsg1volky2tej7pj8bjs2j78q4b6wc9fnt72kkchd-29ohn4mgz191f6oznldvjiw47 192.168.1.10:2377
- 其他主機(jī)加入集群
- 根據(jù) yml 文件,這里的集群是 nginx 和 goweb的集群,它們都有6個(gè)副本,mysql 服務(wù)只有一個(gè)副本
3 )部署和驗(yàn)證
- $
docker stack deploy --compose-file docker-compose.yml goWebSwarm
開始部署服務(wù)- 調(diào)用這個(gè)命令的時(shí)候,首先創(chuàng)建了網(wǎng)絡(luò)
- 接著創(chuàng)建3個(gè)服務(wù)
- 這3個(gè)服務(wù)使用了同一個(gè)網(wǎng)絡(luò),默認(rèn)這三個(gè)服務(wù)可以直接連通
- $
docker service ls
可查看當(dāng)前運(yùn)行起來(lái)的服務(wù) - $
docker service ps goWebSwarm
查看當(dāng)前某個(gè)服務(wù) - 通過(guò) docker-compose 部署,可見(jiàn)生成了3個(gè)服務(wù),這三個(gè)服務(wù),使用了同一個(gè)網(wǎng)絡(luò)
- 這里同樣存在之前的,mysql服務(wù)啟動(dòng)了,接著goWeb服務(wù)也啟動(dòng),但是mysql服務(wù)并沒(méi)有完全可用的狀態(tài)
- 可以用之前的腳本解決
- 可以重啟 goWeb項(xiàng)目 (或擴(kuò)容,縮容來(lái)重啟)
- 可以先單獨(dú)部署 mysql的集群,之后再部署 goWeb 和 Nginx 服務(wù)
- 這種就不屬于這里的集群了,mysql集群作為一項(xiàng)單獨(dú)的集群
- goWeb應(yīng)用的配置文件也要對(duì)應(yīng)同步修改
4 )配置部署額外的一臺(tái)Nginx服務(wù)器(非集群內(nèi))
- 額外的NG服務(wù)器,用于做路由和轉(zhuǎn)發(fā)到集群內(nèi)的nginx服務(wù)器
- 在集群內(nèi)的各個(gè)主機(jī)磁盤上都有 /root/nginx/conf.d/ 目錄中都有一個(gè) default.conf 文件
upstream backend { ip_hash; server goweb1:8080; # 這里是 goweb1 容器服務(wù)的host別名 } server { listen 80; server_name localhost; # 你的域名地址 location / { # 設(shè)置主機(jī)頭和客戶端真實(shí)地址,以便服務(wù)器獲取客戶端真實(shí)IP # 禁用緩存 proxy_buffering off; # 反向代理的地址 proxy_pass http://backend; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
- 當(dāng)訪問(wèn)這個(gè)時(shí),nginx將 80 轉(zhuǎn)發(fā)到 8080
- 現(xiàn)在,我們要配置nginx的主機(jī),也就是轉(zhuǎn)發(fā)到集群內(nèi),進(jìn)行負(fù)載均衡的配置
upstream backend { ip_hash; server 192.168.1.10 weight=1; # 集群內(nèi)的服務(wù) ip 這里有一臺(tái) nginx服務(wù)器 server 192.168.1.11 weight=1; server 192.168.1.12 weight=1; server 192.168.1.13 weight=1; } server { listen 80; server_name goweb.xxxx.com; # 你的域名地址 這里本機(jī)可以配置 host, 如果在服務(wù)器配置 域名解析 add_header backendCode $upstream_status; add_header BackendIP "$upstream_addr;" always; location / { # 設(shè)置主機(jī)頭和客戶端真實(shí)地址,以便服務(wù)器獲取客戶端真實(shí) IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # nginx服務(wù)器與被代理服務(wù)連接超時(shí)時(shí)間,代理超時(shí),請(qǐng)求一臺(tái)超過(guò)1s就會(huì)轉(zhuǎn)發(fā)到其他ip proxy_connect_timeout 1s; # 禁用緩存 proxy_buffering off; # 反向代理的地址 proxy_pass http://backend; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
- 上面用于查看nginx服務(wù)器轉(zhuǎn)發(fā)節(jié)點(diǎn)的配置
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- 加上這個(gè),在瀏覽器中可以看到轉(zhuǎn)發(fā)的服務(wù)器,在響應(yīng)表頭,會(huì)有一個(gè)
BackendIP
的字段
- 啟動(dòng) nginx 主機(jī)
- $
docker run -itd --name nginxweb -p 80:80 -v /root/nginx/conf.d:/etc/nginx/conf.d nginx
- $
5 )整體架構(gòu)如下
第一層 )nginx 服務(wù)器接收到請(qǐng)求后轉(zhuǎn)發(fā)到集群中的各臺(tái)主機(jī)上
- 這里是最外面的一層 nginx 作為負(fù)載均衡
- 這臺(tái)nginx服務(wù)器是一臺(tái)高性能服務(wù)器,只負(fù)責(zé)轉(zhuǎn)發(fā),沒(méi)有其他處理任務(wù)
第二層 )集群里面有各類服務(wù)
- nginx goWeb
- goWeb 連接到 mysql 或 mysql集群服務(wù)
- nginx goWeb
- 同上
- nginx goWeb
- 同上
- …
- 這個(gè)集群內(nèi)部的nginx服務(wù)會(huì)動(dòng)態(tài)負(fù)載均衡到各個(gè)goWeb服務(wù)
- nginx goWeb
第三層 )mysql 或 mysql集群
- 目前我們的mysql 只有一臺(tái)服務(wù),并且配置在compose文件里
以上三個(gè)層,是我們服務(wù)端一般的設(shè)計(jì)方案,當(dāng)然上面沒(méi)用到 mysql 集群
以上架構(gòu)可支持 100W 的訪問(wèn)量 (使用mysql集群)
如果需要負(fù)載更多, 可把這套架構(gòu)復(fù)制到多個(gè)城市地區(qū)
- 一般情況下,域名解析只能配置到一臺(tái)服務(wù)器
- 當(dāng)然,有個(gè)動(dòng)態(tài)域名解析,可以支持多臺(tái)
- 這樣就可以根據(jù)請(qǐng)求判斷轉(zhuǎn)發(fā)到那些服務(wù)器
關(guān)于 Docker Swarm 的 Raft 一致性算法
- Raft:一致性算法,在保證大多數(shù)管理節(jié)點(diǎn)存活的情況下,集群才能使用
- 所以就要求如果集群的話,manager節(jié)點(diǎn)必須 >=3 臺(tái)
- manager: 管理節(jié)點(diǎn),用于管理工作節(jié)點(diǎn)
- 如果是兩個(gè)臺(tái),其中一臺(tái)宕機(jī),剩余的一臺(tái)也將不可用,以致整個(gè)集群不可用
- 為了利用 swarm 模式的容錯(cuò)特性,Docker 建議您根據(jù)組織的高可用性要求實(shí)現(xiàn)奇數(shù)個(gè)節(jié)點(diǎn)
- 當(dāng)您有多個(gè)管理器時(shí),您可以從管理器節(jié)點(diǎn)的故障中恢復(fù)而無(wú)需停機(jī)
- 一個(gè)3管理器群最多可以容忍1名管理器的損失
- 一個(gè)5管理器群最多可以同時(shí)丟失2個(gè)管理器節(jié)點(diǎn)
- 一個(gè)N管理器集群最多可以容忍丟失 (N - 1) / 2 管理器
- Docker 建議一個(gè)Swarm集群最多使用7個(gè)管理器節(jié)點(diǎn)
到此這篇關(guān)于Docker Swarm結(jié)合Docker Compose部署集群的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Docker Swarm結(jié)合Docker Compose集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker中nginx的默認(rèn)路徑位置和映射目錄啟動(dòng)方式
這篇文章主要介紹了docker中nginx的默認(rèn)路徑位置和映射目錄啟動(dòng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08關(guān)于docker?cgroups資源限制的問(wèn)題
cgroups是一個(gè)非常強(qiáng)大的linux內(nèi)核工具,他不僅可以限制被namespace隔離起來(lái)的資源,還可以為資源設(shè)置權(quán)重、計(jì)算使用量,這篇文章主要介紹了docker?cgroups資源限制,需要的朋友可以參考下2022-09-09使用Docker Compose創(chuàng)建LAMP環(huán)境的詳細(xì)步驟
現(xiàn)如今,通過(guò) Docker 容器化部署環(huán)境已經(jīng)逐漸成為主流,特別是在部署像 LAMP 這樣的復(fù)雜環(huán)境時(shí),本教程旨在帶您完成使用 Docker-Compose 建立 LAMP 環(huán)境的整個(gè)過(guò)程,同時(shí)還包括定制 PHP 環(huán)境的步驟,需要的朋友可以參考下2024-12-12基于Docker部署Tomcat集群、 Nginx負(fù)載均衡的問(wèn)題小結(jié)
這篇文章主要介紹了基于Docker部署 Tomcat集群、 Nginx負(fù)載均衡,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09Docker動(dòng)態(tài)給容器Container暴露端口操作
這篇文章主要介紹了Docker動(dòng)態(tài)給容器Container暴露端口操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11Docker部署.NET6項(xiàng)目的實(shí)現(xiàn)步驟
Docker是現(xiàn)在比較流行的開源容器引擎,有了它讓我們部署和維護(hù)系統(tǒng)更加方便,本文主要介紹了Docker部署.NET6項(xiàng)目,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12淺談docker Dockerfile 指令 VOLUME 介紹
本篇文章主要介紹了淺談docker Dockerfile 指令 VOLUME 介紹 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02docker-compose 配置spring環(huán)境的方法步驟
這篇文章主要介紹了docker-compose 配置spring環(huán)境的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11