后端应用是用springboot写的一个简单应用,hello world之类的app
制作docker镜像的Dockerfile如下,非常简单
FROM openjdk:8u212
WORKDIR /app
ADD app.jar /app
EXPOSE 5555 8080
build java的镜像
docker build -t app:v1 .
跑java app的docker-compose.yml如下:
version: '3'
services:
java-app:
image: app:v1
networks:
- web
restart: always
tty: true
volumes:
- /data/wwwroot/demo:/app
working_dir: /app
labels:
- "traefik.backend=java-app"
- "traefik.port=8080"
- "traefik.frontend.rule=app.example"
command: java -jar -Duser.timezone=GMT+08 app.jar
networks:
web:
external:
name: traefik_net
traefik是用docker-compose跑起来的,docker-compose.yml如下:
version: '2'
services:
proxy:
image: traefik
tty: true
command: --web --docker --docker.domain=docker.localhost --logLevel=DEBUG
networks:
- net
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /dev/null:/traefik.toml
networks:
net:
driver: bridge
注意上面跑java的docker-compose.yml中的labels部分,
- "traefik.frontend.rule=app.example"
这样跑的traefik,会报一个错误信息:
DEBU[2019-07-04T01:29:12Z] Creating server server-new-proxy-1-bd8b6835d0c175bf0727d5734b51ccf3 at http://172.28.0.2:80 with weight 1
DEBU[2019-07-04T01:29:12Z] Creating route route-frontend-Host-proxy-new-docker-localhost-1 Host:proxy.new.docker.localhost
DEBU[2019-07-04T01:29:12Z] Wiring frontend frontend-app-example-0 to entryPoint http
DEBU[2019-07-04T01:29:12Z] Creating backend backend-java-app
DEBU[2019-07-04T01:29:12Z] Adding TLSClientHeaders middleware for frontend frontend-app-example-0
DEBU[2019-07-04T01:29:12Z] Creating load-balancer wrr
DEBU[2019-07-04T01:29:12Z] Creating server server-new-java-app-1-003222631a3fdbfaee629ded4097c709 at http://172.28.0.3:80 with weight 1
ERRO[2019-07-04T01:29:12Z] error creating route for frontend frontend-app-example-0: error parsing rule: error parsing rule: 'app.example'. Unknown function: 'app.example'. Skipping frontend frontend-app-example-0...
INFO[2019-07-04T01:29:12Z] Server configuration reloaded on :8080
INFO[2019-07-04T01:29:12Z] Server configuration reloaded on :80
这里也是最耗我时间的地方,耗了我一天一晚的时间,一直没成功,一直google,百度找原因,自己坑了自己,也是没仔细查看traefik日志导致的,坑死了!:(
这段错误日志已告诉你,creating route的时候出错了,也就是说
- "traefik.frontend.rule=app.example"
我这里写错了,再来仔细对比网上的教程,看别人的写法,原来少写了个Host,正确的写法如下:
- "traefik.frontend.rule=Host:app.example"
所以,跑java app正确的docker-compose.yml应该如下:
version: '3'
services:
java-app:
image: app:v1
networks:
- web
restart: always
tty: true
volumes:
- /data/wwwroot/demo:/app
working_dir: /app
labels:
- "traefik.backend=java-app"
- "traefik.port=8080"
- "traefik.frontend.rule=Host:app.example"
command: java -jar -Duser.timezone=GMT+08 app.jar
networks:
web:
external:
name: traefik_net
再来讨论下制作java docker镜像时的Dockerfile,注意里面有个EXPOSE 5555 8080,这个意思是说这个java app,会使用两个端口,这会给traefik带来麻烦,如果你不给traefik指明要用哪个端口,traefik会报502后端错误,因为它不知道它要将请求转发给后端的哪个端口,所以labels部分,要明确指明使用8080端口:
- "traefik.port=8080"
好了,这就是我在试验使用traefik过程中,遇到的一个小坑,希望朋友们少走弯路。
另外,我自己也有个问题,当然我还没有去尝试的,问题是:部署的docker实例要和traefik使用同一个网络栈,也就是说docker实例要和traefik部署在同一主机,java app微服务不可能只能在同一台主机的,对吧,这时应该如何处理呢?在网上找到一张图:

也就是说,在traefik前面用nginx做转发!
原文链接:https://mritd.me/2018/05/24/kubernetes-traefik-service-exposure/
不知这样是否可解决,我未尝试!
网友评论