用 Docker 与 Caddy 部署个人网站

这篇笔记记录我用 Docker 搭建一个静态网站,并让它自动拥有 HTTPS 的完整过程。整个过程比我想象中简单很多,核心要归功于 Caddy 这个 Web 服务器。

为什么选 Caddy

过去配置 HTTPS 需要自己去申请证书、配置 Nginx、还要写定时任务做证书续期,步骤繁琐。Caddy 最吸引我的一点是:它默认就会自动从 Let's Encrypt 申请证书,并且在到期前自动续期,几乎不需要额外配置。

目录结构

我把整个站点组织成下面这样:

ztsj-site/
├── docker-compose.yml
├── Caddyfile
└── site/
    └── index.html

编写 Caddyfile

Caddyfile 的语法非常直观,声明域名、指定站点根目录、开启 gzip 压缩即可:

example.com {
    root * /srv
    file_server
    encode gzip
}
只要域名解析已经指向服务器、并且 80 端口对外开放,Caddy 启动后就会自动完成证书申请。

用 Docker Compose 编排

把 Caddy 跑在容器里,再把配置文件和站点目录挂载进去,数据卷用来持久化证书:

services:
  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./site:/srv:ro
      - caddy_data:/data
      - caddy_config:/config
volumes:
  caddy_data:
  caddy_config:

启动与验证

一条命令即可启动:

docker compose up -d

启动后查看日志,能看到 Caddy 完成 ACME 验证、成功签发证书的记录。这时用浏览器打开域名,地址栏已经是绿色的小锁了。

踩到的坑

小结

用 Docker + Caddy,从零到一个带 HTTPS 的网站,真正动手只花了十几分钟。容器化让环境变得干净可复制,这套思路之后也能用在更复杂的服务上。

← 返回首页