创建Jenkins Docker容器时,能够连接到Docker守护程序非常有用。这样,我就可以在Jenkins容器中启动docker命令。
例如,在启动Jenkins Docker容器之后,我想'docker exec -it container-id bash'并启动'docker ps'。
在Linux上,您可以在/var/run/docker.sock上使用bind-mounts。在Windows上,这似乎是不可能的。解决方案是使用'命名管道'。所以,在我的docker-compose.yml文件中,我尝试创建一个命名管道。
version: '2'
services:
jenkins:
image: jenkins-docker
build:
context: ./
dockerfile: Dockerfile_docker
ports:
- "8080:8080"
- "50000:50000"
networks:
- jenkins
volumes:
- jenkins_home:/var/jenkins_home
- \\.\pipe\docker_engine:\\.\pipe\docker_engine
# - docker.sock:/var/run/docker.sock
# ... postgres, etc....
使用此文件启动docker-compose,我收到以下错误:
无法在unix:///var/run/docker.sock连接到Docker守护程序。 docker守护程序是否正在运行?
如何设置docker-compose文件,以便我可以在已启动的容器中使用docker.sock(或Docker)?
在Linux上,您可以使用诸如卷之类的内容:/var/run/docker.sock:/var/run/docker.sock。这在Windows环境中不起作用。将此文件夹(/ var)添加到Oracle VM Virtualbox时,它将永远不会获得任何IP。在很多帖子上
您可以在设置中在没有TLS的情况下在tcp://localhost:2375
上公开守护程序。这样,您可以将Jenkins配置为使用Docker API而不是套接字。我鼓励你阅读this article by Nick Janetakis about "Understanding how the Docker Daemon and the Docker CLI work together"。
然后有几个Jenkins的Docker插件允许这种连接:
另外,您可以在Docker plugin documentation on wiki.jenkins.io中找到更多信息:
def dockerCloudParameters = [
connectTimeout: 3,
containerCapStr: '4',
credentialsId: '',
dockerHostname: '',
name: 'docker.local',
readTimeout: 60,
serverUrl: 'unix:///var/run/docker.sock', // <-- Replace here by the tcp address
version: ''
]
编辑1:
我不知道它是否有用,但根据C:\ProgramData\docker
,Windows上的Docker守护进程位于Docker Daemon configuration doc。
编辑2:
您需要明确说明容器使用host
网络,因为您想要公开Jenkins和Docker API。在this documentation之后,您只需要将--network=host
(或者docker-compose中的network_mode: 'host'
)添加到您的容器/服务中。有关详细信息,您可以阅读this article以了解此网络模式的用途。
首先尝试使用“Docker Quickstart终端”启动Docker环境。在该环境中运行Docker命令时,这是一个很好的解决方案。
通过Docker安装完整的CI / CD Jenkins环境意味着在Jenkins Docker容器中,您需要访问Docker守护程序。在尝试了许多解决方案后,阅读了很多帖子,这没有用。 @Paul Rey,非常感谢您尝试各种路线。
一个好的解决方案是获取Ubuntu虚拟机并通过Oracle VM Virtualbox进行安装。因此,通过this official description安装Docker非常重要。
在安装Docker之前,当然需要安装Curl,Git等。