我正在尝试使仅在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
第一个卷在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
基于我在网上找到的各种文章和错误报告。 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 ../
按照Marc ABOUCHACRA的回答,我尝试了:
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
我的问题特别是关于在Windows主机上运行此Docker映像(这是Linux)并运行Docker for Windows。我知道可以通过在另一台计算机上安装Linux或在Windows计算机上安装VM来在Linux主机上运行它。如果有一种方法可以将套接字从Windows公开到Windows,那么我也不希望运行Windows guest。
答案 0 :(得分:6)
如果您既不能也不希望使用网络套接字,则可以使用命名管道。 语法取决于您运行的是Linux容器还是Windows容器以及所使用的Shell。
如果您在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容器,这似乎可以使用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
因此,最好将版本与/
一起使用。
如果您使用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的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
答案 1 :(得分:2)
如果在Windows上遇到以下错误:
无法为服务portainer创建容器:无法识别的卷规格:无法映射文件“ \。\ pipe \ docker_engine”。在此平台上只能映射目录 错误:启动项目时遇到错误。
尝试在其上添加一个额外的斜杠,导致出现以下卷部分:
volumes:
- source: \\.\pipe\docker_engine\
target: \\.\pipe\docker_engine\
type: npipe
经过compose 3.7
和docker CE 19.03.12
的测试
答案 2 :(得分:1)
无法在绑定安装类型中使用简短语法:npipe:////./pipe/docker_engine:/var/run/docker.sock:ro,delegated
您需要在撰写文件中使用长语法:
volumes:
- type: npipe
source: ////./pipe/docker_engine
target: /var/run/docker.sock
consistency: delegated
您可以在official documentation中找到有关长语法的一些文档。此语法来自 v3.2
还请记住@ lucas-ramage关于仅在使用npipe时使用Windows容器的说法。
答案 3 :(得分:0)
在Windows的Docker桌面上,客户端可以通过命名管道
连接到Docker引擎。npipe:////./pipe/docker_engine
另请参阅此issue on 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)使用网络套接字 >(第三选择)。