安装docker插件:

宿主机安装docker:

apt install docker.io -y

安装docker插件:

Docker plugin
Docker Pipeline
Docker API Plugin


pipeline流水线


构建java项目:

pipeline {
    agent none

    stages {
        stage('Build Code') {
            agent {
                docker {
                    image 'maven:3.8.4-openjdk-17'
                    args '-v $HOME/.m2:/root/.m2'
                    label 'java'
                }
            }
            steps {
                sh 'cd mall-admin && mvn clean package'
            }
            post {
                success {
                    stash name: 'mall-admin-target', includes: 'mall-admin/target/*.jar'
                }
            }
        }

        stage('Build Docker Image') {
            agent {
                docker {
                    image 'docker:dind' // 构建镜像阶段使用 Docker 镜像
                    args '-v /var/run/docker.sock:/var/run/docker.sock -u root' // 挂载 Docker 套接字
                    label 'java'
                }
            }
            steps {
                unstash 'target' // 恢复暂存的编译产物
                script {
                    env.SHORT_COMMIT = env.GIT_COMMIT.substring(0, 7)
                }
                sh 'ls -al && ls -al target/'
                sh "docker build -t harbor.k8s.local/mall-swarm/mall-admin:${env.SHORT_COMMIT}-${env.BUILD_ID} ."
                sh "docker login --username admin --password Harbor12345  http://harbor.k8s.local"
                sh "docker images"
                sh "docker push harbor.k8s.local/mall-swarm/mall-admin:${env.SHORT_COMMIT}-${env.BUILD_ID}"
            }
        }
    }
}

方法二介绍:单 Agent 多容器(高效但复杂度高)在全局 Agent 中启动多个容器,通过 docker run 手动控制。

pipeline {
    agent any

    stages {
        stage('Build Code') {
            steps {
                docker.image('maven:3.8.6-jdk-11').inside('-v $HOME/.m2:/root/.m2') {
                    sh 'mvn clean package'
                }
            }
        }

        stage('Build Docker Image') {
            steps {
                withDockerRegistry([url: "https://my-registry", credentialsId: "docker-creds"]) {
                    docker.withTool('docker') { // 使用 Jenkins 配置的 Docker 工具
                        sh '''
                            docker build -t my-app:${BUILD_ID} .
                            docker push my-app:${BUILD_ID}
                        '''
                    }
                }
            }
        }
    }
}



构建npm项目:

pipeline {
    agent none // 全局不指定,各阶段独立定义

    stages {
        stage('Docker Build') {
            agent {
                docker {
                    image 'node:18-alpine'        // 使用官方Node镜像
                    args '-v $WORKSPACE:/app -w /app' // 挂载工作目录
                    label 'java'
                }
            }
            steps {
                sh 'npm install --registry=https://registry.npmmirror.com' // 安装依赖
                sh 'npm run build' // 构建项目
                sh 'ls -al' // 查看当前目录
                // archiveArtifacts artifacts: 'dist/**' // 打包并上传构建产物
            }
            post {
                success {
                    stash name: 'dist', includes: 'dist/**' // 打包成功后,将构建产物保存到stash中
                }
            }
        }

        stage('Build Docker Image') {
            agent {
                docker {
                    image 'docker:dind' // 构建镜像阶段使用 Docker 镜像
                    args '-v /var/run/docker.sock:/var/run/docker.sock -u root' // 挂载 Docker 套接字
                    label 'java'
                }
            }
            steps {
                unstash 'dist' // 从stash中恢复构建产物
                script {
                    env.SHORT_COMMIT = env.GIT_COMMIT.substring(0, 7)
                }
                sh 'ls -al' // 查看当前目录
                sh 'ls -al dist'
                sh "docker build -t harbor.k8s.local/mall-swarm/mall-admin-web:${env.SHORT_COMMIT}-${env.BUILD_ID} ."
                sh "docker login --username admin --password Harbor12345  http://harbor.k8s.local"
                sh "docker images"
                sh "docker push harbor.k8s.local/mall-swarm/mall-admin-web:${env.SHORT_COMMIT}-${env.BUILD_ID}"
            }
        }
    }
}

Dockerfile:

FROM nginx:stable-alpine

# 复制构建产物到 Nginx 目录
COPY dist/ /usr/share/nginx/html

# 暴露端口
EXPOSE 80

# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]



Docker开启Remote API访问2375端口

方法一:

vim /etc/default/docker

DOCKER_OPTS="-H tcp://0.0.0.0:2375"

systemctl restart docker

方法二:推荐

vim /usr/lib/systemd/system/docker.service
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock --containerd=/run/containerd/containerd.sock

# 彻底禁用 docker.socket
systemctl disable docker.socket
# 清除 systemd 的失败计数器
systemctl reset-failed docker.service
# 删除残留的 Docker Socket 文件
rm -f /var/run/docker.sock

systemctl daemon-reload
systemctl restart docker

方法三:使用这种方法要删除/lib/systemd/system/docker.service文件中的 -H fd:// 参数,否则会冲突。

vim /etc/docker/daemon.json

{
  "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}

测试:

# ps -ef|grep docker
root        4839       1  0 10:47 ?        00:00:00 /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock --containerd=/run/containerd/containerd.sock

常用命令:

docker -H tcp://0.0.0.0:2375 image ls
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE