Docker 部署 #
概述 #
Docker 是部署 Caddy 的推荐方式之一,可以快速启动、易于管理、便于扩展。
text
┌─────────────────────────────────────────────────────────────┐
│ Docker 部署架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Docker Host │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ Caddy Container │ │ │
│ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │
│ │ │ │ :80 │ │ :443 │ │ :2019 │ │ │ │
│ │ │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │
│ │ └───────┼────────────┼────────────┼──────────┘ │ │
│ │ │ │ │ │ │
│ │ ┌───────┴────────────┴────────────┴──────────┐ │ │
│ │ │ Volumes │ │ │
│ │ │ /etc/caddy /data /config /srv │ │ │
│ │ └────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
基本使用 #
快速启动 #
bash
# 最简单的启动方式
docker run -d \
--name caddy \
-p 80:80 \
-p 443:443 \
-p 443:443/udp \
-v /path/to/Caddyfile:/etc/caddy/Caddyfile \
-v /path/to/site:/srv \
-v caddy_data:/data \
-v caddy_config:/config \
caddy:latest
验证运行 #
bash
# 查看容器状态
docker ps
# 查看日志
docker logs caddy
# 进入容器
docker exec -it caddy sh
Docker Compose #
基本配置 #
yaml
# docker-compose.yml
version: "3.8"
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./site:/srv
- caddy_data:/data
- caddy_config:/config
environment:
- TZ=Asia/Shanghai
volumes:
caddy_data:
caddy_config:
启动服务 #
bash
# 启动
docker-compose up -d
# 查看日志
docker-compose logs -f caddy
# 重载配置
docker-compose exec caddy caddy reload --config /etc/caddy/Caddyfile
# 停止
docker-compose down
完整配置示例 #
静态网站 #
yaml
version: "3.8"
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./site:/srv
- caddy_data:/data
- caddy_config:/config
environment:
- TZ=Asia/Shanghai
networks:
- web
networks:
web:
driver: bridge
volumes:
caddy_data:
caddy_config:
caddyfile
# Caddyfile
example.com {
root * /srv
file_server
encode gzip zstd
log {
output file /var/log/caddy/access.log
}
}
反向代理 #
yaml
version: "3.8"
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
environment:
- TZ=Asia/Shanghai
networks:
- app-network
depends_on:
- app
app:
image: node:18-alpine
container_name: app
restart: unless-stopped
working_dir: /app
volumes:
- ./app:/app
command: npm start
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
caddy_data:
caddy_config:
caddyfile
# Caddyfile
example.com {
reverse_proxy app:3000
}
多服务架构 #
yaml
version: "3.8"
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
- "2019:2019"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
environment:
- TZ=Asia/Shanghai
networks:
- frontend
- backend
# Web 前端
web:
image: nginx:alpine
container_name: web
restart: unless-stopped
volumes:
- ./web:/usr/share/nginx/html
networks:
- frontend
# API 服务
api:
image: node:18-alpine
container_name: api
restart: unless-stopped
working_dir: /app
volumes:
- ./api:/app
command: npm start
networks:
- backend
# 数据库
db:
image: postgres:15-alpine
container_name: db
restart: unless-stopped
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
POSTGRES_DB: app
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
networks:
frontend:
backend:
volumes:
caddy_data:
caddy_config:
db_data:
caddyfile
# Caddyfile
example.com {
# Web 前端
handle / {
reverse_proxy web:80
}
# API
handle /api/* {
reverse_proxy api:3000
}
}
api.example.com {
reverse_proxy api:3000
}
数据持久化 #
目录说明 #
| 目录 | 说明 |
|---|---|
/etc/caddy |
配置文件目录 |
/data |
证书和数据存储 |
/config |
配置持久化 |
/srv |
站点文件目录 |
卷配置 #
yaml
volumes:
# 配置文件
- ./Caddyfile:/etc/caddy/Caddyfile
- ./config:/etc/caddy/config
# 数据持久化
- caddy_data:/data
- caddy_config:/config
# 站点文件
- ./site:/srv
环境变量 #
常用环境变量 #
yaml
environment:
# 时区
- TZ=Asia/Shanghai
# Caddy 管理 API
- CADDY_ADMIN=0.0.0.0:2019
# 数据目录
- XDG_DATA_HOME=/data
- XDG_CONFIG_HOME=/config
在 Caddyfile 中使用环境变量 #
caddyfile
{$DOMAIN:example.com} {
reverse_proxy {$BACKEND:localhost:3000}
}
yaml
environment:
- DOMAIN=example.com
- BACKEND=app:3000
自定义镜像 #
基础 Dockerfile #
dockerfile
FROM caddy:latest
# 复制配置文件
COPY Caddyfile /etc/caddy/Caddyfile
# 复制站点文件
COPY site /srv
# 设置权限
USER root
RUN chown -R caddy:caddy /srv
USER caddy
带插件的 Dockerfile #
dockerfile
FROM caddy:builder AS builder
# 添加插件
RUN xcaddy build \
--with github.com/caddyserver/forwardproxy \
--with github.com/mholt/caddy-webdav
FROM caddy:latest
# 复制自定义二进制文件
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
# 复制配置
COPY Caddyfile /etc/caddy/Caddyfile
COPY site /srv
构建和运行 #
bash
# 构建镜像
docker build -t my-caddy .
# 运行容器
docker run -d \
--name caddy \
-p 80:80 \
-p 443:443 \
my-caddy
网络配置 #
自定义网络 #
yaml
version: "3.8"
services:
caddy:
image: caddy:latest
networks:
- frontend
- backend
# ...
app:
image: my-app
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # 内部网络,不对外
主机网络模式 #
yaml
services:
caddy:
image: caddy:latest
network_mode: host
# ...
健康检查 #
yaml
services:
caddy:
image: caddy:latest
healthcheck:
test: ["CMD", "caddy", "validate", "--config", "/etc/caddy/Caddyfile"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
日志管理 #
日志配置 #
yaml
services:
caddy:
image: caddy:latest
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
日志卷挂载 #
yaml
volumes:
- ./logs:/var/log/caddy
caddyfile
example.com {
log {
output file /var/log/caddy/access.log
}
}
完整生产配置 #
yaml
version: "3.8"
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
- "2019:2019"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./sites:/srv
- ./logs:/var/log/caddy
- caddy_data:/data
- caddy_config:/config
environment:
- TZ=Asia/Shanghai
- CADDY_ADMIN=0.0.0.0:2019
networks:
- web
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:2019/config/"]
interval: 30s
timeout: 10s
retries: 3
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
networks:
web:
driver: bridge
volumes:
caddy_data:
caddy_config:
常用命令 #
bash
# 启动服务
docker-compose up -d
# 查看状态
docker-compose ps
# 查看日志
docker-compose logs -f caddy
# 重载配置
docker-compose exec caddy caddy reload --config /etc/caddy/Caddyfile
# 验证配置
docker-compose exec caddy caddy validate --config /etc/caddy/Caddyfile
# 进入容器
docker-compose exec caddy sh
# 查看证书
docker-compose exec caddy cat /data/caddy/certificates/.../example.com.crt
# 重启服务
docker-compose restart caddy
# 停止服务
docker-compose down
# 清理数据
docker-compose down -v
下一步 #
现在你已经掌握了 Docker 部署,接下来学习 插件扩展 了解如何扩展 Caddy 功能!
最后更新:2026-03-28