docker 如何在Windows上挂载扩展坞插槽?

ifmq2ha2  于 2022-12-22  发布在  Docker
关注(0)|答案(5)|浏览(158)

我正在尝试让一个只在Unice上开发的应用程序在Windows上运行。它是完全dockerized的,并且使用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

第一个卷在Mac或Linux上工作正常,但在Windows上呢?The application is failing (the load balancer is giving a 404),它可能与该卷有关。当我启动映像时,套接字看起来像一个套接字:

/ # ls -laF /var/run/docker.sock
srw-rw----    1 root     root             0 Sep  2 11:04 /var/run/docker.sock=

这有用吗?有什么方法可以测试吗?正确的方法是什么?
为了弄明白,我试着用这个来代替:

volumes:
- //./pipe/docker_engine:/var/run/docker.sock

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

/ # 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 ../

按照马克·阿布查克拉的回答,我尝试着:

volumes:
- type: npipe
  source: ////./pipe/docker_engine
  target: /var/run/docker.sock
  consistency: delegated

但它看起来也像一个目录

/ # 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 ../

我也试过这个:

volumes:
- npipe:////./pipe/docker_engine:/var/run/docker.sock:ro,delegated

但失败时会出现以下错误:

ERROR: Volume npipe:////./pipe/docker_engine:/var/run/docker.sock:ro,delegated has incorrect format, should be external:internal[:mode]

整个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

我的问题特别是关于运行这个Docker映像,它是一个Linux,在Windows主机上运行Docker for Windows。我知道我可以通过在另一台机器上安装Linux或在Windows机器上安装VM来在Linux主机上运行它,这是等效的。运行Windows访客也不是我所追求的,因为有一种方法可以只将套接字从Windows暴露到Windows。

ny6fqffe

ny6fqffe1#

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

Linux容器

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

docker run --rm -it -v "//var/run/docker.sock://var/run/docker.sock" image_with_docker docker version

请注意/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

请注意,这只适用于Powershell:

docker run -v "\\.\pipe\docker_engine:\\.\pipe\docker_engine" --rm -it image-with-docker docker version

因此,最好使用/版本。

额外-停靠-编写.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

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

docker:
    image: image-with-docker
    command:
      - docker
      - version
    volumes:
      - //var/run/docker.sock://var/run/docker.sock

额外- 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

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

注解

在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
uajslkp6

uajslkp62#

如果在windows上遇到以下错误:
无法为服务portainer创建容器:无法识别的体积规格:无法Map文件“.\pipe\docker_engine”。在此平台上只能Map目录错误:启动项目时遇到错误。
尝试添加一个额外的斜线到它,导致以下卷部分:

volumes:
  - source: \\.\pipe\docker_engine\
    target: \\.\pipe\docker_engine\
    type: npipe

使用组合3.7和对接器CE 19.03.12进行测试

bnlyeluc

bnlyeluc3#

不能对绑定装载的类型使用简短语法:第一个月
您需要在合成文件中使用长语法:

volumes:
  - type: npipe
    source: ////./pipe/docker_engine
    target: /var/run/docker.sock
    consistency: delegated

你可以在官方文档中找到一些关于长语法的文档。这个语法来自v3.2
还要记住@lucas-ramage所说的关于只有在使用npipe时才使用windows容器的话。

67up9zun

67up9zun4#

根据Docker for Windows常见问题解答,
在Docker Desktop for Windows上,客户端可以通过命名管道连接到Docker引擎:第一个月
另请参阅GitHub上的本期文章,
windows版本的docker不使用unix套接字(/var/run/docker.sock),而是使用npipe(npipe:////./pipe/docker_engine)。

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

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

mpbci0fu

mpbci0fu5#

在2022年,在Windows 11上,对我起作用的是下面的卷配置(注意配置的主机端的双斜线(//)。不知道为什么docker_enginer变体对我不起作用。

-v "//var/run/docker.sock:/var/run/docker.sock"

相关问题