为Docker容器中的服务添加SSL证书可以通过以下几种方法实现:
准备SSL证书:
bash
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
修改服务配置:
nginx
server {
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 其他配置...
}
apache
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
# 其他配置...
</VirtualHost>
构建Docker镜像:
dockerfile
COPY cert.pem /path/to/cert.pem
COPY key.pem /path/to/key.pem
使用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;
# 其他代理设置...
}
}
使用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"
```
# 创建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
# 其他配置...
使用certbot:
docker run -it --rm -p 80:80 -v /path/to/certs:/etc/letsencrypt certbot/certbot certonly --standalone -d yourdomain.com
设置cron任务自动续期:
0 0 * * * docker run --rm -v /path/to/certs:/etc/letsencrypt certbot/certbot renew
以上方法可以根据您的具体需求和环境选择最适合的方案。