拒绝纸上谈兵!Docker 一键全线打通 DevOps 金三角实战

拒绝纸上谈兵!Docker 一键全线打通 DevOps 金三角实战

前言 : 行业里天天有人高喊 DevOps,但真到落地时,光是本地把 GitLabSonarQubeJenkins 这三尊大佛请进同一个 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

    bash 复制代码
    docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
  • Jenkins 首次登录的解锁钥匙

    Bash

    bash 复制代码
    docker 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 自动化构建与静态分析流水线,敬请期待!

相关推荐
罗工_有bug1 小时前
label-studio 踩坑:一个环境变量引发的 bool 转换错误
后端
搬石头的马农1 小时前
Claude Code SpringBoot开发:从0到1搭建企业级项目的6个核心Skill
java·人工智能·spring boot·后端·ai编程
西安邮电大学1 小时前
Redis为什么快?
java·redis·后端·其他·面试
折哥的程序人生 · 物流技术专研1 小时前
《Java 100 天进阶之路》第39篇:Java泛型方法的定义和使用
java·开发语言·后端·面试·求职招聘
土狗TuGou2 小时前
SQL内功笔记 · 第6篇:窗口函数的使用ROW_NUMBER等
java·数据库·后端·sql·mysql
锋行天下2 小时前
让nginx网关扛下所有攻击
前端·后端·nginx
武子康2 小时前
Java-11 深入浅出 MyBatis 一级缓存详解:从原理到失效场景 Executor
java·后端
折哥的程序人生 · 物流技术专研2 小时前
Java 23 种设计模式:从踩坑到精通 | 抽象工厂 —— 支付/收款如何成套创建?跨平台 UI 如何一键换肤?
java·开发语言·后端·设计模式
小江的记录本3 小时前
【Spring AI】Spring AI中RAG误触发与系统提示词泄露问题解决方案(完整版+代码方案)
java·人工智能·spring boot·后端·python·spring·面试