无自定义域名时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
相关产品推荐
相关产品推荐

