转载请注明出处,踩坑不易~
实现步骤:
1.给容器添加端口映射;
2.宿主机nginx中配置SSL证书;
3.宿主机nginx转发;
给容器添加端口映射
情况1:容器尚未创建
如果容器尚未创建,可以使用 docker run 命令的-p参数,为容器指定端口映射,例如:
docker run -ti --name web -d -p 80:8080 -p 85:8085 镜像名称 /bin/bash
,通过-p这个run命令的选项就将容器中的80端口和85端口映射到宿主机的8080端口和8085端口;容器运行成功后可以使用docker port
检查端口映射情况
情况2:容器已经在运行中
如果容器已经在运行中就需要使用 iptable转发端口:
1.查看容器的内部网络的固定ip
docker inspect web | grep IPAddress
2.转发本地的8085端口到容器的85端口:
iptables -t nat -A DOCKER -p tcp --dport 8085 -j DNAT --to-destination 172.17.0.2:85
3.检查端口是否转发成功:
iptables -t nat -nL --line-number
规则的组名为:DOCKER
在宿主机中配置ssl
假如在容器内,85端口已经提供正确的web服务了,此时只需要在宿主机内配置SSL证书并转发到本地映射的8085端口就能正常访问使用https了,切记:容器内不需要在配置SSL的证书,否则就变成SSL的双向验证了,如果容器内同时配置了SSL的证书,就会发生“400 Bad Request: The plain HTTP request was sent to HTTPS port”
的错误。
宿主机中的SSL配置
listen 443 ssl;
server_name test.api.umijoy.com;
ssl_certificate /usr/https/full_chain.crt;
ssl_certificate_key /usr/https/private.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #........................
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#........................
ssl_prefer_server_ciphers on;
配置端口转发(整个的端口过程应该是 【外网->宿主机的443端口->转发到宿主机的8085端口->映射的容器的85端口)】
location / {
# proxy_set_header Host $host;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8085/;
}
完整的配置:
server {
listen 443 ssl;
server_name test.api.umijoy.com;
ssl_certificate /usr/https/full_chain.crt;
ssl_certificate_key /usr/https/private.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #........................
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#........................
ssl_prefer_server_ciphers on;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# proxy_set_header Host $host;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8085/;
}
}
附免费签发https证书网站:https://freessl.cn/