我正在尝试让一个只在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。
5条答案
按热度按时间ny6fqffe1#
如果你不能也不想使用网络套接字,那么你可以使用命名管道。语法取决于你运行的是Linux还是Windows容器,以及你使用的shell。
Linux容器
如果您在Windows机器上运行Linux容器,使用Powershell或bash似乎可以做到这一点:
请注意
/var/run/docker.sock
前面的额外/
,包括源卷和目标卷。Windows容器
如果您在Windows机器上运行Windows容器,使用Powershell或bash似乎可以实现此功能:
请注意,这只适用于Powershell:
因此,最好使用
/
版本。额外-停靠-编写.yml
如果使用docker-compose.yaml文件,则此操作适用于Windows容器。
对于Linux容器,您可以使用缩写形式:
额外- Kubernetes
如果您在Kubernetes中的Windows节点上运行Windows容器,这似乎可以工作:
在这种情况下,除了使用
\
之外,请注意dockersock卷定义中的type: null
:如果不设置它,它将不起作用。注解
在Docker 19.03和Kubernetes 1.18上对所有部件进行了测试。
uajslkp62#
如果在windows上遇到以下错误:
无法为服务portainer创建容器:无法识别的体积规格:无法Map文件“.\pipe\docker_engine”。在此平台上只能Map目录错误:启动项目时遇到错误。
尝试添加一个额外的斜线到它,导致以下卷部分:
使用组合
3.7
和对接器CE19.03.12
进行测试bnlyeluc3#
不能对绑定装载的类型使用简短语法:第一个月
您需要在合成文件中使用长语法:
你可以在官方文档中找到一些关于长语法的文档。这个语法来自v3.2
还要记住@lucas-ramage所说的关于只有在使用npipe时才使用windows容器的话。
67up9zun4#
根据Docker for Windows常见问题解答,
在Docker Desktop for Windows上,客户端可以通过命名管道连接到Docker引擎:第一个月
另请参阅GitHub上的本期文章,
windows版本的docker不使用unix套接字(
/var/run/docker.sock
),而是使用npipe(npipe:////./pipe/docker_engine
)。但是,由于这是一个Linux容器,您的选项是A)在虚拟机中运行docker(上面的第一个选项),或者B)使用网络套接字(第三个选项)。
mpbci0fu5#
在2022年,在Windows 11上,对我起作用的是下面的卷配置(注意配置的主机端的双斜线(//)。不知道为什么docker_enginer变体对我不起作用。