基于CentOS的分布式GitLab+Jenkins+Docker架構:企業級CI/CD流水線實戰全記錄

引言:從單機到分布式容器架構的演進

在傳統Web應用部署中,我們常常面臨環境不一致、部署效率低下等問題。我曾經維護過一個需要手動在5臺服務器上重復部署的游戲項目,每次發布都如同走鋼絲。本文將詳細分享如何基于CentOS系統,構建完整的分布式Docker架構,實現GitLab+Jenkins+生產環境的三節點CI/CD流水線,最終成功部署Web游戲項目的全過程。

第一部分:架構設計與環境規劃

1.1 分布式節點規劃

??三節點架構??:

??GitLab節點??:192.168.1.101(4核8G內存,200G存儲)

??Jenkins節點??:192.168.1.102(4核8G內存)

??生產環境節點??:192.168.1.103(8核16G內存,NVIDIA T4 GPU)

# 各節點基礎環境準備(CentOS 7.9)
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker

1.2 網絡拓撲設計

圖:三節點Docker Swarm網絡拓撲

關鍵配置:

使用Overlay網絡實現跨主機容器通信

為每個服務配置獨立的子網

通過Nginx實現服務發現和負載均衡

# 初始化Docker Swarm集群(在生產節點)
docker swarm init --advertise-addr 192.168.1.103# 在其他節點加入集群
docker swarm join --token SWMTKN-1-xxx 192.168.1.103:2377

第二部分:核心組件部署

2.1 GitLab容器化部署(192.168.1.101)

# 創建數據卷目錄
mkdir -p /gitlab/{config,logs,data}# 啟動GitLab容器
docker run -d \--hostname gitlab.example.com \--publish 8443:443 --publish 8080:80 --publish 8022:22 \--name gitlab \--restart always \--volume /gitlab/config:/etc/gitlab \--volume /gitlab/logs:/var/log/gitlab \--volume /gitlab/data:/var/opt/gitlab \--shm-size 256m \gitlab/gitlab-ce:15.11.8-ce.0

性能調優??:

修改/gitlab/config/gitlab.rb

unicorn['worker_processes'] = 4
postgresql['shared_buffers'] = "256MB"
sidekiq['concurrency'] = 10

2.2 Jenkins容器化部署(192.168.1.102)

# 自定義Jenkins Dockerfile
FROM jenkins/jenkins:2.414.3-lts-jdk11
USER root
RUN apt-get update && \apt-get install -y docker.io python3-pip && \pip3 install docker-compose
COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
RUN jenkins-plugin-cli -f /usr/share/jenkins/ref/plugins.txt
USER jenkins
# 啟動Jenkins容器
docker run -d \--name jenkins \-p 8081:8080 -p 50000:50000 \-v /jenkins_home:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \--restart unless-stopped \my-jenkins-image

關鍵插件??:

Docker Pipeline

Blue Ocean

GitLab Plugin

SSH Pipeline Steps

第三部分:Web游戲項目容器化

3.1 游戲架構分析

項目采用前后端分離架構:

?前端??:Unity WebGL構建??

后端??:Node.js游戲服務器

??數據庫??:MongoDB分片集群

??實時通信??:WebSocket

3.2 多服務Docker Compose編排

version: '3.8'services:game-frontend:image: registry.example.com/game-webgl:${TAG}deploy:replicas: 3update_config:parallelism: 1delay: 10srestart_policy:condition: on-failurenetworks:- game-networkgame-server:image: registry.example.com/game-server:${TAG}environment:- NODE_ENV=production- MONGO_URI=mongodb://mongo1:27017,mongo2:27017,mongo3:27017/game?replicaSet=rs0deploy:replicas: 2networks:- game-networkdepends_on:- mongo1- mongo2- mongo3mongo1:image: mongo:5.0command: mongod --replSet rs0 --bind_ip_allvolumes:- mongo1-data:/data/dbnetworks:- game-network# mongo2和mongo3配置類似...nginx:image: nginx:1.23ports:- "80:80"- "443:443"volumes:- ./nginx.conf:/etc/nginx/nginx.confdepends_on:- game-frontend- game-servernetworks:- game-networknetworks:game-network:driver: overlayvolumes:mongo1-data:mongo2-data:mongo3-data:

3.3 Nginx關鍵配置

# nginx.conf
upstream game_servers {server game-server:3000;
}server {listen 80;server_name game.example.com;location / {root /usr/share/nginx/html;try_files $uri /index.html;}location /api {proxy_pass http://game_servers;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}
}

第四部分:CI/CD流水線實現

4.1 GitLab Runner配置

# 在Jenkins節點注冊GitLab Runner
docker run -d --name gitlab-runner \-v /var/run/docker.sock:/var/run/docker.sock \-v /gitlab-runner/config:/etc/gitlab-runner \gitlab/gitlab-runner:v15.11.0docker exec -it gitlab-runner gitlab-runner register

4.2 完整的Jenkinsfile

pipeline {agent {docker {image 'node:18'args '-v $HOME/.npm:/root/.npm'}}environment {DOCKER_REGISTRY = 'registry.example.com'PROJECT = 'web-game'DEPLOY_NODE = '192.168.1.103'SSH_CREDS = credentials('prod-ssh-key')}stages {stage('Checkout') {steps {git branch: 'main', url: 'http://192.168.1.101:8080/game/web-game.git',credentialsId: 'gitlab-cred'}}stage('Build Frontend') {steps {dir('webgl-build') {sh 'npm install'sh 'npm run build'sh 'docker build -t $DOCKER_REGISTRY/$PROJECT-webgl:$BUILD_NUMBER .'}}}stage('Build Server') {steps {dir('server') {sh 'npm install --production'sh 'docker build -t $DOCKER_REGISTRY/$PROJECT-server:$BUILD_NUMBER .'}}}stage('Push Images') {steps {withCredentials([usernamePassword(credentialsId: 'docker-registry',usernameVariable: 'DOCKER_USER',passwordVariable: 'DOCKER_PASS')]) {sh 'echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin $DOCKER_REGISTRY'sh 'docker push $DOCKER_REGISTRY/$PROJECT-webgl:$BUILD_NUMBER'sh 'docker push $DOCKER_REGISTRY/$PROJECT-server:$BUILD_NUMBER'}}}stage('Deploy to Production') {steps {sshagent(['prod-ssh-key']) {sh """ssh -o StrictHostKeyChecking=no ubuntu@$DEPLOY_NODE \"export TAG=$BUILD_NUMBER && \docker stack deploy -c docker-compose.prod.yml game""""}}}}post {failure {slackSend channel: '#game-alerts',message: "構建失敗: ${env.JOB_NAME} #${env.BUILD_NUMBER}"}success {slackSend channel: '#game-deploy',message: "新版本已上線: ${env.BUILD_NUMBER}"}}
}

4.3 關鍵優化點

  1. ??構建緩存??:復用node_modules目錄加速構建

  2. ??安全憑證??:使用Jenkins Credential管理SSH密鑰

  3. ??回滾機制??:保留最近5個可用鏡像版本

  4. ??通知系統??:集成Slack實現構建狀態實時通知

第五部分:監控與運維方案

5.1 分布式監控體系

# docker-compose.monitor.yml
version: '3.8'services:prometheus:image: prom/prometheusports:- "9090:9090"volumes:- ./prometheus.yml:/etc/prometheus/prometheus.ymldeploy:placement:constraints: [node.role == manager]grafana:image: grafana/grafanaports:- "3000:3000"volumes:- grafana-data:/var/lib/grafanadepends_on:- prometheusnode-exporter:image: prom/node-exporterdeploy:mode: globalvolumes:- /proc:/host/proc:ro- /sys:/host/sys:ro- /:/rootfs:rovolumes:grafana-data:

第六部分:踩坑經驗與進階思考

6.1 典型問題解決方案

??問題1??:跨主機容器網絡不通

??現象??:Swarm集群中容器無法通過服務名互相訪問

??解決方案??:檢查防火墻規則:

sudo firewall-cmd --permanent --add-port=2377/tcp
sudo firewall-cmd --permanent --add-port=7946/tcp
sudo firewall-cmd --permanent --add-port=7946/udp
sudo firewall-cmd --permanent --add-port=4789/udp
sudo firewall-cmd --reload

驗證Overlay網絡狀態:

docker network inspect game-network

優化方案??:調整Runner配置:

[[runners]]name = "game-runner"url = "http://192.168.1.101:8080"executor = "docker"[runners.docker]tls_verify = falseimage = "alpine:3.16"privileged = truedisable_cache = falsevolumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]shm_size = "512m"

增加Runner并發數

6.2 性能優化成果

指標

優化前

優化后

構建時間

23分鐘

8分鐘

部署時間

15分鐘

45秒

鏡像大小

1.8GB

420MB

啟動時間

30秒

3秒

結語:從實踐到生產

這套基于CentOS的分布式Docker架構已經穩定運行6個月,支撐了日均50萬PV的游戲服務。關鍵收獲包括:

  1. ??基礎設施即代碼??:所有環境配置版本化控制

  2. ??不可變基礎設施??:通過鏡像而非修改運行環境來變更應用

  3. ??自動化一切??:從代碼提交到生產部署的全流程自動化

未來規劃:

  1. 遷移到Kubernetes實現更高級的編排能力

  2. 引入服務網格(Service Mesh)管理微服務通信

  3. 實現基于Prometheus的自動擴縮容

希望這篇結合實戰經驗的詳細分享,能為你的分布式容器化之路提供參考。歡迎在評論區交流你在CI/CD實踐中遇到的挑戰和解決方案!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89313.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89313.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JVM——為什么Java8移除了永久代(PermGen)并引入了元空間(Metaspace)?

Java8移除永久代并引入元空間,主要是為了解決 PermGen 固定大小、容易導致內存溢出、GC 效率低的問題。元空間使用本地內存,具備更靈活的內存分配能力,提升了垃圾收集和內存管理的效率。 PermGen 的局限性 ①固定大小:永久代的內存空間大小在…

3.正則化——新聞分類

影響結果出了最終的目標,還會有許多細節因素 在機器學習中,往往會面臨很多過擬合和欠擬合的問題。 欠擬合是訓練不到位,過擬合是訓練過頭,會導致泛化性差正則化是在損失函數中添加一個懲罰項,以簡化模型對于懲罰項Pena…

HTML的重要知識

什么是HTMLHTML是Hyper Text Markup Language的縮寫,意思是超文本標記語言。標簽標題標簽:————-h1,h2,h3.....段落標簽 :————p換行標簽: ————br列表標簽:有序列表:——ol無序列表:—…

【C語言網絡編程】HTTP 客戶端請求(發送請求報文過程)

在 C 語言中,我們可以使用 socket 編程來手動實現一個簡單的 HTTP 客戶端,像瀏覽器一樣請求網頁數據。本文將結合實際代碼,重點講解如何通過 C 語言構造并發送一個 HTTP 請求報文,實現與服務器的基本通信。 文章目標 通過一個簡單…

oracle2kingbase的字段長度問題

實驗一: oracle中: create table testlen(c1 varchar2(2)); insert into testlen values(山); --成功 insert into testlen values(山西); --失敗 ORA-12899: 列 "TESTK"."TESTLEN"."C1" 的值太大 (實際值: 4, 最大值: 2…

單鏈表的題目,咕咕咕

1.咕 203. 移除鏈表元素 - 力扣(LeetCode) 給你一個鏈表的頭節點 head 和一個整數 val ,請你刪除鏈表中所有滿足 Node.val val 的節點,并返回 新的頭節點 struct ListNode* removeElements(struct ListNode* head, int val) …

關于程序=數據結構+算法這句話最近的一些思考

最近看了很多單片機STM32的的相關程序,尤其是設計到ringbuff、buffer_manage、os_memory預計mem_manage等程序中間層的用法,我對這句話有了一些更深的思考,現在記錄下來,希望對處于相同階段的程序一些思想啟迪。首先“數據結構”也…

Rust 錯誤處理

Rust 錯誤處理 引言 Rust 是一種系統編程語言,以其安全、并發和性能著稱。在 Rust 中,錯誤處理是一個核心概念,它確保了程序在遇到異常情況時能夠優雅地處理。本文將深入探討 Rust 中的錯誤處理機制,包括錯誤類型、錯誤傳播、錯誤…

17. 什么是 webSocket ?

總結 WebSocket 是 HTML5 引入的一種新協議,允許客戶端和服務器之間進行雙向實時通信。建立在 TCP 協議之上,默認端口是 80(ws) 和 443(wss),沒有同源限制,客戶端可以與任意服務器通…

從零開始跑通3DGS教程:(五)3DGS訓練

寫在前面 本文內容 所屬《從零開始跑通3DGS教程》系列文章; 本文介紹在docker中訓練3dgs的方法 平臺/環境 linux, nvidia GPU, docker 轉載請注明出處: https://blog.csdn.net/qq_41102371/article/details/146535874 目錄 寫在前面系列文章準備docker創建環境參考完系列文章…

日記_7.14_實際開發的進步

1、快速定位后端2、會定位前端啦啦啦!3、前端沒有意義的塊叫div和span。而不是script4、所有 JavaScript 標識符均 區分大小寫5、JS中$和_下劃線和doller符均被視為字母。6、var、let區別:1 var全局。let局部。2 var可以重新聲明格式,let之恩…

AI Agent 開發

Agent開發常用框架: LangChainLlamaIndexVercel AI SDK LangChain:一站式 LLM 應用開發框架一句話總結 LangChain 把「模型調用 外部數據 工具 記憶 流程編排」全部標準化,讓你像搭積木一樣快速組合出聊天機器人、RAG、Agent 等大模型應用…

【水動力學】04 二維洪水淹沒模型Pypims安裝

模型介紹 HiPIMS(High-Performance Integrated hydrodynamic Modelling System)使用最先進的數值方案(Godunov型有限體積法)來求解二維淺水方程以進行洪水模擬。為了支持高分辨率洪水模擬,使用CUDA/C 語言在多個GPU上…

ARC 03 從Github Action job 到 runner pod

Github Action job 分配到集群 背景 job 是 Github Action 的基本單位,每個 job 單獨分配一個 runner。workflow 由一個或者多個 job 組成。如果用戶觸發runs-on字段為arc-runner-set的 job,那么 Github Action 服務器將 job 分配給 listener pod。 源碼…

ubuntu 22.04 anaconda comfyui安裝

背景: 戴爾R740服務器,安裝了proxmox操作系統,配置了顯卡直通。創建了一個ubuntu 22.04 VM虛擬機實例,并安裝了顯卡驅動與cuda等相關配置: 接下來準備搭建一套comfyui的環境,前段時間B站,抖音各…

每日面試題04:volatile字段的原理

在之前面試題02ConcurrentHashMap的底層原理中提到了volatile修飾符,在多線程編程的世界里,數據同步是一道繞不開的坎。當多個線程同時操作共享變量時,“看不見對方的修改”或“代碼順序錯亂”往往會導致程序行為異常。而 volatile作為 Java …

【云原生網絡】Istio基礎篇

文章目錄概述基礎知識技術架構概述數據平面核心組件網絡代理Envoy控制平面核心組件xDS協議Pilot組件其他概述參考博客😊點此到文末驚喜?? 概述 基礎知識 背景知識 服務網格(Service Mesh):獨立于應用程序的基礎設施層&#x…

PySpark Standalone 集群

一、PySpark Standalone 集群概述PySpark Standalone 集群是 Apache Spark 的一種部署模式,它不依賴于其他資源管理系統(如 YARN 或 Mesos),而是使用 Spark 自身的集群管理器。這種模式適合快速部署和測試,尤其在開發和…

圖像質量評價(Image Quality Assessment,IQA)

文章目錄圖像質量評價(Image Quality Assessment,IQA)一、評估方式:主觀評估 客觀評估1.1、主觀評估方式1.2、客觀評估方式:全參考 半參考 無參考(1)全參考的方法對比(Full-Refer…

【跟我學YOLO】(2)YOLO12 環境配置與基本應用

歡迎關注『跟我學 YOLO』系列 【跟我學YOLO】(1)YOLO12:以注意力為中心的物體檢測 【跟我學YOLO】(2)YOLO12 環境配置與基本應用 【跟我學YOLO】(3)YOLO12 用于診斷視網膜病變 【跟我學YOLO】&a…