Traefik开源的反向代理程序,支持Docker、HTTPS、Let's Encrypt(自动获取证书和更新)、动态更新、快速、配置简单。
使用Docker公布应用时一般是使用“Nginx + Consul-Template”、“Fabio + Consul”或者“Traefik”完成反向代理将多个不同域名和不同路径的应用公开到网上。
Traefik可以不依赖其它程序,使用比较简单,直接从Docker获取Container建立时的标签信息,根据标签建立后端应用的访问方式。
用Traefik发布站点并添加HTTPS支持
一个简单的例子,在主机上有个需要HTTPS支持的站点,运行在Docker容器中,我们通过Traefik为这个站点绑定域名,并且自动添加HTTPS支持。
注意:需要可以同时通过HTTP和HTTPS访问。
配置前端Traefik
准备运行目录及相关文件
mkdir -p traefik/{letsencrypt,}
cd traefik
touch letsencrypt/acme.json
建立网络配置,虽然docker-compose可以自己默认建立网络配置,在这里我们先人工给他建立
docker network create webrouter
编辑docker-compose.yaml文件
version: '3.5'
services:
webrouter:
# The official v2.0 Traefik docker image
image: traefik:v2.0
# Enables the web UI and tells Traefik to listen to docker
command:
#- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.default.acme.httpchallenge=true"
- "--certificatesresolvers.default.acme.httpchallenge.entrypoint=web"
#- "--certificatesresolvers.default.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
- "--certificatesresolvers.default.acme.email=jilili@aliyun.com"
- "--certificatesresolvers.default.acme.storage=/letsencrypt/acme.json"
labels:
- "traefik.docker.network=webrouter"
ports:
# The HTTP port
- "80:80"
# The HTTPS port
- "443:443"
# The Web UI (enabled by --api.insecure=true)
- "8080:8080"
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
- "./letsencrypt:/letsencrypt"
#- "/var/run/docker.sock:/var/run/docker.sock:ro"
networks:
- webrouter
networks:
webrouter:
external: true
至此traefik的配置工作已经准备好了,可以启动traefik容器了。
docker-compose up -d
建立后端应用
下来我们进行后端应用的建立,可以使用docker-compose或者docker run完成。
mkdir whoami && cd whoami
vi docker-compose.yaml
编辑文件内容
version: '3'
services:
whoami:
# A container that exposes an API to show its IP address
image: containous/whoami
labels:
- traefik.enable=true
- traefik.docker.network=webrouter
- traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)
- traefik.http.routers.whoami.entrypoints=web
- traefik.http.routers.whoami-https.rule=Host(`whoami.docker.localhost`)
- traefik.http.routers.whoami-https.entrypoints=websecure
- traefik.http.routers.whoami-https.tls.certresolver=default
ports:
# The HTTP port
- "80:80"
networks:
- webrouter
networks:
webrouter:
external: true
启动后端应用
docker-compose up -d
大功告成进行结果测试
curl -H Host:whoami.docker.localhost http://127.0.0.1
curl -H Host:whoami.docker.localhost https://127.0.0.1
将HTTP转向HTTPS
在后端容器的标签中加入如下内容。
-l "traefik.http.middlewares.$container.redirectscheme.scheme=https" \
-l "traefik.http.routers.$container.middlewares=$container@docker" \
