跳转至

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
回到页面顶部