Traefik代理docker服务
一、Traefik安装部署
★准备工作★
1.需要安装docker服务
2.拉取traefik镜像:
docker pull traefik:latest
Traefik简单部署
1.创建一个单独的网络
docker network create -d bridge traefik
2.编写一个简单的traefik
# docker-compose.yaml
version: "3.8"
services:
traefik:
image: traefik:latest
container_name: traefik
command:
- --log.level=INFO
- --api.insecure=true
- --providers.docker=true
- --providers.file.directory=/etc/traefik
- --providers.file.watch=true
ports:
- 80:80
- 8080:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: unless-stopped
networks:
default:
name: traefik
external: true
上面是一些简单的参数配置,通过将docker.sock文件挂载到容器里面进行读取本地docker的容器情况。
注意:docker部署的traefik主要通过command和其他服务的labels来进行代理配置,并且需要代理的服务跟traefik保持同一网络下
还可以访问8080端口来访问traefik的web页面,上面可以查看一些详细信息(如下图所示):

然而还可以查看哪些服务的路由和代理详情(如下图所示):

二、Traefik代理配置
1.不同端口代理
通过不同的端口代理到不同的服务上。在command下面添加命令
- --entrypoints.web.address=:80
- --entrypoints.demo.address=:8888
其他服务下在docker-compose文件下添加labels
labels:
# 允许接入traefik
- traefik.enable=true
# 设置代理规则方式
- traefik.http.routers.demo1.rule=PathPrefix(`/`)
# 设置默认代理的路由
- traefik.http.routers.test.entrypoints=web
# 定义service并设置代理到容器的端口
- traefik.http.routers.test.service=test-service
- traefik.http.services.test-service.loadbalancer.server.port=80
再启动之前先编写两个页面测试
# test1.html
<h1 style="text-align: center;">i am demo1</h1>
# test2.html
<h1 style="text-align: center;">i am demo2</h1>
以下是实例:
version: "3.8"
services:
traefik:
image: traefik:latest
container_name: traefik
command:
- --api.insecure=true
- --providers.docker=true
- --entrypoints.demo1.address=:80
- --entrypoints.demo2.address=:8888
ports:
- 80:80
- 8888:8888
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
demo1:
image: nginx:latest
container_name: demo1
volumes:
- ./test1.html:/usr/share/nginx/html/index.html
labels:
- traefik.enable=true
- traefik.http.routers.demo1.rule=PathPrefix(`/`)
- traefik.http.routers.demo1.entrypoints=demo1
- traefik.http.routers.demo1.service=demo1-service
- traefik.http.services.demo1-service.loadbalancer.server.port=80
demo2:
image: nginx:latest
container_name: demo2
volumes:
- ./test2.html:/usr/share/nginx/html/index.html
labels:
- traefik.enable=true
- traefik.http.routers.demo2.rule=PathPrefix(`/`)
- traefik.http.routers.demo2.entrypoints=demo2
- traefik.http.routers.demo2.service=demo2-service
- traefik.http.services.demo2-service.loadbalancer.server.port=80
networks:
default:
name: traefik
external: true
启动分别访问80端口和8888端口


可以发现通过不同端口访问的服务页面不同,说明我们配置成功!!!
2.不同域名代理
通过以下配置进行区分
demo1的labels配置:
# 设置代理规则方式为Host
- traefik.http.routers.demo1.rule=Host(`www.demo1.com`)
# 设置默认代理的路由
- traefik.http.routers.demo1.entrypoints=web
# 定义service并设置代理到容器的端口
- traefik.http.routers.demo1.service=demo1-service
- traefik.http.services.demo1-service.loadbalancer.server.port=80
demo2的labels配置:
# 设置代理规则方式为Host
- traefik.http.routers.demo2.rule=Host(`www.demo2.com`)
# 设置默认代理的路由
- traefik.http.routers.demo2.entrypoints=web
# 定义service并设置代理到容器的端口
- traefik.http.routers.demo2.service=demo1-service
- traefik.http.services.demo2-service.loadbalancer.server.port=80
3.不同路由配置
比如/admin路由指向demo1,/api路由指向demo2配置如下:
demo1的labels配置:
# 设置代理规则方式为Host和PathPrefix同时一起使用
- traefik.http.routers.demo1.rule=Host(`www.demo1.com`) && PathPrefix(`/admin`)
demo2的labels配置:
# 设置代理规则方式为Host和PathPrefix同时一起使用
- traefik.http.routers.demo2.rule=Host(`www.demo2.com`) && PathPrefix(`/api`)
4.多个路由设置
可以通过使用&&方式来添加域名和路由,如下所示:
- traefik.http.routers.demo1.rule=Host(`www.demo1.com`) && PathPrefix(`/admin`) && PathPrefix(`/api`)
也可以通过","号隔开写在括号里,如下所示
- traefik.http.routers.demo1.rule=Host(`www.demo1.com`) && PathPrefix(`/admin`, `/api`)
三、其他配置
1.https证书自动申请配置
首先需要配置command以及挂载使得申请的证书能够持久保存:
command:
......
# 开启80和443端口
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
# 设置ssl证书申请
- --certificatesresolvers.demo.acme.dnschallenge=true
# 设置厂商为腾讯云,设置为阿里云则把tencentcloud改成alidns
- --certificatesresolvers.demo.acme.dnschallenge.provider=tencentcloud
#- --certificatesresolvers.cloudflare.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
- --certificatesresolvers.demo.acme.email=aikushaonian@163.com
# 设置证书保存的路径
- --certificatesresolvers.demo.acme.storage=/letsencrypt/acme.json
volumes:
- ./letsencrypt:/letsencrypt
需要配置变量设置对应云的ak和sk:
environment:
# 腾讯云的配置
- TENCENTCLOUD_SECRET_ID=xxxxxxxxxxx
- TENCENTCLOUD_SECRET_KEY=xxxxxxxxxxx
# 阿里云的配置
- ALICLOUD_ACCESS_KEY=xxxxxxxxxxxxxxxx
- ALICLOUD_SECRET_KEY=xxxxxxxxxxxxxxxx
- ALICLOUD_REGION_ID=cn-hangzhou
然后再在服务的labels配置信息
labels:
......
# 开启tls认证
- traefik.http.routers.demo.tls=true
# 这里要指向command中acme使用的名字上面是demo
- traefik.http.routers.demo.tls.certresolver=demo
# 设置证书的主域名,一般为泛域名
- traefik.http.routers.demo.tls.domains[0].main=*.demo.com
2.http重定向到https配置
配置重定向只需要配置服务的labels块就好,如下所示:
labels:
......
- traefik.http.routers.demo.entrypoints=web
- traefik.http.routers.demo.middlewares=https-redirect
- traefik.http.middlewares.https-redirect.redirectscheme.scheme=https
根据上面的访问web的端口就是80时自动重定向到https
3.http和https同时支持配置
直接在服务的labels块配置即可,如下所示:
labels:
- traefik.enable=true
# 配置http访问方式
- traefik.http.routers.demo.rule=Host(`www.demo.com`)
- traefik.http.routers.demo.entrypoints=web
- traefik.http.routers.demo.service=demo-service
# 配置https访问方式
- traefik.http.routers.demo-https.rule=Host(`www.demo.com`)
- traefik.http.routers.demo-https.entrypoints=websecure
- traefik.http.routers.demo-https.tls=true
- traefik.http.routers.demo-https.tls.certresolver=demo
- traefik.http.routers.demo-https.tls.domains[0].main=*.demo.com
- traefik.http.routers.demo-https.service=demo-service
# 配置service访问容器端口,只要是这个service都指向容器这个端口
- traefik.http.services.demo-service.loadbalancer.server.port=80