创建包含 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-daemon
、docker-cmds
和 ml-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”。
我正在尝试创建一个 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-daemon
、docker-cmds
和 ml-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”。