Ubuntu Jenkins與Docker集成的完整流程
在Ubuntu系統上,首先需要安裝Docker和Jenkins,確保兩者能正常運行。
更新軟件包列表并安裝依賴:
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
添加Docker官方GPG密鑰和軟件源:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安裝Docker CE及組件:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
啟動Docker并設置開機自啟:
sudo systemctl start docker
sudo systemctl enable docker
關鍵操作:將Jenkins用戶加入Docker組(避免后續使用Docker命令需要sudo):
sudo usermod -aG docker jenkins
sudo systemctl restart jenkins # 重啟Jenkins使組權限生效
驗證Docker安裝:
docker --version # 應輸出Docker版本信息
添加Jenkins官方源并安裝:
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
echo deb https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list
sudo apt update
sudo apt install -y jenkins
啟動Jenkins并設置開機自啟:
sudo systemctl start jenkins
sudo systemctl enable jenkins
訪問http://<服務器IP>:8080
,通過命令sudo cat /var/lib/jenkins/secrets/initialAdminPassword
獲取初始密碼,完成初始配置(如安裝推薦插件、創建管理員賬號)。
要讓Jenkins能控制Docker,需安裝必要插件并配置Docker訪問權限。
登錄Jenkins管理界面,進入Manage Jenkins > Manage Plugins:
docker.build
、docker.image
)。為了讓Jenkins能遠程控制Docker守護進程,需修改Docker的通信配置:
編輯Docker守護進程配置文件:
sudo vim /etc/docker/daemon.json
添加以下內容(允許TCP連接,端口2375):
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}
重啟Docker使配置生效:
sudo systemctl restart docker
安全提示:開放2375端口存在安全風險,建議僅在測試環境使用;生產環境建議使用TLS加密或Docker Swarm模式。
通過Pipeline腳本定義構建、測試、部署流程,結合Docker實現容器化CI/CD。
在項目代碼根目錄創建Jenkinsfile
,示例如下(以Node.js應用為例):
pipeline {
agent any
environment {
DOCKER_IMAGE = "your-dockerhub-username/your-app-name:${env.BUILD_NUMBER}" // 鏡像名稱(含構建編號)
DOCKER_HUB_CREDENTIALS = credentials('dockerhub-account') // Jenkins中配置的Docker Hub憑證ID
}
stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'https://github.com/your/repo.git' // 拉取代碼
}
}
stage('Build Image') {
steps {
script {
// 使用Docker Pipeline插件構建鏡像
docker.build(DOCKER_IMAGE)
}
}
}
stage('Test') {
steps {
script {
// 在構建的鏡像中運行測試
docker.image(DOCKER_IMAGE).inside {
sh 'npm install' // 安裝依賴
sh 'npm test' // 執行測試
}
}
}
}
stage('Push Image') {
when {
branch 'main' // 僅main分支推送鏡像
}
steps {
script {
// 登錄Docker Hub并推送鏡像
docker.withRegistry('https://registry.hub.docker.com', DOCKER_HUB_CREDENTIALS) {
docker.image(DOCKER_IMAGE).push()
}
}
}
}
stage('Deploy') {
steps {
script {
// 示例:通過SSH推送鏡像到目標服務器(需提前配置SSH憑證)
def remoteServer = 'user@your-server-ip'
def remoteDir = '/path/to/deploy'
sshagent(['ssh-account']) { // Jenkins中配置的SSH憑證ID
sh "scp -r ${remoteDir}/* ${remoteServer}:${remoteDir}"
sh "ssh ${remoteServer} 'cd ${remoteDir} && docker-compose pull && docker-compose up -d'"
}
}
}
}
}
}
docker-app-ci
),選擇Pipeline類型,點擊“OK”。Jenkinsfile
(即代碼根目錄下的Pipeline腳本文件名)。docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:lts
但需注意,DinD可能帶來安全風險(容器逃逸),生產環境建議使用Docker outside of Docker(DooD,即Jenkins主機直接運行Docker)。docker build
、docker push
),避免因權限不足導致構建失敗。.dockerignore
文件排除不必要的文件(如node_modules
、.git
),提升構建效率。通過以上步驟,即可實現Ubuntu系統上Jenkins與Docker的集成,支持容器化的持續集成與交付流程。