You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无自定义域名时Ubuntu本地Docker容器SSL证书部署指导求助

无自定义域名下Docker容器HTTPS部署方案

核心思路

公共CA(如Let's Encrypt)不支持直接为IP地址颁发证书,因此只能通过自签名SSL证书+反向代理的方式实现IP+端口访问的HTTPS连接,同时可通过配置让信任的设备跳过安全警告。

方案一:Nginx反向代理+自签名证书(Docker化部署)

步骤1:生成自签名SSL证书

在Ubuntu服务器执行以下命令(替换your-server-ip为服务器公网/内网IP):

# 创建证书存储目录
mkdir -p ~/nginx-proxy/certs
cd ~/nginx-proxy/certs

# 生成有效期10年的自签名证书,包含IP主题备用名
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
  -keyout server.key -out server.crt \
  -subj "/CN=your-server-ip" \
  -addext "subjectAltName=IP:your-server-ip"

步骤2:启动Docker版Nginx代理

创建docker-compose.yml文件:

version: '3.8'
services:
  nginx-proxy:
    image: nginx:alpine
    ports:
      # 映射多个HTTPS端口,对应不同容器
      - "4431:443"
      - "4432:443"
      - "4433:443"
    volumes:
      - ~/nginx-proxy/certs:/etc/nginx/certs
      - ~/nginx-proxy/conf.d:/etc/nginx/conf.d
    restart: always

启动容器:

docker-compose up -d

步骤3:配置容器反向代理规则

以Portainer容器(端口9000)映射到服务器4431端口为例,创建~/nginx-proxy/conf.d/portainer.conf:

server {
    listen 443 ssl;
    server_name _; # 匹配所有请求,无需域名

    ssl_certificate /etc/nginx/certs/server.crt;
    ssl_certificate_key /etc/nginx/certs/server.key;

    location / {
        proxy_pass http://portainer:9000; # 可替换为容器内网IP或容器名
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

重启Nginx代理生效:

docker-compose restart nginx-proxy

之后即可通过https://your-server-ip:4431访问Portainer。

步骤4:消除浏览器安全警告

将生成的server.crt安装到设备的受信任根证书颁发机构列表:

  • Chrome:设置>隐私和安全>安全>管理证书>受信任的根证书颁发机构>导入
  • Windows:双击证书>安装证书>本地计算机>选择"受信任的根证书颁发机构"存储
  • macOS:双击证书>添加到钥匙串>找到证书后右键>显示简介>信任>始终信任

方案二:Traefik反向代理(自动生成自签名证书)

Traefik可自动生成自签名证书,配置更简洁:

步骤1:创建Traefik配置文件traefik.yml

api:
  dashboard: false

entryPoints:
  websecure1:
    address: ":4431"
  websecure2:
    address: ":4432"

certificatesResolvers:
  selfsigned:
    acme:
      caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"
      storage: acme.json
      httpChallenge:
        entryPoint: web

providers:
  docker:
    exposedByDefault: false

步骤2:启动Traefik容器

docker run -d \
  --name traefik \
  -p 4431:4431 \
  -p 4432:4432 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v $PWD/traefik.yml:/etc/traefik/traefik.yml \
  -v $PWD/acme.json:/acme.json \
  traefik:v2.10

步骤3:为容器添加Traefik标签

启动容器时添加标签指定路由规则,以Portainer为例:

docker run -d \
  --name portainer \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  --label "traefik.enable=true" \
  --label "traefik.http.routers.portainer.entrypoints=websecure1" \
  --label "traefik.http.routers.portainer.tls=true" \
  --label "traefik.http.routers.portainer.tls.certresolver=selfsigned" \
  --label "traefik.http.services.portainer.loadbalancer.server.port=9000" \
  portainer/portainer-ce:latest

访问https://your-server-ip:4431即可,同样需安装证书消除警告。

工具推荐

  • mkcert:简化自签名证书生成的工具,可直接生成被本地设备信任的证书,无需手动导入,命令示例:mkcert your-server-ip,生成的证书可直接用于反向代理配置。

内容的提问来源于stack exchange,提问作者zawier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:16:22