Docker笔记 - 部署Asp.netcore并实现https支持

3 篇文章 0 订阅
1 篇文章 0 订阅

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)目录为例
  1. 映射证书目录到容器
-v /home/docker/.aspnet/https:/https:ro
  1. 修改 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程序的部署就完成了😢,感谢那些吃过螃蟹乐于分享的哥哥姐姐弟弟妹妹们。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值