Windows Server 2016上Traefik无法连接Docker守护进程求助
问题:Traefik无法连接Windows Server 2016上的本地Docker守护进程
我正尝试在Windows Server 2016服务器上运行Traefik,但它无法连接本地Docker守护进程,出现以下错误:
traefik_1 | time="2018-05-17T11:21:25-04:00" level=error msg="Failed to retrieve information of the docker client and server host: error during connect: Get http://192.168.32.1:2376/v1.24/version: dial tcp 192.168.32.1:2376: connectex: No connection could be made because the target machine actively refused it."
我的daemon.json文件内容为:
{"graph": "E:\\Docker"}
以下是c:\>docker system info的输出结果:
Containers: 1 Running: 0 Paused: 0 Stopped: 1 Images: 10 Server Version: 17.06.2-ee-10 Storage Driver: windowsfilter Windows: Logging Driver: json-file Plugins: Volume: local Network: l2bridge l2tunnel nat null overlay transparent Log: awslogs etwlogs fluentd json-file logentries splunk syslog Swarm: inactive Default Isolation: process Kernel Version: 10.0 14393 (14393.2214.amd64fre.rs1_release_1.180402-1758) Operating System: Windows Server 2016 Standard OSType: windows Architecture: x86_64 CPUs: 4 Total Memory: 2.386GiB Name: dockerServer ID: QOKM:O5QE:XOMZ:YNQN:JGT2:XAWN:DIUG:3K3H:M725:CADH:G6NE:Y5RK Docker Root Dir: E:\Docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false
以下是API版本请求的输出:
PS C:\Windows\system32> invoke-webrequest http://192.168.32.1:2376/v1.24/version
StatusCode : 200 StatusDescription : OK Content : {"Platform":{"Name":""},"Components":[{"Name":"Engine","Version":"17.06.2-ee-10","Details":{"ApiVersion":"1.30","Arch":"amd64","BuildTime":"2018-04-27T00:54:58.493613431+00:00","Experimental":"false",... RawContent : HTTP/1.1 200 OK Api-Version: 1.30 Docker-Experimental: false Ostype: windows Content-Length: 633 Content-Type: application/json Date: Tue, 22 May 2018 11:53:35 GMT Server: Docker/17.06.2-ee-10 ... Forms : {} Headers : {[Api-Version, 1.30], [Docker-Experimental, false], [Ostype, windows], [Content-Length, 633]...} Images : {} InputFields : {} Links : {} ParsedHtml : System.__ComObject RawContentLength : 633
请问有什么解决办法吗?
解决办法
我之前在Windows Server上部署Traefik时遇到过类似的问题,结合你的情况,给你几个可行的思路:
1. 使用npipe协议连接Docker守护进程(推荐)
在Windows环境下,容器访问宿主机的Docker守护进程,最可靠的方式是使用命名管道(npipe),而不是TCP。如果你的Traefik是通过Docker Compose运行的,需要调整配置:
- 在Compose文件中挂载Windows的Docker管道,并指定Traefik的Docker端点为npipe路径:
version: '3' services: traefik: image: traefik:v1.7 # 匹配你使用的Traefik版本(从日志看是旧版,v1.7系列更兼容) ports: - "80:80" - "8080:8080" volumes: # 挂载宿主机的Docker命名管道到容器内 - "//./pipe/docker_engine://./pipe/docker_engine" # 如果有自定义配置文件也挂载进来 - "./traefik.toml:/etc/traefik/traefik.toml" command: - "--api" - "--docker" - "--docker.endpoint=npipe:////./pipe/docker_engine" - "--docker.exposedbydefault=false"
- 如果用的是toml配置文件,在
[docker]段添加:
[docker] endpoint = "npipe:////./pipe/docker_engine" exposedByDefault = false
2. 修正TCP连接的配置
如果你坚持使用TCP连接,需要解决容器到宿主机的网络可达性问题:
- 更新Docker守护进程配置:在
daemon.json中添加TCP监听的hosts,确保Docker在所有网卡上监听2376端口:
{ "graph": "E:\\Docker", "hosts": ["npipe:////./pipe/docker_engine", "tcp://0.0.0.0:2376"] }
修改后必须重启Docker服务才能生效。
- 调整Traefik的端点地址:在容器内,用
host.docker.internal代替192.168.32.1,这个地址是Docker for Windows提供的宿主机别名,容器内可以直接解析到宿主机:- 在Traefik命令行参数中设置:
--docker.endpoint=http://host.docker.internal:2376/v1.30(注意API版本要匹配你的Docker版本,你的Docker API是1.30,而不是你之前用的1.24)
- 在Traefik命令行参数中设置:
3. 检查防火墙规则
虽然你本地能访问192.168.32.1:2376,但容器的流量可能被Windows防火墙拦截。可以临时关闭防火墙测试是否能连接,如果可行,再添加一条允许容器网络访问2376端口的入站规则。
4. 匹配Traefik与Docker的API版本
你的Docker API版本是1.30,但Traefik默认请求的是1.24,版本不匹配也可能导致连接问题。在Traefik配置中显式指定API版本:
- 命令行参数:
--docker.apiVersion=1.30 - 或者在toml配置中:
[docker] apiVersion = "1.30"
内容的提问来源于stack exchange,提问作者user1401809
相关产品推荐
相关产品推荐

