1. 概述
在本文中,我们将学习如何在 Docker 容器中部署 HTTPS 服务。核心思路是:将后端服务运行在 Docker 网络内部,不暴露任何端口,再通过一个反向代理(Reverse Proxy)完成 SSL 终止(SSL Termination)并转发请求给后端服务。
这种部署方式的好处是:将 SSL 处理的负担从后端服务中剥离出来,统一由反向代理处理 HTTPS 请求。这对于多个服务都需要 HTTPS 支持的场景非常友好。
我们使用 crccheck/hello-world
作为后端服务容器,使用开源的 Nginx 作为反向代理服务器。
2. 部署架构解析
部署结构如下:
- 后端服务运行在 Docker 容器中,不对外暴露任何端口。
- Nginx 容器运行在同一 Docker 网络中,作为反向代理,负责:
- 接收 HTTPS 请求
- 进行 SSL 终止
- 将请求转发给后端服务
✅ 优点:
- 后端服务无需处理 SSL
- 所有 HTTPS 请求统一由反向代理处理,结构清晰、安全可控
⚠️ 注意:这种模式下,后端服务必须和 Nginx 在同一个 Docker 网络中,才能正常通信。
3. 部署步骤详解
3.1 创建 Docker 网络
docker network create server-reverse-proxy-link
创建一个名为 server-reverse-proxy-link
的 Docker 网络,后续两个容器将运行在这个网络中。
3.2 启动后端服务
docker run -d \
--network server-reverse-proxy-link \
--name backend-service \
crccheck/hello-world
-d
表示后台运行--network
指定网络--name
为容器命名,便于后续引用
⚠️ 注意:没有使用 -p
参数暴露端口,这是关键,确保服务只能通过 Nginx 访问。
3.3 生成自签名 SSL 证书(用于测试)
生成证书的命令如下:
openssl genrsa -out server.key 2048
openssl req -key server.key -new -out server.csr
openssl x509 -signkey server.key -in server.csr -req -days 365 -out server.crt
server.key
是私钥server.csr
是证书签名请求server.crt
是最终的自签名证书
⚠️ 警告:自签名证书不被浏览器或客户端信任,仅用于测试或内网环境。
3.4 配置 Nginx 实现 HTTPS 和请求转发
创建 nginx.conf
文件内容如下:
events { }
http {
server {
listen 443 ssl;
ssl_certificate /opt/certificates/server.crt;
ssl_certificate_key /opt/certificates/server.key;
location / {
proxy_pass http://backend-service:8000;
}
}
}
逐项说明:
listen 443 ssl
:监听 443 端口,并启用 SSLssl_certificate
和ssl_certificate_key
分别指定证书和私钥路径proxy_pass
指定后端服务地址(容器名 + 端口)
✅ 小技巧:Nginx 会自动解析 Docker 容器名,所以可以直接使用 backend-service
作为主机名。
3.5 启动 Nginx 容器
docker run -d \
--name nginx-container \
--network server-reverse-proxy-link \
-p 443:443 \
-v /opt/certificates:/opt/certificates \
-v /opt/nginx.conf:/etc/nginx/nginx.conf \
nginx:latest
-p 443:443
:将宿主机的 443 端口映射给容器,用于接收 HTTPS 请求-v
:挂载证书和配置文件到容器中
⚠️ 注意:确保挂载路径与 Nginx 配置文件中指定的路径一致。
3.6 验证服务是否正常
使用 curl
测试:
curl https://localhost
由于证书是自签名的,会出现 SSL 错误:
curl: (60) SSL certificate problem: self signed certificate
可以加 --insecure
参数跳过验证:
curl --insecure https://localhost
如果看到如下输出,说明服务正常:
<pre>
Hello World
...
</pre>
4. 小结
本文演示了如何在 Docker 环境中通过 Nginx 实现 HTTPS 服务。核心要点如下:
✅ 后端服务运行在 Docker 网络内部,不暴露端口
✅ Nginx 作为反向代理处理 HTTPS 请求
✅ 使用自签名证书进行测试(生产环境应使用可信证书)
✅ 所有容器必须处于同一 Docker 网络中,以实现容器间通信
💡 踩坑提示:
- 容器名解析失败:确保 Nginx 和后端服务在同一个 Docker 网络中
- 文件挂载路径错误:确认
-v
参数中的路径与配置文件中一致 - 证书路径错误:Nginx 启动失败时,检查日志确认证书路径是否正确
通过这种方式,你可以轻松地在多个服务中复用 Nginx 做统一的 HTTPS 入口处理。