如何在Windows上安装docker套接字?
我正在尝试让一个只在Unices上开发的应用程序在Windows上运行。它是完全固定的,并且使用traefik负载平衡器。用于运行traefik的docker的卷如下所示:如何在Windows上安装docker套接字?,docker,traefik,docker-for-windows,Docker,Traefik,Docker For Windows,我正在尝试让一个只在Unices上开发的应用程序在Windows上运行。它是完全固定的,并且使用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 lb: image: load
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro,delegated
- ${PWD}/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated
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
第一个卷在Mac或Linux上运行良好,但在Windows上运行吗?它可能和那个体积有关。启动图像时,套接字看起来像一个套接字:
/ # 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 ../
/ # 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 ../
/ # 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
部分如下所示:
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro,delegated
- ${PWD}/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated
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 for Windows的Linux docker映像的。我知道我可以通过在另一台机器上安装Linux或在Windows机器上安装VM在Linux主机上运行它,这是等效的。运行Windows来宾也不是我想要的,因为有一种方法可以只将套接字从Windows暴露到Windows。
在Docker Desktop for Windows上,客户端可以通过命名管道连接到Docker引擎:npipe:////./pipe/docker_engine
又见此,
windows版本的docker不使用unix套接字(/var/run/docker.sock
),而是使用npipe(npipe:////./pipe/docker_engine
)。所以你要么
- 切换到linux容器,该容器在带有unix套接字的完全虚拟化linux中运行docker
- 将npipe而不是unix套接字传递到容器(仅限windows容器)
- 使用网络套接字(应与linux和windows容器配合使用)
但是,由于这是一个Linux容器,您可以选择a)在虚拟机中运行docker(上面的第一个选择),或者B)使用网络套接字(第三个选择)。无法对绑定装载的类型使用简短语法:
npipe:////./pipe/docker_engine:/var/run/docker.sock:ro,委托
您需要在撰写文件中使用长语法:
volumes:
- type: npipe
source: ////./pipe/docker_engine
target: /var/run/docker.sock
consistency: delegated
您可以在中找到一些关于长语法的文档。此语法来自v3.2
还请记住@lucas ramage所说的仅在使用npipe时使用windows容器如果您不能也不想使用网络套接字,则可以使用命名管道。 语法取决于您是运行Linux还是Windows容器以及所使用的shell Linux容器 如果您在Windows计算机上运行Linux容器,这似乎可以使用Powershell或bash:
docker-run-rm-it-v//var/run/docker。sock://var/run/docker.sock“图像\u与\u docker docker版本
请注意源卷和目标卷的/
前面的额外/var/run/docker.sock
Windows容器
如果您在Windows计算机上运行Windows容器,这似乎可以使用Powershell或bash:
docker-run-v///pipe/docker_engine://./pipe/docker_engine“--rm-具有docker docker版本的it映像
请注意,这仅适用于Powershell:
docker-run-v“\\.\pipe\docker\u引擎:\\.\pipe\docker\u引擎”--rm-it图像与docker-docker版本
因此,最好使用带有/
的版本
额外-docker-compose.yml
如果使用docker-compose.yaml文件,则该文件适用于Windows容器
版本:“3.7”
服务:
码头工人:
图像:与docker的图像
命令:
-码头工人
-版本
卷数:
-类型:npipe
来源:\\.\pipe\docker\u引擎
目标:\\.\pipe\docker\u引擎
对于Linux容器,您可以使用缩写形式:
docker:
图像:与docker的图像
命令:
-码头工人
-版本
卷数:
-//var/run/docker。sock://var/run/docker.sock
额外库伯内特斯
如果您在Kubernetes中的Windows节点上运行Windows容器,则这似乎是可行的:
apiVersion:v1
种类:豆荚
规格:
容器:
-姓名:docker
图像:与docker的图像
命令:
-动力壳
args:
-开始睡觉
- "999999"
体积数量:
-装载路径:\\.\pipe\docker\u引擎
名称:dockersock
卷数:
-名称:dockersock
主机路径:
路径:\\.\pipe\docker\u引擎
类型:null
节点选择器:
kubernetes.io/os:windows
在这种情况下,除了使用\
,请注意dockersock卷定义中的类型: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
如果在windows上遇到以下错误: 无法为服务portainer创建容器:无法识别的卷规范:文件“\。\pipe\docker\u engine”无法映射。此平台上只能映射目录 错误:在启动项目时遇到错误 尝试向其添加一个额外的斜杠,从而生成以下卷部分:
volumes:
- source: \\.\pipe\docker_engine\
target: \\.\pipe\docker_engine\
type: npipe
使用compose
3.7
和docker CE19.03.12
进行测试,这有帮助吗@TarunLalwani:这就是我学习/pipe/docker\u引擎的地方,但是这两个链接都没有提到卷:
,所以我不确定语法是什么。这种语法没有崩溃,但我不确定它是否有效(docker映像不起作用,但我不知道这是否与套接字或其他内容有关)。您能提供整个docker文件以便我们尝试找出答案吗?我认为术语有误导性-您绑定了