Ubuntu Overlay与持续集成/部署(CI/CD)的结合实践
OverlayFS(Overlay文件系统)是Ubuntu中常用的联合文件系统,通过分层机制(底层只读、上层可写)实现镜像/文件系统的高效复用,广泛应用于容器化场景。将其与CI/CD流程结合,可实现应用镜像的自动化构建、测试与部署,提升开发效率。
在实现CI/CD之前,需先完成Ubuntu系统中OverlayFS的环境搭建,为后续容器化部署奠定基础:
apt安装overlayroot(内核模块)和fuse-overlayfs(用户态工具),用于支持OverlayFS挂载与管理。sudo apt update && sudo apt install overlayroot fuse-overlayfs -y
/etc/overlayroot.conf文件,定义OverlayFS的层结构(lowerdir为只读基础层,upperdir为可写修改层,workdir为临时工作目录,mergedir为合并后的挂载点)。[general]
enabled = yes
upperdir = /var/lib/overlay/upper
workdir = /var/lib/overlay/work
lowerdir = /var/lib/overlay/lower
mergedir = /var/lib/overlay/merged
sudo modprobe -r overlayroot && sudo modprobe overlayroot
mount | grep overlay命令确认OverlayFS已正确挂载,ls /var/lib/overlay/merged查看合并后的文件系统内容。根据项目需求选择合适的CI/CD工具(如GitHub Actions、GitLab CI、CircleCI等),以下以GitHub Actions(适合开源/中小型项目)和GitLab CI(适合GitLab代码管理项目)为例,说明集成步骤:
GitHub Actions与GitHub深度集成,无需额外搭建服务器,适合快速启动CI/CD流程。
创建.github/workflows/ubuntu-overlay.yml配置文件:定义CI/CD流水线的触发条件(如push到main分支)、运行环境(ubuntu-latest)及执行步骤。
关键步骤说明:
actions/checkout@v2动作拉取仓库代码。docker/setup-buildx-action@v1创建多平台构建能力(支持容器化部署)。docker/login-action@v1登录Docker Hub(或其他私有注册表),获取镜像推送权限。docker build命令构建OverlayFS相关的镜像(如应用镜像),并通过docker push推送到注册表。kubernetes/kubectl)将镜像部署到Ubuntu服务器(需提前配置SSH密钥或Kubernetes集群访问权限)。示例配置片段:
name: Ubuntu Overlay CI/CD
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push overlay image
run: |
docker build -t ${{ secrets.DOCKER_USERNAME }}/ubuntu-overlay-app:${{ github.sha }} .
docker push ${{ secrets.DOCKER_USERNAME }}/ubuntu-overlay-app:${{ github.sha }}
- name: Deploy to Ubuntu server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
docker pull ${{ secrets.DOCKER_USERNAME }}/ubuntu-overlay-app:${{ github.sha }}
docker stop overlay-app || true
docker rm overlay-app || true
docker run -d --name overlay-app -v /var/lib/overlay:/var/lib/overlay ${{ secrets.DOCKER_USERNAME }}/ubuntu-overlay-app:${{ github.sha }}
注:需在GitHub仓库的Settings > Secrets中配置DOCKER_USERNAME、DOCKER_PASSWORD、SSH_HOST、SSH_USER、SSH_KEY等敏感信息。
GitLab CI内置于GitLab,支持全流程(代码管理、CI/CD、监控)一体化,适合企业级项目。
创建.gitlab-ci.yml配置文件:定义CI/CD流水线的阶段(build、test、deploy)、触发条件(如push事件)及执行步骤。
关键步骤说明:
image: ubuntu:latest指定构建环境为Ubuntu,安装OverlayFS相关工具(overlayroot、fuse-overlayfs)。docker build命令构建镜像,标签包含分支名和提交哈希(如overlay-app:main-${CI_COMMIT_SHA})。docker login登录GitLab容器注册表(registry.gitlab.com),推送镜像。ssh连接到Ubuntu服务器,拉取最新镜像并重启容器(需配置SSH密钥)。示例配置片段:
stages:
- build
- deploy
variables:
DOCKER_IMAGE: registry.gitlab.com/${CI_PROJECT_PATH}/ubuntu-overlay-app:${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHA}
build:
stage: build
image: ubuntu:latest
before_script:
- apt update && apt install -y overlayroot fuse-overlayfs docker.io
- systemctl start docker
script:
- docker build -t $DOCKER_IMAGE .
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin registry.gitlab.com
- docker push $DOCKER_IMAGE
deploy:
stage: deploy
image: alpine:latest
before_script:
- apk add --no-cache openssh
script:
- ssh -o StrictHostKeyChecking=no ${SSH_USER}@${SSH_HOST} "docker pull $DOCKER_IMAGE && docker stop overlay-app || true && docker rm overlay-app || true && docker run -d --name overlay-app -v /var/lib/overlay:/var/lib/overlay $DOCKER_IMAGE"
only:
- main
注:需在GitLab项目的Settings > CI/CD > Variables中配置SSH_USER、SSH_HOST、CI_REGISTRY_PASSWORD等变量。
upperdir和workdir特性,在CI/CD中缓存依赖项(如node_modules、pip cache),减少重复下载时间。例如,在Dockerfile中将依赖目录挂载到upperdir,避免每次构建都重新安装。v1.0.0)或提交哈希标记镜像,便于回滚到指定版本(如docker pull my-app:v1.0.0)。uname -r检查内核版本,若版本过低需升级内核。runner、GitLab Runner)具有足够的权限(如访问Docker Hub、SSH服务器的权限)。set -x),便于排查问题;同时监控Ubuntu服务器的资源使用情况(如CPU、内存),避免因OverlayFS占用过多资源导致系统崩溃。