一般構(gòu)建部署
以一個簡單的前后端項目來說,分別編寫前后端的 Dockerfile
文件并構(gòu)建鏡像,然后編寫 docker-compose.yml
構(gòu)建部署,啟動運行。每次代碼變更后都需重新手動打包、構(gòu)建、推送。
一個簡單的例子:
- 前端:
- 項目名:kubemanagement-web
- 技術(shù)棧:Vue
- 后端:
- 項目名:kubemanagement
- 技術(shù)棧:Golang
tips: 不同語言對應(yīng)的構(gòu)建邏輯編寫不同。關(guān)于 Dockerfile 以及 docker-compose 如何編寫,請查閱官方文檔,此處不在贅述。
1. 編寫前端 Dockerfile 文件:
#第一階段構(gòu)建
FROM node:16.13.2 as builder
WORKDIR /app/kubemanagement-web
COPY . .
RUN npm config set registry https://registry.npmmirror.com
RUN npm install
# 開始構(gòu)建
RUN npm run build:prod
# 第二階段構(gòu)建
FROM nginx
COPY --from=builder /app/kubemanagement-web/dist/ /usr/share/nginx/html/
COPY --from=builder /app/kubemanagement-web/default.conf.template /etc/nginx/templates/default.conf.template
EXPOSE 80
2. 編寫后端 Dockerfile 文件:
FROM golang:1.20-alpine3.16 as builder
WORKDIR /go/src/kubemanagement.com/server
COPY . .
RUN go env -w GO111MODULE=on \
&& go env -w GOPROXY=https://goproxy.cn,direct \
&& go env -w CGO_ENABLED=0 \
&& go env \
&& go mod tidy \
&& go build -o server .
FROM alpine:latest
LABEL MAINTAINER="zj20162325@163.com"
WORKDIR /go/src/kubemanagement.com/server
COPY --from=0 /go/src/kubemanagement.com/server/config.yaml ./config.yaml
COPY --from=0 /go/src/kubemanagement.com/server/.kube/config ./.kube/config
COPY --from=0 /go/src/kubemanagement.com/server/server ./
EXPOSE 8082
ENTRYPOINT ./server
3. 分別構(gòu)建鏡像:
- 前端
docker build -t harbor.kubemanagement.com/kubemanagement/kubemanagement-web:v1.0 .
- 后端
docker build -t harbor.kubemanagement.com/kubemanagement/kubemanagement:v1.0 .
結(jié)果如下:
如果需要推送鏡像,比如推送到私有 Harbor 倉庫,可執(zhí)行:
docker push harbor.kubemanagement.com/kubemanagement/kubemanagement-web:v1.0
docker push harbor.kubemanagement.com/kubemanagement/kubemanagement:v1.0
Harbor 的搭建可參考 微服務(wù) & 云原生:搭建 Harbor 私有鏡像倉庫。
4. 編寫 docker-compose.yml 文件:
version: "3"
networks:
network:
ipam:
driver: default
config:
- subnet: '177.7.0.0/16'
services:
web:
container_name: kubemanagement-web
image: harbor.kubemanagement.com/kubemanagement/kubemanagement-web:v1.0
restart: always
environment:
BACKEND_HOST: 'http://177.7.0.12:8082/'
ports:
- '8081:80'
depends_on:
- server
networks:
network:
ipv4_address: 177.7.0.11
server:
container_name: kubemanagement-server
image: harbor.kubemanagement.com/kubemanagement/kubemanagement:v1.0
restart: always
ports:
- '8082:8082'
networks:
network:
ipv4_address: 177.7.0.12
使用 docker-compose 自動完成包括構(gòu)建鏡像,創(chuàng)建服務(wù),啟動服務(wù),并關(guān)聯(lián)服務(wù)相關(guān)容器的一系列操作:
docker-compose up -d
結(jié)果如下:
此時通過相應(yīng) ip:port 即可訪問頁面,示例頁面如下:
使用 Gogs & Drone 持續(xù)集成
Gogs
編寫 gogs 的 docker-compose.yml 文件
version: "3"
volumes:
gogsdata:
services:
gogs:
container_name: gogs
image: gogs/gogs:0.12.10
volumes:
- gogsdata:/data
restart: always
ports:
- '10880:3000'
執(zhí)行:
docker-compose up -d
結(jié)果如下:
通過 10880 端口訪問:
數(shù)據(jù)庫根據(jù)需求來選,這里選擇最輕量級的 SQLite3 作為演示,其他配置項可以默認(rèn),由于編寫 docker-compose.yml 時做了端口映射,主要修改域名、端口號,如下:
編寫完可選配置后點擊立即安裝,我這里就簡單設(shè)置管理員信息:
gogs 的使用與 git 基本一致,簡單創(chuàng)建一個倉庫并提交信息:
Drone
編寫 docker-compsoe.yml 文件:
version: "3"
volumes:
dronedata:
services:
drone-server:
image: drone/drone:2
container_name: drone-server
environment:
DRONE_AGENTS_ENABLED: "true"
DRONE_GOGS_SERVER: "http://192.168.65.134:10880"
# openssl rand -hex 16 生成, server 與 runner 的 DRONE_RPC_SECRET 設(shè)置相同
DRONE_RPC_SECRET: "02cfbfe91f999c6f334158f4cf737490"
DRONE_SERVER_HOST: "192.168.65.134:9080"
DRONE_SERVER_PROTO: "http"
# 必須是管理員身份,方便后續(xù)的配置選項等操作
DRONE_USER_CREATE: "username:BetaCatPro,admin:true"
volumes:
- dronedata:/data
restart: always
ports:
- '9080:80'
- '9443:443'
drone-runner:
image: drone/drone-runner-docker:1
container_name: drone-runner
environment:
DRONE_RPC_SECRET: "02cfbfe91f999c6f334158f4cf737490"
DRONE_RPC_HOST: "192.168.65.134:9080"
DRONE_RPC_PROTO: "http"
DRONE_RUNNER_CAPACITY: "2"
DRONE_RUNNER_NAME: "first-runner"
volumes:
- /etc/docker/:/etc/docker
- /var/run/docker.sock:/var/run/docker.sock
restart: always
ports:
- '3000:3000'
depends_on:
- drone-server
部分參數(shù)說明:
- DRONE_GOGS_SERVER : Gogs 服務(wù)地址(需要http://開頭)
- DRONE_RPC_SECRET: Drone 服務(wù)密匙(runner 也要使用相同密鑰)
- DRONE_SERVER_HOST: Drone 服務(wù)地址,外部可訪問的域名或IP地址
- DRONE_SERVER_PROTO: Drone提供服務(wù)的協(xié)議類型,可選為 http 或 https
- DRONE_USER_CREATE: 設(shè)置Drone管理員賬號(是Gogs平臺里的賬號)
執(zhí)行 :
docker-compose up -d
結(jié)果:
瀏覽器訪問 ip:port:
登錄用戶名密碼為上一步注冊 gogs 時所用的,登錄成功進(jìn)入主頁:
這里會顯示 gogs 中創(chuàng)建的代碼倉庫列表。
流水線配置
激活鉤子
進(jìn)入 drone 相應(yīng)倉庫頁面,點擊 ACTIVATE REPOSITORY 按鈕,激活鉤子:
激活后可以看到一些設(shè)置項,注意一定要把 Trusted
選型勾選,否則在后續(xù)編寫鉤子文件定義掛載操作時會出現(xiàn)下面錯誤:
Drone untrusted repositories cannot mount host volumes
進(jìn)入到 gogs 中相應(yīng)倉庫,點擊倉庫設(shè)置:
可以看到管理的 Web 鉤子:
編寫 .drone.yml 鉤子文件
在項目根目錄下編寫 .drone.yml 文件,用于定義觸發(fā) git 提交時的一系列操作,這里以文章開頭描述的 kubemanagement-web 前端項目為例:
kind: pipeline
type: docker
name: kubemanagement-web-publish
environment:
GOOS: linux
GOARCH: amd64
steps:
- name: build
image: plugins/docker
volumes:
- name: hosts
path: /etc/hosts
- name: docker-ca
path: /etc/docker
- name: dockersock
path: /var/run/docker.sock
settings:
username: admin
password:
# 注意在 drone 頁面的 Secrets 添加對應(yīng)配置
from_secret: harbor_password
repo: harbor.kubemanagement.com/kubemanagement/kubemanagement-web
registry: harbor.kubemanagement.com
tags:
- v1.1
- name: ssh commands
image: appleboy/drone-ssh
settings:
host: 192.168.65.134
username: root
password:
# 注意在 drone 頁面的 Secrets 添加對應(yīng)配置
from_secret: ssh_password
port: 22
script:
#拉取鏡像并重啟 注意--需要提前在目標(biāo)主機完成docker login
- if [ $(docker ps -a | grep kubemanagement-web | wc -l) -ge 1 ];then docker stop kubemanagement-web && docker rm kubemanagement-web; fi
- docker pull harbor.kubemanagement.com/kubemanagement/kubemanagement-web:v1.1
- export BACKEND_HOST=http://192.168.65.134:8082/
- docker run --name kubemanagement-web --restart=always -d -p8081:80 -e BACKEND_HOST=$BACKEND_HOST harbor.kubemanagement.com/kubemanagement/kubemanagement-web:v1.1
volumes:
- name: hosts
host:
path: /etc/hosts
- name: docker-ca
host:
path: /etc/docker
- name: dockersock
host:
path: /var/run/docker.sock
然后在 drone 頁面的 Secrets 添加對應(yīng)配置,這里按照 .drone.yml 文件中使用到的有 harbor_password 和 ssh_password,value 分別為對應(yīng)平臺的密碼,我這里 harbor 的密碼為123456,gogs 密碼為 by6671715,分別添加即可:
編寫好文件后,可進(jìn)行代碼提交。不過還需要查看 gogs 的配置文件中有沒有將 ip 加入到白名單中,如果有多個 ip 則用 ,
分隔。我這里 ip 為 192.168.65.134。具體配置如下:
- 首先查看 gogs 掛載的卷,查看 Mounts 里 Source 的內(nèi)容(注意,時下圖箭頭指向的位置),配置文件即在此目錄下:
docker inspect gogs
cd /var/lib/docker/volumes/gogs_gogsdata/_data
cd gogs/conf
vim app.ini
- 在 security 處加上配置:
LOCAL_NETWORK_ALLOWLIST = 192.168.65.134
3. 重啟 gogs
# 返回存放 gogs 的 docker-compose.yml 的目錄
docker-compose restart
如果沒有配置,還繼續(xù)提交代碼的話,會出現(xiàn)下面情況:
可以看到,雖然提交成功,但點擊倉庫設(shè)置
,進(jìn)入管理 Web 鉤子
項,點擊存在的鉤子,如 http://192.168.65.134:9080/hook
,可以看到:
鉤子并沒有生效,并報錯:文章來源:http://www.zghlxwxcb.cn/news/detail-632035.html
Payload URL resolved to a local network address that is implicitly blocked.
提交代碼,觸發(fā) Hooks
成功提交代碼,并觸發(fā)鉤子后,gogs 頁面中顯示成功信息:
drone 頁面信息如下:
點擊進(jìn)入,可以在 GRAPH VIEW
查看詳細(xì)進(jìn)度及日志:
可以看到目前處于 build 階段。完全構(gòu)建完成后,頁面如下:
harbor 頁面中對應(yīng)的鏡像版本也推送成功:文章來源地址http://www.zghlxwxcb.cn/news/detail-632035.html
到了這里,關(guān)于微服務(wù) & 云原生:基于 Gogs + Drone 進(jìn)行項目 CI/CD的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!