方案 A:「traefik:2.11」— 零配置、最省内存
镜像体积 40 MB,空载 RSS ≈ 15 MB,官方支持 Docker-label 自动发现,无需手写 Nginx。
- 目录结构
~/gateway/
├── docker-compose.yml
└── acme.json # 空文件,chmod 600- 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- 启动
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/npm | 300 MB+ | 170 MB | 图形界面 | 功能全,但吃资源 |
| traefik | 40 MB | ≈15 MB | 零配置(label) | 推荐,最省内存 |
| caddy | 14 MB | ≈12 MB | 几行 Caddyfile | 语法极简 |
| nginx:alpine | 7 MB | ≈10 MB | 手写 + 脚本 | 最轻,但需要脚本 |
把上面任意一份 docker-compose.yml 放到服务器,docker compose up -d 即可替换掉高内存的 NPM,证书续期全部自动。