插件窝 干货文章 如何给docker下服务添加ssl

如何给docker下服务添加ssl

Docker 证书 pem your 111    来源:    2025-04-30

为Docker服务添加SSL证书的完整指南

为Docker容器中的服务添加SSL证书可以通过以下几种方法实现:

方法一:直接在容器内配置SSL

  1. 准备SSL证书

    • 获取有效的SSL证书(从CA机构购买或使用Let's Encrypt免费证书)
    • 或者生成自签名证书: bash openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
  2. 修改服务配置

    • 对于Nginx: nginx server { listen 443 ssl; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; # 其他配置... }
    • 对于Apache: apache <VirtualHost *:443> SSLEngine on SSLCertificateFile /path/to/cert.pem SSLCertificateKeyFile /path/to/key.pem # 其他配置... </VirtualHost>
  3. 构建Docker镜像

    • 将证书文件复制到镜像中: dockerfile COPY cert.pem /path/to/cert.pem COPY key.pem /path/to/key.pem

方法二:使用反向代理(推荐)

  1. 使用Nginx作为反向代理: ```docker-compose.yml version: '3' services: your-app: image: your-application # 应用配置...

    nginx-proxy: image: nginx ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./cert.pem:/etc/ssl/certs/cert.pem - ./key.pem:/etc/ssl/private/key.pem depends_on: - your-app


    Nginx配置示例: ```nginx server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /etc/ssl/certs/cert.pem; ssl_certificate_key /etc/ssl/private/key.pem; location / { proxy_pass http://your-app:port; # 其他代理设置... } }
  2. 使用Traefik: ```docker-compose.yml version: '3' services: traefik: image: traefik command: - --api.insecure=true - --providers.docker - --entrypoints.web.address=:80 - --entrypoints.websecure.address=:443 - --certificatesresolvers.myresolver.acme.tlschallenge=true - --certificatesresolvers.myresolver.acme.email=your@email.com - --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json ports: - "80:80" - "443:443" volumes: - ./letsencrypt:/letsencrypt - /var/run/docker.sock:/var/run/docker.sock

    your-app: image: your-application labels: - "traefik.http.routers.your-app.rule=Host(yourdomain.com)" - "traefik.http.routers.your-app.entrypoints=websecure" - "traefik.http.routers.your-app.tls.certresolver=myresolver" ```

方法三:使用Docker Secrets(Swarm模式)

# 创建secret
echo "your-cert-content" | docker secret create cert.pem -
echo "your-key-content" | docker secret create key.pem -

# 在docker-compose.yml中使用
services:
  your-service:
    image: your-image
    secrets:
      - cert.pem
      - key.pem
    # 其他配置...

自动续期Let's Encrypt证书

  1. 使用certbot

    docker run -it --rm -p 80:80 -v /path/to/certs:/etc/letsencrypt certbot/certbot certonly --standalone -d yourdomain.com
    
  2. 设置cron任务自动续期

    0 0 * * * docker run --rm -v /path/to/certs:/etc/letsencrypt certbot/certbot renew
    

注意事项

  1. 生产环境建议使用来自可信CA的证书,而非自签名证书
  2. 确保私钥文件的安全,不要泄露
  3. 定期更新证书,特别是Let's Encrypt证书每90天需要续期
  4. 考虑使用HTTP/2和现代加密套件提高安全性

以上方法可以根据您的具体需求和环境选择最适合的方案。