如何在Windows上安装Docker套接字?

pup*_*eno 5 docker docker-for-windows traefik

我正在尝试使仅在Unices上开发的Windows上的应用程序可以工作。所有这些都经过docker化,并使用traefik负载均衡器。用于运行traefik的docker的卷如下所示:

volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro,delegated
- ${PWD}/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated
Run Code Online (Sandbox Code Playgroud)

第一个卷在Mac或Linux上可以正常运行,但在Windows上可以吗?应用程序发生故障(负载均衡器给出了404),并且可能与该卷有关。当我启动映像时,套接字看起来像一个套接字:

/ # ls -laF /var/run/docker.sock
srw-rw----    1 root     root             0 Sep  2 11:04 /var/run/docker.sock=
Run Code Online (Sandbox Code Playgroud)

这管用吗?有什么测试方法吗?正确的做法是什么?

为了弄清楚这一点,我尝试将其替换为:

volumes:
- //./pipe/docker_engine:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

基于我在网上找到的各种文章和错误报告。泊坞窗映像启动,但以相同的方式失败,现在在泊坞窗容器中,它看起来像一个目录:

/ # ls -laF /var/run/docker.sock
total 4
drwxr-xr-x    2 root     root            40 Sep  3 14:52 ./
drwxr-xr-x    1 root     root          4096 Sep  3 14:57 ../
Run Code Online (Sandbox Code Playgroud)

按照Marc ABOUCHACRA的回答,我尝试了:

volumes:
- type: npipe
  source: ////./pipe/docker_engine
  target: /var/run/docker.sock
  consistency: delegated
Run Code Online (Sandbox Code Playgroud)

但这也看起来像一个目录:

/ # ls -laF /var/run/docker.sock
total 4
drwxr-xr-x    2 root     root            40 Sep  3 14:52 ./
drwxr-xr-x    1 root     root          4096 Sep  3 14:57 ../
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

volumes:
- npipe:////./pipe/docker_engine:/var/run/docker.sock:ro,delegated
Run Code Online (Sandbox Code Playgroud)

但这失败,并显示以下错误:

ERROR: Volume npipe:////./pipe/docker_engine:/var/run/docker.sock:ro,delegated has incorrect format, should be external:internal[:mode]
Run Code Online (Sandbox Code Playgroud)

整个docker-compose.yml部分如下所示:

  lb:
    image: load-balancer
    build: ${WORKSPACE}/go-home/load_balancer
    ports:
    - 80:80
    - 443:443
    links:
    - wifi-ui-dev
    - wifi-ui-prod
    - portal
    - wifi-api
    env_file:
    - .env
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock:ro,delegated
    - ${PWD}/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated
Run Code Online (Sandbox Code Playgroud)

我的问题特别是关于在Windows主机上运行此Docker映像(这是Linux)并运行Docker for Windows。我知道可以通过在另一台计算机上安装Linux或在Windows计算机上安装VM来在Linux主机上运行它。如果有一种方法可以只将套接字从Windows公开到Windows,那么我也不希望运行Windows guest。

Fab*_*bio 10

如果您不能也不想使用网络套接字,那么您可以使用命名管道。语法取决于您运行的是 Linux 容器还是 Windows 容器以及您使用的外壳。

Linux 容器

如果您在 Windows 机器上运行 Linux 容器,这似乎可以使用 Powershell 或 bash:

docker run --rm -it -v "//var/run/docker.sock://var/run/docker.sock" image_with_docker docker version
Run Code Online (Sandbox Code Playgroud)

请注意源卷和目标卷/前面的额外内容/var/run/docker.sock

Windows 容器

如果您在 Windows 机器上运行 Windows 容器,这似乎可以使用 Powershell 或 bash:

docker run -v "//./pipe/docker_engine://./pipe/docker_engine" --rm -it image-with-docker docker version
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于 Powershell:

docker run -v "\\.\pipe\docker_engine:\\.\pipe\docker_engine" --rm -it image-with-docker docker version
Run Code Online (Sandbox Code Playgroud)

因此,最好使用带有/.

额外 - docker-compose.yml

如果您使用 docker-compose.yaml 文件,这适用于 Windows 容器。

version: '3.7'

services:
  docker:
    image: image-with-docker
    command:
      - docker
      - version
    volumes:
      - type: npipe
        source: \\.\pipe\docker_engine
        target: \\.\pipe\docker_engine
Run Code Online (Sandbox Code Playgroud)

对于 Linux 容器,您可以使用缩写形式:

  docker:
    image: image-with-docker
    command:
      - docker
      - version
    volumes:
      - //var/run/docker.sock://var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

额外 - Kubernetes

如果您在 Kubernetes 的 Windows 节点上运行 Windows 容器,这似乎有效:

apiVersion: v1
kind: Pod
spec:
  containers:
    - name: docker
      image: image-with-docker
      command:
        - powershell
      args:
        - Start-Sleep
        - "999999"
      volumeMounts:
        - mountPath: \\.\pipe\docker_engine
          name: dockersock
  volumes:
    - name: dockersock
      hostPath:
        path: \\.\pipe\docker_engine
        type: null
  nodeSelector:
    kubernetes.io/os: windows
Run Code Online (Sandbox Code Playgroud)

在这种情况下,除了使用\,请注意type: nulldockersock 卷定义中的 :如果不设置它,它将不起作用。

笔记

一切都在 docker 19.03 和 Kubernetes 1.18 上进行了测试。

Client:
 Version:           19.03.3
 API version:       1.40
 Go version:        go1.12.10
 Git commit:        2355349d-
 Built:             10/14/2019 16:41:26
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.24)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:37:20 2020
  OS/Arch:          windows/amd64
  Experimental:     false
Run Code Online (Sandbox Code Playgroud)


Sve*_*ort 5

如果您在Windows上遇到以下错误:

无法为服务 portainer 创建容器:无法识别的卷规范:无法映射文件“\.\pipe\docker_engine”。在此平台上只能映射目录错误:启动项目时遇到错误。

尝试添加一个额外的斜杠,产生以下卷部分:

volumes:
  - source: \\.\pipe\docker_engine\
    target: \\.\pipe\docker_engine\
    type: npipe
Run Code Online (Sandbox Code Playgroud)

使用 compose3.7和 docker CE进行测试19.03.12


Luc*_*age 0

根据Windows 版 Docker 常见问题解答

在 Windows 版 Docker Desktop 上,客户端可以通过命名管道连接到 Docker 引擎:npipe:////./pipe/docker_engine

另请参阅GitHub 上的此问题,

Windows 版本的 docker 不使用 unix socket ( /var/run/docker.sock),而是使用 npipe ( npipe:////./pipe/docker_engine)。所以你有

  • 切换到在带有 unix 套接字的完全虚拟化 Linux 中运行 docker 的 Linux 容器
  • 将 npipe 而不是 unix 套接字传递给容器(仅限 Windows 容器)
  • 使用网络套接字(应该与 Linux 和 Windows 容器一起使用)

但是,由于这是一个 Linux 容器,您的选择是 A)在虚拟机中运行 docker(上面的第一个选择),或 B)使用网络套接字(第三个选择)。