为什么推荐挂载 Docker 套接字?

挂载 Docker 套接字是将 Jenkins 容器直接与宿主机的 Docker 守护进程通信的一种常见且推荐的方法。这种方法具有以下优点:

  • 简单:配置相对简单,无需额外安装 Docker 守护进程。
  • 安全:避免使用 Docker-in-Docker(DinD)模式时必须启用的 --privileged 标志,从而减少了安全风险。
  • 高效:直接与宿主机的 Docker 守护进程通信,避免了额外的资源开销。

配置步骤

  1. 修改 docker-compose.yml 文件

    在 Jenkins 服务的 volumes 部分添加以下行,将 Docker 套接字和(可选的)Docker 客户端二进制文件挂载到 Jenkins 容器:

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock  # 将 Docker 套接字挂载到容器
      - /usr/bin/docker:/usr/bin/docker            # 将 Docker 客户端二进制文件挂载到容器(如果没有 Docker 客户端)
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      # ...其他 volumes...
    • /var/run/docker.sock:这是 Docker 守护进程监听客户端请求的 Unix 套接字。将其挂载到 Jenkins 容器,Jenkins 容器内的 Docker 客户端将能够与宿主机的 Docker 守护进程通信。
    • /usr/bin/docker:这是 Docker 客户端二进制文件的位置。如果 Jenkins 镜像中没有 Docker 客户端,则需要挂载这个文件,确保 Jenkins 容器能够使用 docker 命令。
  2. 将 jenkins 用户添加到 Docker 组(在宿主机上)

    为了让 Jenkins 用户能够访问 Docker 守护进程,需要将 jenkins 用户添加到 Docker 组:

    sudo usermod -aG docker jenkins

    这步操作授予 Jenkins 用户访问 Docker 守护进程的权限。

  3. 安装 Docker 客户端(如果 Jenkins 镜像未预装)

    如果你的 Jenkins 镜像中没有 Docker 客户端,可以在 Jenkins 容器的 shell 中执行以下命令来安装 Docker 客户端:

    apt-get update && apt-get install -y docker.io

    如果Alpine Linux

    apk add --no-cache docker



    另外,你也可以通过自定义 Dockerfile 预装 Docker 客户端,确保容器内能够使用 docker 命令。

  4. 重启 Jenkins 服务和 Docker 服务(在宿主机上)

    重启 Jenkins 和 Docker 服务以应用配置更改:

    sudo systemctl restart jenkins
    sudo systemctl restart docker

    或者,你可以重启主机来完成配置。

  5. 验证配置

    • 进入 Jenkins 容器:

      docker exec -it jenkins bash
    • 在容器内,运行以下命令检查是否可以访问宿主机上的容器:

      docker ps

      如果配置正确,你应该能够看到宿主机上正在运行的容器列表。

总结

挂载 Docker 套接字是让 Jenkins 容器能够与宿主机的 Docker 守护进程通信的首选方法。通过这种方式,不仅能够避免 DinD 带来的安全风险,还能提升配置的简单性和性能。确保将 Jenkins 用户添加到 Docker 组,并根据需要安装或挂载 Docker 客户端二进制文件。