我有一个应用程序,它由在MacOS上开发的几个Docker映像组成,我正在尝试使其在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 ../
答案 0 :(得分:1)
好的,我会尽力指导您解决许多问题。
关于安装和docker.sock?
第一个示例显示了如何在适用于Windows的Docker上启动完整的Jenkins环境。在Jenkins环境中,对Docker Engine进行了引用,因此对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"
Windows上另一个docker-compose.yml文件中的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仪表板。使用它来查看您拥有哪些前端和后端。稍微更改卷即可在Windows的Docker上运行它。
如果您更改Treafik文件的路径,则可以在Windows的Docker上轻松运行它:
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"
在Windows版Docker上使用Traefik时,我使用它来连接traefik.toml文件中的Docker引擎:
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "yourwebsite.nl"
watch = true
exposedByDefault = false
如果您在Windows的Docker上无法获得Traefik的路由工作,可以将其用作框架,首先从“ docker hello world”示例开始,然后通过Treafik对其进行访问。获得适用于Windows的Docker上的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上吗?
我希望这些技巧能帮助您及时解决问题!大获成功!询问问题是否需要更多帮助。
答案 1 :(得分:0)
要在Windows上运行基于Linux的docker映像,需要满足一些要求:Windows 10 Pro或更高版本,并启用了Hyper-V支持。
您还需要安装“ Docker for Windows.exe”,这是一个管理器应用程序,用于设置名为“ MobyLinuxVM”的“ Hyper-V VM”,其中包含一个最小的Linux系统,能够运行Docker容器。 希望有帮助!
答案 2 :(得分:0)
看起来像docker-compose.yml
的问题
此行:
- ${PWD}/load_balancer/traefik.toml:/etc/traefik/traefik.toml:ro,delegated
还有一个:
build: ${WORKSPACE}/go-home/load_balancer
可以使用相对路径代替系统变量吗? here
给出了一些解释