使用Traefik在Docker Compose配置上全站自动HTTPS

之前发过一篇关于用cert-manager管理HTTPS证书的文章,那个是在Kubernetes上,但是目前还有大量的初创团队,基于种种原因还没能使用Kubernetes。 今天就快速分享一下在Docker Compose的环境,如何快速自动化配置HTTPS。

使用

我们需要有几项准备:

  1. 提前配置好域名的DNS解析
  2. 准备一个用于接收证书过期等消息的email地址
  3. 已有的docker化的服务

在此我们假设,需要配置的域名是whoami.initstack.net,通知的email是username@example.com,已准备好的服务如下:

version: '3'

services:
  whoami:
    image: containous/whoami:v1.5.0
	environment:
	  - WHOAMI_NAME=initStack
	ports:
	  - "80:80"

那么,我们最终的docker-compose.yaml文件如下:

version: '3'

volumes:
  letsencrypt: {}

services:
  whoami:
    image: containous/whoami:v1.5.0
    environment:
      - WHOAMI_NAME=initStack
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.initstack.net`)"
      - "traefik.http.routers.whoami.entrypoints=websecure"
      - "traefik.http.routers.whoami.tls=true"
      - "traefik.http.routers.whoami.tls.certresolver=myresolver"
  traefik:
    image: "traefik:v2.3"
    container_name: "traefik"
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.myresolver.acme.email=username@example.com"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - letsencrypt:/letsencrypt

上面的配置文件中,映射的letsencrypt volume,用于把生成的证书持久化,方便容器重新生成之后可用。

映射的docker.sock volume,是为了让traefik能够读取到docker有哪些服务是需要配置代理,以及如何代理。

traefik的命令中的certificatesresolvers相关命令,是说明用什么方式去申请证书。

参考资料