Jenkins 使用 Docker-in-Docker (DinD) 模式
2024-06-28 by dongnan
简介
Docker-in-Docker (DinD) 模式,顾名思义就是在 Docker
容器中运行 Docker
容器的方法。
为什么要在 Docker 容器中运行 Docker 容器?
举个栗子
某个项目的 jenkins
服务器是运行 在 docker
容器之上的,但是项目在构建的时候;
需要将 mvn
编译完成的jar
包 ,再打包成 docker
镜像,这个时候就需要 DinD
模式了。
目标
使用 DinD
模式,在 Jenkins
容器中构建和打包 Docker 镜像 。
环境描述
- OS: Ubuntu Server 20.04 LTS
- Docker: 19.03.15
- Docker-compose: 1.29.2
- Jenkins: 2.452.2 LTS
前提条件
- Jenkins 安装在 Docker 容器中。
- Docker 已安装在宿主机和 Jenkins 容器中。
- Jenkins 容器拥有
privileged
权限。
配置 DinD 环境
创建 Dockerfile 文件
内容如下
# DinD (docker in docker)
FROM jenkins/jenkins-2.452.2:lts
# docker-ci
USER root
COPY conf/sources-debain12.list /etc/apt/sources.list
RUN mv /etc/apt/sources.list.d/debian.sources /tmp \
&& apt-get update \
&& apt-get install -y docker.io vim \
&& apt-get clean \
&& rm -r /var/lib/apt/lists/*
# user
#USER jenkins
# plugin
#RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"
构建自定义镜像
$ docker build -t jenkins/jenkins-dind:v3 .
创建 Docker Compose 文件
创建一个 docker-compose.yml
文件,用于配置和启动 Jenkins
容器。
version: '3'
services:
jenkins:
# image: jenkins/jenkins-2.452.2:lts
image: jenkins/jenkins-dind:v3
container_name: jenkins
privileged: true
ports:
- "8080:8080"
- "50000:50000"
environment:
- TZ=Asia/Chongqing
- DOCKER_TLS_CERTDIR=/certs
#- JAVA_OPTS=-Xmx4000m
volumes:
- jenkins_home:/var/jenkins_home
- mvn_home:/root/.m2 #maven 缓存目录
- npm_home:/root/.npm #nodejs 缓存目录
- /var/run/docker.sock:/var/run/docker.sock
- jenkins-docker-certs:/certs/client
- ./conf/.docker:/root/.docker #docker auth目录
extra_hosts: # custom domain
- "yjt.xxx.com:172.21.1xx.150"
deploy:
resources:
limits:
cpus: '2.0'
#memory: '4g'
restart: always
volumes:
jenkins_home:
driver: local
jenkins-docker-certs:
driver: local
mvn_home:
driver: local
npm_home:
driver: local
创建 Jenkins 容器
在包含 docker-compose.yml
文件的目录中运行以下命令启动 Jenkins
容器:
$ docker-compose up -d
验证
进入容器
$ docker exec -ti jenkins /bin/bash
列出镜像
# docker images
输出内容
REPOSITORY TAG IMAGE ID CREATED SIZE
jenkins/jenkins-dind v3 1c2babbabe42 7 minutes ago 847MB
成功在 Jenkins
容器中,使用 docker
命令。
其它
关于 Docker-in-Docker
有请 chatGPT
回答一下:
参考文档
- chatGPT
- https://www.jenkins.io/doc/book/installing/docker/
- https://github.com/jenkinsci/docker
- https://hub.docker.com/r/jenkins/jenkins
- https://www.jenkins.io/doc/book/platform-information/support-policy-jav