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 端口,并启用 SSL
  • ssl_certificatessl_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 入口处理。


原始标题:Serving Docker Container Service Through HTTPS