用 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 验证、成功签发证书的记录。这时用浏览器打开域名,地址栏已经是绿色的小锁了。
踩到的坑
- 一定要先把 DNS 解析配好,否则证书的 HTTP-01 验证会失败;
- 云服务器的防火墙(安全组)要放通 80 和 443;
- 普通用户操作 Docker 需要加入 docker 组,或者用 sudo。
小结
用 Docker + Caddy,从零到一个带 HTTPS 的网站,真正动手只花了十几分钟。容器化让环境变得干净可复制,这套思路之后也能用在更复杂的服务上。
← 返回首页