【问题标题】:Docker on Windows10 home - inside docker container connect to the docker engineWindows 10 主页上的 Docker - 在 docker 容器内连接到 docker 引擎
【发布时间】:2018-09-07 07:55:01
【问题描述】:

在创建 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
      # - /var/run/docker.sock:/var/run/docker.sock
      # - /path/to/postgresql/data:/var/run/postgresql/data
      # - 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。在很多帖子上

【问题讨论】:

  • Windows10 不使用 mobylinux 虚拟机?您将自己的虚拟机设置为 virtualbox 中的主机?
  • 看来安装 linux /ubuntu VM 是最好的解决方案。我将开始尝试它。

标签: docker jenkins docker-compose


【解决方案1】:

您可以在设置中不使用 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:

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

编辑 2:

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

【讨论】:

  • 我使用了 CloudBees docker 插件。当我使用 tcp://localhost:2375 或 tcp://127.0.1:2375 或 tcp://192.168.99.100:2375 时,会出现 docker cli 无法连接到 docker daemon 的相同错误。
  • 我认为问题是容器不知道这个IP。运行 Jenkins 容器时,您必须使用选项 --network=host。我编辑我的答案来添加这个。
  • 感谢您的帮助。唉,各种选项(也与网络=主机)都没有帮助。我认为最后最好的解决方案是获得一个 Ubuntu 虚拟机并在其中安装 docker。这是建议的解决方案。我为您提供帮助并指出解决方案而投票 +1。当您使用此解决方案时,请将其作为解决方案提供,以便我将其标记为最佳解决方案。
  • 确实您可以使用 Linux 发行版,我也建议您这样做,但我知道这不是您的直接问题。而且大多数时候解决方案不能只是“更改您的操作系统”:)
  • 正如您在解决方案中看到的那样,非常感谢您的帮助。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-04-06
    • 2020-11-17
    • 1970-01-01
    • 2018-06-04
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2019-08-04
    相关资源
    最近更新 更多