美文网首页traefik跨坑技巧工作生活
记一次用traefik做docker前端代理

记一次用traefik做docker前端代理

作者: 风吹路过的云 | 来源:发表于2019-07-04 10:49 被阅读0次

后端应用是用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微服务不可能只能在同一台主机的,对吧,这时应该如何处理呢?在网上找到一张图:

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

相关文章

网友评论

    本文标题:记一次用traefik做docker前端代理

    本文链接:https://www.haomeiwen.com/subject/lqhlhctx.html