使用Gitlab CI/CD结合docker容器实现自动化部署

Gitlab CI/CD基本介绍

  1. 核心概念

    持续集成(CI):每次代码提交后自动触发构建、测试和代码检查,确保代码质量

    持续交付/部署(CD):在 CI 基础上自动将代码部署到测试或生产环境,支持人工审核(交付)或全自动发布(部署)

  2. 核心组件

    Pipeline(流水线) :由多个阶段(stages)组成,每个阶段包含并行执行的作业(jobs

    .gitlab-ci.yml:YAML 格式的配置文件,定义流水线的逻辑,需放置在项目根目录

    Runner:执行作业的代理,支持 Docker、Shell 等运行环境,分为共享 Runner 和私有 Runner

  3. 工作流程

    代码提交:触发流水线执行

    阶段执行

    • 构建阶段:编译代码、安装依赖
    • 测试阶段:运行单元测试、集成测试等
    • 部署阶段:自动发布到指定环境

    结果反馈:通过 GitLab 界面查看日志和状态

  4. 优势

    • 自动化:减少手动操作,提升效率
    • 可视化:提供流水线状态和日志的实时监控
    • 灵活性:支持多语言、多环境部署,可集成 Kubernetes 等云原生工具

预先准备

  1. 用于发布程序的机器一台,负责执行任务、部署程序
  2. 若干台服务器(生产环境)

发布程序

在发布程序的机器上安装gitlab-runner
  1. 添加官方仓库

    bash 复制代码
    curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
  2. 使用apt安装

    bash 复制代码
    sudo apt-get install gitlab-runner
  3. 验证是否安装成功

    bash 复制代码
    gitlab-runner --version
注册Runner到项目
  1. 注册runner到项目,在项目目录下执行

    bash 复制代码
    sudo gitlab-runner register

    填写gitlab的地址,token,其余信息不必要填

    token在gitlab的网页端可以找到

    按照下图填写服务器的必要信息,地址、端口号、ssh用户名和密码

  2. 注册完成后,可以看到runner的配置文件在**/etc/gitlab-runner/config.toml**下

  3. 查看gitlab-runner运行状态

在安装runner的机器上生成ssh密钥
  1. 生成密钥,需要指定格式

    bash 复制代码
    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
  2. 查看id_rsa私钥格式,必须有开头和结尾,否则密钥加载会失败

    bash 复制代码
    -----BEGIN OPENSSH PRIVATE KEY-----
    密钥内容
    -----END OPENSSH PRIVATE KEY-----
  3. 将本地生成的 SSH 公钥添加到目标服务器(生产环境)上,使用以下命令将公钥添加到目标服务器的 authorized_keys 文件中

    bash 复制代码
    ssh-copy-id username@remote_host

在项目目录下编写.gitlab-ci.yml

下面是我的一个示例

yml 复制代码
stages:
  - build
  - deploy

build_image:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker rmi ems-simulate 2>/dev/null || true
    - docker build --no-cache -t ems-simulate .
    - docker save ems-simulate | gzip > ~/ems_simulate.tar.gz
  only:
    - main

deploy_ems_simulate:
  stage: deploy
  parallel:
    matrix: # 使用矩阵同时部署4台服务器
      - HOST: ["10.10.112.4", "10.10.112.5", "10.10.112.6", "10.10.110.33"]
  before_script:
    # 禁用严格主机密钥检查(仅限测试环境)
    - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
  script:
    # 传输镜像到远程主机
    - scp ~/ems_simulate.tar.gz narada@$HOST:~
    # 远程执行部署命令
    - ssh narada@$HOST "gunzip -c ~/ems_simulate.tar.gz | docker load && docker stop ems_simulate_container 2>/dev/null && docker rm ems_simulate_container 2>/dev/null && docker volume rm ems_simulate_volume 2>/dev/null || true && docker volume create ems_simulate_volume 2>/dev/null || true && docker run -d --name ems_simulate_container --network host -v ems_simulate_volume:/app ems-simulate /bin/bash -c 'cd /app && python3 start_back_end.py'"
  needs: [build_image]
  only:
    - main

结合docker使用分为两个阶段

  1. 构建阶段,制作docker镜像并导出为tar.gz文件
  2. 将镜像文件分发到每台生产环境,部署docker容器

当将代码提交到gitlab时,将会自动执行任务,下面是执行的效果

点进某个任务可以看到具体的执行情况

执行成功的任务最后会显示Job succeeded

相关推荐
一只积极向上的小咸鱼2 小时前
多机Docker + InfiniBand 分布式运行实操手册
分布式·docker·容器
java_logo2 小时前
Docker 部署 WPS 在线办公套件,浏览器即可编辑 Word、Excel、PPT
docker·word·wps·wps部署教程·wps免费版·轩辕镜像·docker部署教程
AI服务老曹2 小时前
Docker部署AI视频分析平台项目实战记录
人工智能·docker·音视频
留不住的何止是时间2 小时前
关于docker构建镜像build指令的注意事项
运维·docker·容器
小兔崽子去哪了17 小时前
Docker 删除镜像后磁盘空间没有释放?
后端·docker·容器
Zhu75818 小时前
在Docker环境部署ApacheGuacamole,对接PG数据库
数据库·docker·容器
老谷子.AI原始技术19 小时前
《Claude Code 工程化实战》第 21 讲 Headless 模式与 CI/CD 集成
ci/cd·claude code
少陽君19 小时前
Docker 部署 Loki + Promtail + Grafana 日志监控栈
docker·容器·grafana
独自归家的兔19 小时前
2026年7月2日 Docker 容器化部署 PaddleOCR-VL 实战(OpenAI 协议兼容 HTTP 调用)
运维·docker·容器
胖胖雕20 小时前
利用阿里云与docker部署Certimate
阿里云·docker·云计算