记录一次开发到部署的全过程(ASP.NET Core | Mysql |Docker)
整个过程从学习到开发再到部署,累计花费时间1个月左右。
主要使用 Docker 做环境部署,部署项目采用ASP.NET Core
开发而成的demo API,期间产生问题:
- 怎么做统一信息返回处理
- Docker 本地部署
vsdbg\vs2017u5
无效 - 怎么做开发环境部署
- 远程部署Docker报错
AttributeError: 'NoneType' object has no attribute 'containers'
- 远程服务器上Docker 未(无法)启动
code=exited,status=1/FAILURE
- 怎么拉取本地构建的应用镜像
- 等若干问题
整个项目使用技术或者工具(平台)列表如下:
Visual Studio Community
AndVisual Studio Code
Docker Hub
AndDocker Desktop
Mysql 8.0.x
(图形化工具Navicat 15.x
)- SDK [
NET 7.0
] PostMan
(API 请求测试工具)Ubuntu 22.04 | WSL 2.0
(用以支持本地Docker开发和部署)- 等若干
项目镜像地址 :AQLIFE/TreeHolesApi
项目Github地址:AQLIFE/TreeHolesApi
One:本地开发
这里开发的是一个简单的树洞(项目),主要想要实践使用过滤器的来对接口返回信息进行统一信息处理和封装。
项目主要结构由:
- TreeHolesController :控制器
- TreeInfo :ORM 模型
- TreeDbContext :数据库连接上下文
首先,这个项目需要一个数据库,所以我使用Docker 创建了一个Mysql 数据库容器,映射端口3307.
appsetting.json
连接字符串配置:
"ConnectionStrings": {
"MysqlConnection": "server=192.168.0.101;port=3307;database=treeHoles;user id=root;password=148632"
}
创建应用过滤器,具体详情可看另一篇文章或Github,然后在Program.cs
中进行DbContext
和Filter
的使用。
// 启用控制器 的swgger 支持,添加全局过滤器
builder.Services.AddControllers(options =>options.Filters.Add<ApplicationFilters>());
string? arg = builder.Configuration["ConnectionStrings:MysqlConnection"];
// 添加DbContext 支持
if (arg != null)
builder.Services.AddDbContext<TreeDbContext>(options => options.UseMySQL(arg));
完成以上两步后,开始第一次本地运行。
使用的运行方案为Project
这里运行后的地址和端口需要另外设置,详见另一篇文章
到这里之后,初步开发就完成了。之后需要的就是添加Docker
支持
Two:本地部署
这里需要停止上文终端的运行,并找到项目解决方案,右键添加Docker
支持(使用默认生成的DockerFile 文件足矣),修改其中EXPOSE 80
的数字,80对应你上文终端启用的端口号。
然后选择 Docker 方案进行运行
此处不要使用F5的调试运行,然后可能会出现本文第二个问题,(Docker 本地部署
vsdbg\vs2017u5
无效)
如果出现这种问题,请首先检查C:\你的用户名\vsdbg
文件架是否存在,其内部是否具有文件,没有就安装报错的对应版本,具体详情可以参阅其他用户文章。
第一次Docker 可能会卡住了,这里点击生成菜单的取消,检查Docker 是否启动 和 项目是否正常后重试运行。
如果没有创建对应的项目容器和镜像,就请检查Docker 内是否由重名的镜像和容器,将其删除后,重新运行Docker 方案。
了解是否是项目方案可以打开VS视图菜单下的其他窗口,选择容器窗口,就可以看见项目容器是否创建。不建议使用由VS 默认创建项目容器,可能会出现无法连接数据库问题。
出现该问题后,建议使用Docker Desktop
或者 Power Shell
执行Docker run
命令来创建项目容器。
创建成功后,可以在VS 容器窗口中找到项目容器,点击选项卡的文件查看,是否具有同名的项目.dll文件,存在即项目能成功部署到Docker
上。但部署成功不等于项目运行成功,还需要查看Docker
上的项目日志,是否具有和上文终端同样的输出日志,有则为成功。
Vs 2022
的容器窗口和Docker DeskTop
都可以查看容器日志
如果不放心,可以使用PostMan
进行测试
Three:远程部署
在上文的基础上,推送容器镜像到个人Docker Hub仓库,优先公开库,私人库,可能存在无法拉取问题(部署机拉取麻烦)
涉及命令:docker push aqlife/treeholesapi
推送项目前,建议先创建Docker hub仓库,保持和镜像同名
部署机是一个Cent 7 的版本,可以安装Docker ,但是村子文章开头的问题4、5,这两个属于同一个问题,简单解决方案:
sudo rm -rf /etc/docker/daemon.json # 删除错误配置文件
systemctl start docker #重启Docker
问题别名 :daemon 配置问题
拉取仓库镜像,构建应用容器所需数据库,然后创建应用容器。
之后在服务器和服务器控制台上打开应用容器和数据库所需端口号。
本文使用来自腾讯云的Cent 应用服务器-宝塔版
之后,检查日志输出是否正常,再用Postman 测试接口,即可。
2022-12-2 AQLIFE &Fox Life