-v /usr/bin/docker:/usr/bin/docker
-v /var/run/docker.sock:/var/run/docker.sock
-v /usr/bin/docker:/usr/bin/docker
是将宿主机的 Docker 可执行文件路径挂载到 Jenkins 容器中。这一挂载解决了 Jenkins 容器内无法直接调用 Docker 命令的问题,以下是具体原因和解释:
1. 容器内调用 Docker 命令的需求
Jenkins 容器在执行构建任务时,可能需要调用 Docker 命令来构建或运行其他容器。例如,在 Jenkins 流水线中,您可能会使用 docker build
或 docker run
等命令。如果容器内没有 Docker 可执行文件,这些命令将无法执行。
2. Docker 可执行文件的挂载
通过 -v /usr/bin/docker:/usr/bin/docker
,您将宿主机的 Docker 可执行文件挂载到容器中。这样,Jenkins 容器内就可以直接调用宿主机的 Docker 命令,而无需在容器内安装 Docker 客户端。
3. Docker 套接字的挂载
-v /var/run/docker.sock:/var/run/docker.sock
是将宿主机的 Docker 套接字挂载到容器中。这使得 Jenkins 容器能够与宿主机的 Docker 守护进程通信,从而执行 Docker 命令。然而,仅有套接字挂载是不够的,还需要 Docker 可执行文件来发起这些命令。
4. 为什么需要两者结合
- Docker 套接字:提供了与 Docker 守护进程通信的能力。
- Docker 可执行文件:提供了发起 Docker 命令的能力。
两者结合后,Jenkins 容器既能够与 Docker 守护进程通信,又能够发起 Docker 命令,从而实现完整的 Docker 功能。
在执行docker run
命令时,是否加入-v /var/run/docker.sock:/var/run/docker.sock
这个参数,会对容器中Jenkins的功能产生显著影响:
如果没有加入该参数: Jenkins容器将无法直接与宿主机上的Docker守护进程进行交互。这限制了Jenkins使用其插件(例如Docker Pipeline或依赖Docker的构建步骤)直接操控宿主机上的Docker。
如果加入了该参数: 通过-v /var/run/docker.sock:/var/run/docker.sock
参数,宿主机上的Docker守护进程监听的Unix套接字文件被映射到Jenkins容器内。这样,Jenkins容器内的进程就能够与宿主机的Docker守护进程通信,执行启动、停止、构建和管理Docker容器等操作。这对于自动化CI/CD流程至关重要,比如在Jenkins中创建Docker镜像、运行Docker容器进行测试或将应用部署到Docker容器中。
简而言之,添加该卷挂载使得Jenkins能够实现更高级的容器化构建和部署自动化,而不添加则限制了Jenkins在容器内直接操作宿主机Docker环境的能力。