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