Docker笔记-Asp.netcore程序部署及https实现
本篇记录了一个Asp.netcore3.1的mvc平台安装并实现https支持的过程。
环境:
宿主机:DeepinV20 (Debian 10)
宿主机 IP:192.168.1.65
Docker 版本:Community 20.10.5
Docker 端口:http 使用 80 , https 使用 443
端口映射:80 > 8080,443 > 8443
一、创建容器
1. 选择镜像:
使用官方镜像:
mcr.microsoft.com/dotnet/aspnet:3.1
可以在microsoft的dotnetcore页 查找相关的镜像,现已更改到 新位置donet
2. 拉取镜像
docker pull mcr.microsoft.com/dotnet/aspnet:3.1
3. 准备部署环境
# 建立程序目录
mkdir /opt/www && mkdir /opt/www/mymvcsystem
将发布好的程序复制到 /opt/www/mymvcsystem 供使用
4. 创建容器
docker run -d --name dotnetmvc \
-e ASPNETCORE_URLS='http://0.0.0.0:80' \
-p 8080:80 \
-v /opt/www/mymvcsystem:/app/ \
-d mcr.microsoft.com/dotnet/aspnet:3.1
dotnet 'MySystem.dll'
-v /opt/www/mymvcsystem 的路径和 donet 'MySystem.dll' 根据实际环境进行调整
现在访问 http://192.168.1.65:8080 应该是可以看见刚部署的程序页面的
5、测试并完善
5.1、 问题一:静态文件返回404
访问时发现页面很丑😭,没有样式,通过浏览器调试发现所有的静态样式和脚本文件都是404
查找了一些帖子说是这种情况一般是在程序中有
webBuilder.UseContentRoot(Directory.GetCurrentDirectory())
的情况造成(使行工作目录变成了/,而正确的工作目录应该是/app)
‘ Docker里 Directory.GetCurrentDirectory() 获取的路径是否是 / 没有具体去测试,先按查到的原因来解决 ’
---- 设置工作目录:
在容器创建命令中加入 -w 参数
-w '/app'
---- 删除并重新创建容器
docker rm dotnetmvc
这是加入 -w '/app' 后的完整命令
docker run -d --name dotnetmvc \
-e ASPNETCORE_URLS='http://0.0.0.0:80' \
-w '/app' \
-p 8080:80 \
-v /opt/www/mymvcsystem:/app/ \
-d mcr.microsoft.com/dotnet/aspnet:3.1
dotnet 'MySystem.dll'
现在再次访问页面,发现页面可以正确加载,静态文件返回404的问题已经解决😄
5.2、 问题二:验证码不能正确加载
在解决了静态文件返回 404 的问题后又发现另一外问题:验证码图片不能正常显示😭。
既然页面访问没有问题,只是验证码不显示那么就通过程序自身找问题
打开程序的日志文件查看发现是验证码绘制时找不到 gdi 库。
接下来安装 linux 中的gdi库 libgdiplush
# 环境是Debian 10 ,使用以下命令
apt-get install -y libgdiplus
安装完后重启容器
docker restart dotnetmvc
再次访问页面查看验证码已经可以正常加载 😄
已经将安装好 gdiplus 的容器打包成镜像推送到 hub 了
可以使用如下路径获取:
docker push sirhq/dotnet-with-libgdiplus
二、实现 https 支持
1. 启动程序的 https 服务端口
修改容器创建脚本加入https服务端口443并向外开放:
修改 ASPNETCORE_URLS 变量为:'http://0.0.0.0:80;https://0.0.0.0:443'
如果要实现 http 自动跳转到 https 则加入:
-e ASPNETCORE_HTTPS_PORT=8443 \
这里的 8443 是向外映射公开的端口
重新创建容器
docker run -d --name dotnetmvc \
-e ASPNETCORE_URLS='http://0.0.0.0:80;https://0.0.0.0:443' \
-e ASPNETCORE_HTTPS_PORT=8443 \
-w '/app' \
-p 8080:80 \
-p 8443:443 \
-v /opt/www/mymvcsystem:/app/ \
-d mcr.microsoft.com/dotnet/aspnet:3.1
dotnet 'MySystem.dll'
2. 测试及完善
2.1、不能正常启动 https
再次访问页面发现访问不到,查看容器运行状态发现是容器并没有运行
使用😭
docker logs dotnetmvc
查看容器日志,发现是不能正常使用证书造成的,那么接下来就进行证书的创建与使用。
创建测试证书:在有dotnet开发环境的机器上进行
这里是个测试用的证书,密码就无所谓了
dotnet dev-certs https --export-path ./dotnetmvc.pfx --password 123456
如何为 Docker 设置开发人员证书
https://docs.microsoft.com/zh-cn/aspnet/core/security/enforcing-ssl?view=aspnetcore-3.1&tabs=visual-studio#how-to-set-up-a-developer-certificate-for-docker
使用此命令后会在当前目录下生成一个 dotnetmvc.pfx 的文件,记住此密码
将生成的 dotnetmvc.pfx 复制到 /opt/www/mymvcsystem 目录供使用
如果想对证书进行统一管理,可以把他们放在一个统一的目录,比如 :~/.aspnet/https
--- 需要另行绑定 ~/.aspnet/https 目录到容器
重新创建容器
docker run -d --name dotnetmvc \
-e ASPNETCORE_URLS='http://0.0.0.0:80;https://0.0.0.0:443' \
-e ASPNETCORE_HTTPS_PORT=8443 \
-e ASPNETCORE_Kestrel__Certificates__Default__Password='123456' \
-e ASPNETCORE_Kestrel__Certificates__Default__Path='/app/dotnetmvc.pfx' \
-w '/app' \
-p 8080:80 \
-p 8443:443 \
-v /opt/www/mymvcsystem:/app/ \
-d mcr.microsoft.com/dotnet/aspnet:3.1
dotnet 'MySystem.dll'
注意:/app/dotnetmvc.pfx 这是证书的路径;
Default__Password='123456' 里面的密码就是创建证书时使用的密码;
如果证书不在程序自身目录则需要如下使用(以/home/docker/.aspnet/https)目录为例
- 映射证书目录到容器
-v /home/docker/.aspnet/https:/https:ro
- 修改 Certificates__Default__Path 路径
-e ASPNETCORE_Kestrel__Certificates__Default__Path='/https/dotnetmvc.pfx'
启动容器并查看是否可以正常运行
docker start dotnetmvc
docker ps -a
发现容器是正常运行的😄,接下来再验证https是否可以正常访问
打开 https://192.168.1.65:8443
如果使用了 UseHttpsRedirection 功能也可以直接访问 http://192.168.1.65:8080,会自动跳转到 https
现在通过浏览器访问 https 页面也是正常的😄
到此一个MVC程序的部署就完成了😢,感谢那些吃过螃蟹乐于分享的哥哥姐姐弟弟妹妹们。