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" \