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占用過多資源導致系統崩潰。