拒绝纸上谈兵!Docker 一键全线打通 DevOps 金三角实战
前言 : 行业里天天有人高喊 DevOps,但真到落地时,光是本地把 GitLab、SonarQube 和 Jenkins 这三尊大佛请进同一个 Docker 大院,就能让无数好汉当场谢顶。不是网络蜜汁超时,就是内部组件疯狂抢端口搞内卷。
熬了几个通宵,我终于把这三个活祖宗的任督二脉彻底打通。今天不讲PPT概念,纯纯的硬核本地通关实录。建议老铁们点赞收藏防失联!
🛠️ 第一章:DevOps 三杰的"一键同居"剧本
在现代 Docker 编排规范里,顶层的 version 属性早已退役。为了不让 GitLab 内部的 Web 引擎和外部映射端口打架,我强制让它把 8080 留给内部,对外改走全新的 8099 专线。
来,在你的本地干净目录下(比如 ~/devops),直接手写这碗大团圆 Docker Compose 终极脚本:
YAML
yaml
networks:
devops_net:
driver: bridge
services:
# 1. 源码大本营:GitLab CE (代码托管与版本控制)
gitlab:
image: 'gitlab/gitlab-ce:latest'
container_name: gitlab
restart: always
hostname: 'localhost'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://localhost:8099' # 外部访问改用 8099,不跟别人卷
gitlab_rails['gitlab_shell_ssh_port'] = 2222
puma['port'] = 8080 # 强制让内部核心 Puma 独占 8080,杜绝 502
ports:
- '8099:8099'
- '2222:22'
volumes:
- './gitlab/config:/etc/gitlab'
- './gitlab/logs:/var/log/gitlab'
- './gitlab/data:/var/opt/gitlab'
networks:
- devops_net
# 2. 靠谱的后盾:PostgreSQL 15 (SonarQube 专属数据树洞)
sonarqube-db:
image: postgres:15-alpine
container_name: sonarqube-db
restart: always
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar_password
POSTGRES_DB: sonar
volumes:
- './postgresql:/var/lib/postgresql/data'
networks:
- devops_net
# 3. 代码质检官:SonarQube Community Build (自动化静态扫描)
sonarqube:
image: sonarqube:community
container_name: sonarqube
restart: always
depends_on:
- sonarqube-db
ports:
- '9000:9000'
environment:
- SONAR_JDBC_USERNAME=sonar
- SONAR_JDBC_PASSWORD=sonar_password
- SONAR_JDBC_URL=jdbc:postgresql://sonarqube-db:5432/sonar
volumes:
- './sonarqube/data:/opt/sonarqube/data'
- './sonarqube/extensions:/opt/sonarqube/extensions'
- './sonarqube/logs:/opt/sonarqube/logs'
networks:
- devops_net
# 4. 牛马大总管:Jenkins LTS (流水线构建与自动化部署)
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
restart: always
privileged: true
user: root
ports:
- '8088:8080'
- '50000:50000'
volumes:
- './jenkins_home:/var/jenkins_home'
- '/var/run/docker.sock:/var/run/docker.sock' # 把宿主机的 Docker 借给 Jenkins 用
networks:
- devops_net
复制完后,直接一行 docker compose up -d 扔进后台,三大神器便开始在本地安家落户。
🛑 第二章:全流程落地中那些把人按在地上摩擦的"幽灵坑"
本以为能一路绿灯,结果现实往往会给你几个大嘴巴子。以下是我帮你肉身蹚平的 4 个致命巨坑:
💀 坑 1:未知的神秘失联(Cannot connect to the Docker daemon)
- 名场面 :兴冲冲输入
docker images检查成果,终端直接冷冷回一句"查无此人"。 - 真相:后台的 Docker 守护进程压根没启动完,或者还在慢吞吞地摇尾巴。
- 解毒剂 :老老实实去点开桌面端的大鲸鱼图标,盯着状态栏,等它绿灯亮起再回到终端里大放厥词。
💀 坑 2:网络连接卡在世界的尽头(i/o timeout 超时)
-
名场面 :本地想编译一个全栈 Vue 项目(如我的
lotdb-vue),一下载FROM node:20-alpine基础镜像,死活卡住直到超时报错。 -
真相:国内直接访问官方 Docker Hub 极其不稳定。
-
解毒剂 :去 Docker 设置的 Docker Engine 里注入这剂高可用镜像加速强心针:
JSON
json"registry-mirrors": ["https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.1panel.live"]如果本地有科学上网工具,直接在 Resources -> Proxies 里开启全局代理,指向本地端口(如
http://127.0.0.1:7890),重启后执行docker builder prune -f刷掉脏缓存,直接起飞。
💀 坑 3:GitLab 无限期装死(HTTP 502 Waiting for GitLab to boot)
- 名场面:刷新页面 502,再等十分钟还是 502,急得抓耳挠腮。
- 真相:GitLab 是个不折不扣的"内存怪兽",Docker 默认分配的 2G 内存塞它牙缝都不够,直接触发系统 OOM(内存溢出)悄悄把核心进程枪毙了。
- 解毒剂 :果断把 Docker 运行内存拉大到 4G - 6G ,然后果断清除脏目录
./gitlab让它重新建表初始化,两分钟后就能顺利看到精美的极狐 GitLab 欢迎页面。
💀 坑 4:SonarQube 历史汉化包的"亡魂残留"(unknown url /api/support/info)
- 名场面 :打开 SonarQube 全局设置,页面突然罢工弹窗,提示旧接口找不到。
- 真相:最新版 SonarQube 的 API 结构大重构,旧版的中文语言包插件在后台疯狂呼叫已经不存在的接口。即使你在界面点了卸载,前端激进的单页缓存(SPA Cache)依然在自嗨。
- 解毒剂 :去本地挂载目录
./sonarqube/extensions/plugins物理干掉zh-plugin.jar,执行docker compose down --volumes彻底摧毁临时卷层。最后开启浏览器无痕模式+清空缓存硬性重新加载,药到病除。
🛠️ 第三章:DevOps 续命天书(核心运维与排查命令)
这套金三角环境搭好后,怎么日常维稳?记住这几条高频命令,就是你高效运维的底气:
1. 救命的日志追踪(透视眼)
- 看核心组件到底死没死:
docker logs -f gitlab(看到puma: cluster worker 0 ready代表彻底复活)。 - 拒绝满屏日志刷屏,只看最后几行:
docker logs --tail 100 sonarqube。
2. 捞取初始密码(不用就抓瞎系列)
-
捞 GitLab 闪退机制下的初始 root 密码:
Bash
bashdocker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password -
捞 Jenkins 首次登录的解锁钥匙:
Bash
bashdocker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
3. 日常收工与核平重置
- 每天下班给电脑省电减负:
docker compose stop(让容器休眠,不丢数据)。 - 想干掉临时状态但保留数据:
docker compose down(移除容器实体,本地挂载目录完好)。 - 遇到了无法理解的灵异配置死锁:
docker compose down --volumes(连同匿名缓存卷一并抹平,纯净重置)。
💡 终章:三管齐下,全流程的下一步!
现在,打开浏览器,GitLab 源码大本营、SonarQube 质量控制大厅 和 Jenkins 流水线打工现场 已经悉数在你的本地集结完毕。
底层基建彻底打通,DevOps 的第一步就圆满完成了!剩下的事情,就是去 GitLab 首页点击 创建项目,把我们的全栈项目代码推上去,交给 Jenkins 和 SonarQube 开始轰炸了。
如果这篇踩坑总结帮你绕过了暗坑,别忘了点赞、关注、收藏 三连击! 下一期,我们将正式手把手编写第一条 Jenkins Pipeline 自动化构建与静态分析流水线,敬请期待!