创建包含 Docker 和 Jenkins 的 Kubernetes 部署

Creating a Kubernetes deployment that contains Docker and Jenkins

我正在尝试创建一个 Kubernetes 部署,允许在同一主机上构建 Docker 图像和 Jenkins。这是我的部署的 YAML 配置,其中包含 Docker 中的 Docker 和 jenkins-docker-in-docker 部署中的 Jenkins 容器:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-docker-in-docker
spec:
  selector:
    matchLabels:
      app: jenkins-docker-in-docker
  replicas: 1
  template:
    metadata:
      labels:
        app: jenkins-docker-in-docker
    spec:
      containers:
        - name: dind-daemon
          image: docker:18.01.0-dind
          resources:
            requests:
              cpu: 20m
              memory: 512Mi
          securityContext:
            privileged: true
          volumeMounts:
            - name: docker-graph-storage
              mountPath: /var/lib/docker
        - name: docker-cmds
          image: docker:18.01.0
          command: ['docker', 'run', '-p', '80:80', 'httpd:latest']
          resources:
            requests:
              cpu: 10m
              memory: 256Mi
          env:
            - name: DOCKER_HOST
              value: tcp://localhost:2375
        - name: ml-services
          image: trion/jenkins-docker-client
          ports:
            - containerPort: 8080

使用从 https://www.jenkins.io/doc/tutorials/build-a-java-app-with-maven/ 复制的简单管道:

pipeline {
    agent {
        docker {
            image 'maven:3-alpine' 
            args '-v /root/.m2:/root/.m2' 
        }
    }
    stages {
        stage('Build') { 
            steps {
                sh 'mvn -B -DskipTests clean package' 
            }
        }
    }
}

当我尝试构建时收到此错误:

First time build. Skipping changelog.
[Pipeline] }
[Pipeline] // stage
[Pipeline] withEnv
[Pipeline] {
[Pipeline] isUnix
[Pipeline] sh
+ docker inspect -f . maven:3-alpine

    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    [Pipeline] isUnix
    [Pipeline] sh
    + docker pull maven:3-alpine
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    [Pipeline] }
    [Pipeline] // withEnv
    [Pipeline] }
    [Pipeline] // node
    [Pipeline] End of Pipeline
    ERROR: script returned exit code 1
    Finished: FAILURE

我现在看来不正确的理解是容器 dind-daemondocker-cmdsml-services 容器存在于同一部署中,在本例中名为 jenkins-docker-in-docker。因此,Docker 和 Jenkins 应该在 jenkins-docker-in-docker?

上可用

我是不是配置错了 Kubernetes 文件?

更新:

我修改了yaml来设置DOCKER_HOST环境变量:

- name: ml-services
  env:
    - name: DOCKER_HOST
      value: "dind-daemon:2375"
  image: trion/jenkins-docker-client
  ports:
    - containerPort: 8080

Jenkins 现在的错误是:

  • docker inspect -f . maven:3-alpine

error during connect: Get http://dind-daemon:2375/v1.40/containers/maven:3-alpine/json: dial tcp: lookup dind-daemon on 10.245.0.10:53: no such host [Pipeline] isUnix [Pipeline] sh

  • docker pull maven:3-alpine error during connect: Post http://dind-daemon:2375/v1.40/images/create?fromImage=maven&tag=3-alpine: dial tcp: lookup dind-daemon on 10.245.0.10:53: no such host [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline ERROR: script returned exit code 1 Finished: FAILURE

我需要在 10.245.20.10:53 上公开 docker 守护程序吗?

更新 2:

在已接受答案的帮助下,我使用以下部署完成了这项工作:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-docker-in-docker1.1
spec:
  selector:
    matchLabels:
      app: jenkins-docker-in-docker1.1
  replicas: 1
  template:
    metadata:
      labels:
        app: jenkins-docker-in-docker1.1
    spec:
      containers:
        - name: dind-daemon
          image: docker:18.01.0-dind
          resources:
            requests:
              cpu: 20m
              memory: 512Mi
          securityContext:
            privileged: true
          volumeMounts:
            - name: docker-graph-storage
              mountPath: /var/lib/docker
            - name: jenkins-home
              mountPath: /var/jenkins_home
        - name: docker-cmds
          image: docker:18.01.0
          command: ['docker', 'run', '-p', '80:80', 'httpd:latest']
          resources:
            requests:
              cpu: 10m
              memory: 256Mi
          env:
            - name: DOCKER_HOST
              value: tcp://localhost:2375
        - name: ml-services
          env:
            - name: DOCKER_HOST
              value: tcp://localhost:2375
          image: trion/jenkins-docker-client
          ports:
            - containerPort: 8080
          volumeMounts:
            - name: jenkins-home
              mountPath: /var/jenkins_home

      volumes:
        - name: docker-graph-storage
          emptyDir: {}
        - name: jenkins-home
          emptyDir: {}

我可能在上面的 .yaml 配置中包含了一些冗余配置,它使用 Jenkins 执行一个 Docker in Docker 容器并成功执行以下 Jenkinsfile:

pipeline {
    agent {
        docker {
            image 'maven:3-alpine'
            args '-v /root/.m2:/root/.m2'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
    }
}

Docker 尝试使用 unix 套接字连接到守护进程。 当没有设置 DOCKER_HOST 环境变量时会发生这种情况。

使用正确的主机和端口连接到您的 docker 守护进程。在您的设置中,它将是“dind-daemon”。