Skip to content

方案 A:「traefik:2.11」— 零配置、最省内存

镜像体积 40 MB,空载 RSS ≈ 15 MB,官方支持 Docker-label 自动发现,无需手写 Nginx。

  1. 目录结构
~/gateway/
├── docker-compose.yml
└── acme.json               # 空文件,chmod 600
  1. docker-compose.yml(一次抄完即可)
yaml
version: "3.8"
services:
  traefik:
    image: traefik:2.11
    restart: unless-stopped
    command:
      - --api.dashboard=true          # 可选 Web UI
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.letsencrypt.acme.httpchallenge=true
      - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
      - --certificatesresolvers.letsencrypt.acme.email=你的邮箱
      - --certificatesresolvers.letsencrypt.acme.storage=/acme.json
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./acme.json:/acme.json
    labels:
      - traefik.enable=true
      - traefik.http.routers.dashboard.rule=Host(`traefik.你的域名`)
      - traefik.http.routers.dashboard.service=api@internal
      - traefik.http.routers.dashboard.tls=true
      - traefik.http.routers.dashboard.tls.certresolver=letsencrypt
      - traefik.http.routers.dashboard.middlewares=auth
      - traefik.http.middlewares.auth.basicauth.users=admin:$$2y$$10$$8K1p3kV.dVf6yZY3qR.KUOqMkmK8zNf8lHnpK.qKqH2G5GsgzWqGJi   # 密码 admin
  1. 启动
bash
touch acme.json && chmod 600 acme.json
docker compose up -d

以后每加一个站,只需在自己的业务容器里贴 3 行 label,Traefik 会自动申请证书并转发,无需重启网关容器


方案 B:「caddy:2-alpine」— 单文件、语法极简

镜像 14 MB,空载 RSS ≈ 12 MB,支持 JSON/YAML/Caddyfile 三种写法。

docker-compose.yml 示例(同时反代两个站,自动 HTTPS):

yaml
version: "3.8"
services:
  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data        # 证书、OCSP 缓存
volumes:
  caddy_data:

Caddyfile(同目录下):

app1.example.com {
    reverse_proxy http://10.0.0.3:8080
}
app2.example.com {
    reverse_proxy http://10.0.0.4:9000
}

启动后 第一次访问就会自动完成 ACME 挑战并写入 /data,后续续期全自动。


方案 C:「nginx:alpine + 轻量脚本的纯 CLI」— 不想加新工具

官方 alpine 镜像仅 7 MB,空载 8–10 MB;证书用 acme.sh(Go 版 5 MB)或 certbot 的 --webroot 模式, renewal-hook 写 5 行脚本即可。
适合“只信 Nginx”又想极致省内存的场景,脚本模板网上一搜一大把,这里不再展开。


结论

方案镜像大小空载内存是否需要写配置备注
jc21/npm300 MB+170 MB图形界面功能全,但吃资源
traefik40 MB≈15 MB零配置(label)推荐,最省内存
caddy14 MB≈12 MB几行 Caddyfile语法极简
nginx:alpine7 MB≈10 MB手写 + 脚本最轻,但需要脚本

把上面任意一份 docker-compose.yml 放到服务器,docker compose up -d 即可替换掉高内存的 NPM,证书续期全部自动。