Traefik docker 映像不能在 Windows 上运行但在 MacOS 上运行?
Posted
技术标签:
【中文标题】Traefik docker 映像不能在 Windows 上运行但在 MacOS 上运行?【英文标题】:Traefik docker image not working on Windows but working on MacOS? 【发布时间】:2019-12-24 08:43:52 【问题描述】:我有一个由多个 Docker 映像组成的应用程序,该应用程序正在 MacOS 上开发,我正在尝试在 Windows 上启动它。大多数似乎都在工作,但有一个 Traefik 负载均衡器没有。
在 MacOS 上它可以正常工作,但在 Windows 上,无论我访问什么 URL,它都会给我一个 404,实际内容只是“找不到 404 页面”。
Traefik 配置如下所示:
logLevel = "INFO"
defaultEntryPoints = ["http", "https"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[entryPoints.https.tls.defaultCertificate]
certFile = "/certs/cert.pem"
keyFile = "/certs/cert.pem"
# Connection to docker host system (docker.sock)
[docker]
watch = true
domain = "localhost"
[file]
[backends]
[backends.backend-mixpanel]
[backends.backend-mixpanel.servers]
[backends.backend-mixpanel.servers.mixpanel]
url = "https://api.mixpanel.com"
weight = 10
[backends.backend-yieldify]
[backends.backend-yieldify.servers]
[backends.backend-yieldify.servers.yieldify]
url = "https://td.yieldify.com/"
weight = 0
[frontends]
[frontends.frontend-mixpanel]
backend = "backend-mixpanel"
[frontends.frontend-mixpanel.routes.one]
rule = "HostRegexp:localhost,catchall:.*;Path:/mixpanel/.*;PathPrefixStripRegex:/mixpanel"
priority=10
[frontends.frontend-yieldify]
backend = "backend-yieldify"
[frontends.frontend-yieldify.routes.two]
rule = "HostRegexp:localhost,catchall:.*;Path:/yieldify/.*"
priority=0
虽然 Dockerfile 包含:
FROM traefik:alpine
RUN apk add --update openssl
RUN mkdir -p /certs
RUN openssl req -x509 -newkey rsa:2048 -keyout key.pem -out ca.pem -days 1080 -nodes -subj '/C=UK/ST=London/L=London/O=ProjectX/OU=Engineering team/CN=local.wif'
RUN cat key.pem ca.pem > /certs/cert.pem
相关的 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
当我收到 404 时,我没有收到任何内容发送到该 Docker 映像的控制台(stdout 和 stderr)。
任何想法发生了什么或如何更接近它不起作用的原因?
我担心的一个问题是套接字音量:
- /var/run/docker.sock:/var/run/docker.sock:ro,delegated
检查正在运行的容器,文件看起来像一个套接字:
/ # ls -laF /var/run/docker.sock
srw-rw---- 1 root root 0 Sep 2 11:04 /var/run/docker.sock=
以防万一,我尝试将那行替换为:
- //./pipe/docker_engine:/var/run/docker.sock
或与:
- 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 ../
【问题讨论】:
看看这些有没有帮助? github.com/danprakash/windows-dockerfiles/tree/…, github.com/StefanScherer/dockerfiles-windows/blob/…? 【参考方案1】:好的,我将尝试指导您解决一些问题。
404 not found(就像一句话) - 通常是 traefik 配置问题。不是常规网站 404。您可以通过查看 Traefik 容器的日志来验证这一点。 当 Traefik 没有以正确的顺序启动时,我遇到了类似的 404 问题。我们有时会在 Docker (Swarm) 堆栈之外单独部署 Traefik。然后我们部署堆栈(或其他组件)。您可以通过例如指定订单一个 docker-compose.yml 文件。这个'depends_on'并不准确,因为它只测试组件是否启动,而不是完全作为应用程序启动。 因为您的配置在 Mac 上运行,我的假设是 traefik 404 不是由于 Docker (Traefik) 网络配置造成的。 确定您使用的是哪个版本的 Treafik。自 Traefic 2 以来,发生了一些重要的变化。我使用:traefik:v1.7.11-alpine。 确保“traefik.enable”应明确设置为 true。我们看到,如果需要此设置,它会因环境而异。 如果您部署了一个正在运行的网站,您可以使用 Traefik 控制台(通过端口 8080)查看您已配置的内容。您会看到前端规则和后端。 环境文件是“.env”。在 Windows 上放置点文件需要特殊操作,例如通过 cygwin 或 Git bash。假设文件是存在的。关于安装和 docker.sock?
分享。在 Windows 上,打开 Docker 桌面,转到“共享驱动器”选项卡。添加驱动器,例如D 或 K。例如,我将 K 映射到例如K:\数据。 您可以在下面找到来自 docker-compose.yml 文件的一些示例。我在这些示例中使用共享“K => k:/data”。第一个示例展示了如何在 Docker for Windows 上启动一个完整的 Jenkins 环境。在 Jenkins 环境中引用了 Docker 引擎,因此在 Windows 上引用了 docker.sock。 这就是 我在我的 Docker for Windows 环境中日常使用的内容。效果很好!
version: '3'
services:
jenkins:
image: docker-jenkins-maven-npm-oc:latest
ports:
- "8888:8080"
volumes:
- //k/data/var/jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
geosolschmea:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=somedatabase
- MYSQL_USER=johan
- MYSQL_PASSWORD=bladibladibla
volumes:
- //k/data/var/mysql-data:/var/lib/mysql
ports:
- "3306:3306"
docker-compose.yml 文件中的另一个 Windows 上的 Spring 启动应用程序:
geosolutionapp:
image: myuser/geosolutions:latest
build:
context: ./
dockerfile: Dockerfile
depends_on:
- geosolschmea
environment:
- SCDATALIMIT=100000
ports:
- 8080:8080
volumes:
- //k/data/spring-boot-app:/data/spring-boot-app
networks:
- geosolutionsnet
对于 Traefik,docker-compose.yml 可能看起来像(在 Linux、Amazon EC2 上)。这也将允许您显示 Traefik 仪表板。使用它来查看您拥有哪些前端和后端。稍微改变一下卷,你就可以在 Docker for Windows 上运行它了。
如果您更改 Treafik 文件的路径,您可以轻松地在 Docker for Windows 上运行它:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- //k/data/traefik/traefik.toml:/traefik.toml
- //k/data/traefik/acme.json:/acme.json
每天在 Linux 上运行的完整工作(实时)示例是:
version: '3'
services:
traefik:
image: traefik:v1.7.11-alpine
container_name: traefik
restart: always
networks:
- geosolutionsnet
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /home/ec2-user/traefik/traefik.toml:/traefik.toml
- /home/ec2-user/traefik/acme.json:/acme.json
ports:
- "80:80"
- "443:443"
- "8080:8080"
labels:
- "traefik.docker.network=geosolutionsnet"
- "traefik.enable=true"
- "traefik.frontend.rule=Host:yourwebsite.nl;PathPrefix:/traefik"
- "traefik.port=8080"
- "traefik.protocol=http"
- "traefik.backend=traefik"
在 Docker for Windows 上使用 Traefik 时,我使用它来连接 traefik.toml 文件中的 docker 引擎:
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "yourwebsite.nl"
watch = true
exposedByDefault = false
如果您无法在 Docker for Windows 上为 Traefik 进行路由工作,您可以将其用作框架并首先从“docker hello world”示例开始,然后通过 Treafik 访问它。在 Docker for Windows 上获得基本路由工作 Traefik 后,您可以逐步添加您的真实应用程序。这可能感觉很长,但根据我们的经验,这很快就会奏效。
当然,并非所有端口都应该对外界可见。您可以使用更新版本的 docker-compose.yml 文件。
另一个使用 Treafik 的组件可能是这样的:
geosolutionapp:
image: myuser/myproduct:latest
environment:
- slackBotToken=xyz-etc
ports:
- 8080
networks:
- geosolutionsnet
labels:
- "traefik.enable=true"
- "traefik.docker.network=geosolutionsnet"
- "traefik.frontend.rule=Host:myapplication.nl"
- "traefik.port=8080"
- "traefik.protocol=http"
还有一个例子:
slackbotsimple:
image: myuser/slackbotsimple:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- traefik
environment:
- slackBotToken=xoxb-etc-etc-etc
仍然卡在 docker.sock 上?
如果上述方法没有帮助,您还可以使用如下方法:docker run -v //var/run/docker.sock:/var/run/docker.sock ... Powershell:运行 $Env:COMPOSE_CONVERT_WINDOWS_PATHS=1 Git bash:$ 导出 COMPOSE_CONVERT_WINDOWS_PATHS=1 $ docker-compose down && docker-compose up -d 确保 /var/run/docker.sock 具有正确的权限。在某些情况下,我必须通过以下方式手动设置权限: $ docker exec -u 0 -it bash ... 然后 # chmod 777 /var/run/docker.sock希望这些提示能帮助您及时解决问题!非常成功!如果您需要更多帮助,请提出问题。
【讨论】:
@pupeno - 我添加了一些例子。第一个对你来说可能很有趣。这是一个在 Docker for Windows 上运行的 Jenkins 环境。这使用 /var/run/docker.sock。每天我在 Docker for Windows 上使用这个环境。也许这些和其他示例可以帮助您找到所需的内容。 @pupeno - 环境文件是“.env”。在 Windows 上放置点文件需要特殊操作,例如通过 cygwin 或 Git bash。假设该文件确实存在。 @pupeno - 当你使用一个标准的 Traefik 容器,而不是你描述的那个容器时,它是否允许你在没有 404 的情况下正确路由?【参考方案2】:docker-compose.yml
似乎有问题
这一行:
- $PWD/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated
还有这个:
build: $WORKSPACE/go-home/load_balancer
你能用相对路径代替系统变量吗? 有的解释写here
【讨论】:
【参考方案3】:要在 Windows 上运行基于 linux 的 docker 映像,需要满足一些要求:Windows 10 Pro 或更高版本,启用 Hyper-V 支持。
您还需要安装“Docker for Windows.exe”,这是一个管理器应用程序,可设置名为:MobyLinuxVM 的“Hyper-V VM”,其中包含一个能够运行 docker 容器的最小 linux 系统。 希望对您有所帮助!
【讨论】:
我安装了适用于 Windows 的 Docker,并且作为应用程序一部分的所有其他 docker 实例都可以正常运行。以上是关于Traefik docker 映像不能在 Windows 上运行但在 MacOS 上运行?的主要内容,如果未能解决你的问题,请参考以下文章
traefik 代理后面的 docker 中的 gitlab 失败(通常)
云原生之Docker实战使用Docker部署Traefik开源边缘路由器
Nextcloud 在 traefik on unraid 后面的 docker 中