Traefik代理docker服务

TOC

一、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.001
然而还可以查看哪些服务的路由和代理详情(如下图所示):
traefik.002

二、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端口
traefik.003
traefik.004
可以发现通过不同端口访问的服务页面不同,说明我们配置成功!!!

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