之前发过一篇关于用cert-manager管理HTTPS证书的文章,那个是在Kubernetes上,但是目前还有大量的初创团队,基于种种原因还没能使用Kubernetes。 今天就快速分享一下在Docker Compose的环境,如何快速自动化配置HTTPS。
使用
我们需要有几项准备:
- 提前配置好域名的DNS解析
- 准备一个用于接收证书过期等消息的email地址
- 已有的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相关命令,是说明用什么方式去申请证书。