docker单机多站点部署核心是用反向代理(nginx-proxy或traefik)根据域名分发请求:前者通过virtual_host自动配置,后者通过容器标签+traefik.yml实现自动发现与https管理。

在 Docker 中用反向代理实现单机多站点部署,核心是让一个公网入口(通常是 80/443 端口)根据域名或路径,把请求分发到不同容器运行的 Web 服务。最常用、最轻量、社区支持最好的方案是 nginx-proxy + docker-gen 或更现代的替代品 traefik。下面以实用、易上手为原则,分两种主流方式说明。
用 nginx-proxy 自动反代(适合初学者)
这是基于官方 nginx 镜像 + docker-gen 的组合,能自动监听新容器并生成配置,无需手动写 nginx.conf。
- 启动 nginx-proxy 容器(监听宿主机 80/443,挂载 Docker socket 获取容器信息):
-v /var/run/docker.sock:/tmp/docker.sock:ro \
-v /path/to/certs:/etc/nginx/certs \
--name nginx-proxy \
jwilder/nginx-proxy
- 部署你的网站容器时,只需加 VIRTUAL_HOST 环境变量:
-e VIRTUAL_HOST=site1.example.com \
-e VIRTUAL_PORT=80 \
--name site1 \
nginx:alpine docker run -d \
-e VIRTUAL_HOST=site2.example.com \
-e VIRTUAL_PORT=3000 \
--name site2 \
node:18-alpine npm start
- 确保域名已解析到服务器 IP;HTTPS 证书可配合 jwilder/nginx-proxy:alpine 镜像 + letsencrypt-nginx-proxy-companion 自动签发(需额外启动 companion 容器)。
用 Traefik v2(推荐用于生产或进阶用户)
Traefik 原生支持 Docker,配置即代码,自动发现服务、内置 Let's Encrypt、支持中间件(重定向、认证等),更适合长期维护。
- 准备 traefik.yml(静态配置):
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
certificatesResolvers:
le:
acme:
email: "admin@example.com"
storage: "/acme.json"
httpChallenge:
entryPoint: "web"
- 启动 Traefik(挂载配置和 acme.json):
-p 80:80 -p 443:443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd)/traefik.yml:/etc/traefik/traefik.yml \
-v $(pwd)/acme.json:/acme.json \
--name traefik \
traefik:v2.10
- 部署站点时,通过容器标签声明路由规则(不用暴露端口给宿主机):
--label "traefik.enable=true" \
--label "traefik.http.routers.site1.rule=Host(`site1.example.com`)" \
--label "traefik.http.routers.site1.entrypoints=web,websecure" \
--label "traefik.http.routers.site1.tls.certresolver=le" \
--name site1 \
nginx:alpine
关键注意事项
- 网络互通:所有站点容器和反代容器必须在同一个 Docker 网络(默认 bridge 可用,但建议自定义桥接网络并显式加入)。
-
DNS 解析:本地测试可用
/etc/hosts模拟;正式环境需配置公网 DNS A 记录指向服务器 IP。 - 端口冲突:反代容器必须独占 80/443;其他容器不要映射到宿主机 80/443,只在内部通信。
-
HTTPS 证书权限:acme.json 文件需设为 600 权限(
chmod 600 acme.json),否则 Traefik 启动失败。
小技巧:快速验证是否生效
- 执行
docker logs nginx-proxy或docker logs traefik查看日志,确认是否识别到新容器及域名。 - 进入反代容器执行
curl -H "Host: site1.example.com" http://localhost,检查能否正确返回后端响应。 - 用浏览器访问域名,观察是否跳转、是否显示 HTTPS 锁图标、证书是否有效。










