必须挂载 /var/run/docker.sock 以使 Jenkins 容器调用宿主机 Docker 引擎,实现 docker build、push 等操作;挂载后通过 docker info 和 hello-world 验证连通性,但需注意权限与安全风险。

用 Docker 运行容器化的 Jenkins 并挂载宿主机的 Docker Socket(/var/run/docker.sock),核心目标是让 Jenkins 容器能调用宿主机的 Docker 引擎,从而在 Pipeline 中直接执行 docker build、docker push 等操作。这不是可选项,而是实现真正容器化构建的关键一步。
必须挂载 /var/run/docker.sock
不挂载该 Socket,Jenkins 容器内运行 docker ps 会报错“Cannot connect to the Docker daemon”。挂载后,容器内所有 Docker CLI 请求都会转发到宿主机的 dockerd,等效于在宿主机上执行命令。
- 挂载写法固定为:
-v /var/run/docker.sock:/var/run/docker.sock - 宿主机上需确保该文件存在且权限允许访问(通常属主为
root:docker) - 若权限不足,可临时放宽:
sudo chmod o+rw /var/run/docker.sock(仅测试环境建议)
完整启动命令示例
一条可直接运行的命令,含持久化和 Socket 挂载:
docker run -d \ --name jenkins \ -p 8080:8080 \ -p 50000:50000 \ -v /opt/jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ --restart=unless-stopped \ jenkins/jenkins:lts
-
/opt/jenkins_home是你提前创建的本地目录,用于保存插件、任务配置、凭证等 - 首次访问
http://localhost:8080时,初始密码从/opt/jenkins_home/secrets/initialAdminPassword读取 - 无需在容器内重装 Docker CLI,官方镜像已自带,挂载 socket 后即可直接使用
验证是否生效
进入容器并测试 Docker 连通性:
docker exec -it jenkins bash # 在容器内执行: docker info | head -5 docker run --rm hello-world
- 能看到宿主机的 Docker 版本、驱动、镜像列表,说明通信成功
- 能拉取并运行
hello-world,代表构建与运行能力就绪 - 后续在 Pipeline 中可直接写:
sh 'docker build -t myapp .'
安全与权限提醒
挂载 docker.sock 意味着 Jenkins 拥有等同于宿主机 root 的 Docker 控制权,务必限制暴露面:
- Jenkins 实例不应直接暴露在公网,建议前置 Nginx 或反向代理加认证
- 启用 Role-Based Authorization Strategy 插件,严格控制用户权限
- 避免使用
--privileged或--user=root,除非明确需要(官方镜像默认以jenkins用户运行)











