Windows10主目录上的Docker-Docker容器内部连接到Docker引擎

时间:2018-09-07 07:55:01

标签: docker jenkins docker-compose

在创建Jenkins Docker容器时,能够连接到Docker守护程序非常有用。这样,我可以在Jenkins容器内启动docker命令。

例如,在启动Jenkins Docker容器后,我想执行'docker exec -it container-id bash'并启动'docker ps'。

在Linux上,您可以在/var/run/docker.sock上使用绑定安装。在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。在许多帖子上

2 个答案:

答案 0 :(得分:1)

您可以在tcp://localhost:2375上公开守护程序,而无需在设置中使用TLS。这样,您可以将Jenkins配置为使用Docker API而不是套接字。我鼓励您阅读this article by Nick Janetakis about "Understanding how the Docker Daemon and the Docker CLI work together"

然后有几个用于Jenkins的Docker插件允许这种连接:

enter image description here

此外,您还可以在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:

我不知道它是否有用,但是根据Docker Daemon configuration doc,Windows上的Docker Daemon位于C:\ProgramData\docker处。

编辑2:

您需要明确说明使用host网络的容器,因为您想同时公开Jenkins和Docker API。 在this documentation之后,您只需要将--network=host(或docker-compose中的network_mode: 'host')添加到您的容器/服务中。有关更多信息,您可以阅读this article来了解此网络模式的目的。

答案 1 :(得分:0)

首先尝试使用“ Docker Quickstart终端”启动Docker环境。在在该环境中运行 Docker命令时,这是一个很好的解决方案。

通过Docker安装完整的CI / CD Jenkins环境时,意味着在Jenkins Docker容器中,您需要访问Docker守护程序。在尝试了许多解决方案之后,阅读了许多文章,这没有用。 @Paul Rey,非常感谢您尝试各种路线。

一个好的解决方案是获取Ubuntu虚拟机并通过Oracle VM Virtualbox安装它。然后通过this official description安装Docker 非常重要

在安装Docker之前,您当然需要安装Curl,Git等。