docker stack滾動更新web應用
滾動更新是我們線上上發行版本常用的方式之一,Swarm 將按照如下步驟執行滾動更新:
- 停止第一個副本。
- 排程任務,選擇 worker node。
- 在 worker 上用新的映象啟動副本。
- 如果副本(容器)執行成功,繼續更新下一個副本;如果失敗,暫停整個更新過程。
滾動更新降低了應用更新的風險,如果某個副本更新失敗,整個更新將暫停,其他副本則可以繼續提供服務。同時,在更新的過程中,總是有副本在執行的,因此也保證了業務的連續性。
基於已經搭建好的swarm mode環境:搭建swarm mode
1.新建web服務
在任意檔案下(我這裡是/home/go)新建main.go
package main
import (
"fmt"
"log"
"net/http"
"os"
)
func main() {
http.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request) {
hostName, _ := os.Hostname()
fmt.Fprintf(w, "HostName1: %s", hostName)
})
log.Fatal(http.ListenAndServe(":8000", nil))
}
2.新建Dockerfile
FROM golang
# Copy the current directory contents into the container
COPY . /go/src/github.com/lpxxn/godockerswarm/
WORKDIR /go/src/github.com/lpxxn/godockerswarm/
RUN go build
EXPOSE 8000
CMD ["./godockerswarm"]
3.編譯成映象
docker build . -t goweb:1.0
4.執行新映象並測試
docker run -p 8100:8000 -d goweb:1.0
瀏覽器訪問ip:8100 返回主機資訊
5.將映象打包並推到私有倉庫
docker tag goweb:1.0 192.168.1.101:5000/goweb:1.0 #他跟新映象
docker push 192.168.1.101:5000/goweb:1.0 #推送新映象到私有倉庫
6.編輯docker-compose.yml檔案
還是在go資料夾下編輯:
version: "3"
services:
web:
image: 192.168.1.101:5000/goweb:1.0
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "8111:8000"
networks:
- gowebnet
networks:
gowebnet:
執行service
docker stack deploy -c docker-compose.yml mygoweb
7.在另一臺機器上訪問
在192.168.1.102上執行命令不斷訪問服務:
sh -c "while true; do curl 192.168.1.101:8111/hi&&sleep 1; done"
會列印:
HostName1: cd9d3bf61aabHostName1: 6090c7594f3fHostName1: 6fc0951a708dHostName1: 715b839f3852HostName1: 544318a3749bHostName1: cd9d3bf61aabHostName1: 6090c7594f3fHostName1: 6fc0951a708dHostName1: 715b839f3852HostName1: 544318a3749bHostName1: cd9d3bf61aab
這裡發現swarm叢集還自動做了負載均衡,因為每次訪問的主機名都不同
8.更新映象更新docker-compose.yml實現滾動更新
更新main.go程式碼,就把 fmt.Fprintf(w, "HostName1: %s", hostName)
換成fmt.Fprintf(w, "HostName2: %s", hostName)
使得輸出不同的內容,就HostName1和HostName2的區別
然後重新編譯並且tag映象,上傳到伺服器,修改docker-compose.yml,最後重新啟動服務
vim main.go #修改HostName1為HostName2
docker build . -t goweb:2.0 #編譯映象2.0
docker tag goweb:2.0 192.168.1.101:5000/goweb:2.0 #打包映象2.0
docker push 192.168.1.101:5000/goweb:2.0 #推送映象2.0
vim docker-compose.yml #修改拉取的映象為2.0
docker stack deploy -c docker-compose.yml mygoweb #重新部署
然後過一會發現192.168.1.102機器上面列印了:
HostName1: 6fc0951a708dHostName1: 715b839f3852HostName1: 544318a3749bHostName2: 3f1df083e22fHostName1: 6090c7594f3fHostName1: 6fc0951a708dHostName1: 715b839f3852HostName1: 544318a3749bHostName2: 3f1df083e22fHostName1: 6090c7594f3f
會發現有的主機已經慢慢改為HostName2,過一會就全部變成HostName2
相關文章
- SpringBoot應用零停機滾動更新Spring Boot
- 更新應用時,如何實現 K8s 零中斷滾動更新?K8S
- Web Navigation(stack棧的運用)WebNavigation
- 【轉】Docker部署Tomcat及Web應用DockerTomcatWeb
- 輕鬆部署 Laravel 應用 | 《13. 更新與回滾》Laravel
- AutoEx應用崩潰自動匹配Stack Overflow的解答應用崩潰
- Docker Stack 筆記Docker筆記
- Node.js Web應用程式碼熱更新Node.jsWeb
- [譯] Web 應用的未來:Heroku vs DockerWebDocker
- docker-compose vs docker-stackDocker
- ansible高階操作 serial滾動更新
- Win10 下安裝 docker,部署 Web 應用Win10DockerWeb
- Web APP自動更新WebAPP
- 在滾動更新中使用 Health Check - 每天5分鐘玩轉 Docker 容器技術(146)Docker
- 使用 electron-updater 自動更新應用
- DOCKER應用Docker
- 直播app原始碼,應用elementPlus table並滾動顯示APP原始碼
- 01 . ELK Stack簡介原理及部署應用
- Jenkins + Docker + Gitee自動化部署SpringBoot應用JenkinsDockerGiteeSpring Boot
- scroll-view元件bindscroll例項應用:自定義滾動條View元件
- Docker_Docker應用部署4Docker
- Kubernetes:更新與回滾
- 用 Docker 建立 serverless 應用DockerServer
- Flink的滾動視窗、會話視窗、滑動視窗及其應用會話
- Maven Web 應用MavenWeb
- Docker入門系列之一:在一個Docker容器裡執行指定的web應用DockerWeb
- 使用docker compose一鍵啟動多個應用Docker
- GI PSU滾動方式應用GI HOME和DB HOME(opatch auto together)
- Docker容器:將帶UI的程式直接轉為Web應用,so easyDockerUIWeb
- Flutter 應用熱更新Flutter
- 用Spring Web Flow和Terracotta搭建Web應用SpringWeb
- 基於HTML5的移動Web應用HTMLWeb
- 如何在AWS上自動擴充套件Web應用套件Web
- java應用docker化JavaDocker
- SpringBoot應用Docker化Spring BootDocker
- docker 打包 php 應用DockerPHP
- 應用容器引擎-DockerDocker
- Docker部署Angular應用DockerAngular