介绍
abp vnext 里面的只有 module 项目里面是自动添加 docker 支持的,因为其是面向微服务设计的。但是 application 项目中默认是没有 docker 支持的,如果想要使用,需要自己添加。本文就是介绍在 application 项目中添加 docker 支持的尝试。
本文默认您已经具有了 docker 的相关知识。
具体步骤
1、创建项目
直接看截图吧,这个没啥说的。
创建好后打开项目进项相关 nuget 包的还原,然后修改数据库连接字符串并生成数据库。运行项目不报错并可以看到界面。
2、添加docker支持
将 HttpApi.Host
项目设置为启动项目,然后右击选择【添加】->【容器业务流程协调程序支持】,然后一步一步的添加完成,最终会在 HttpApi.Host
项目中添加一个 Dockerfile 文件,并在项目外添加一个 docker-compose 相关文件。具体步骤如下:
最终效果如下:
3、调整
上面部分中的操作完成后,直接执行 docker-compose 项目,是可以自动生成镜像文件和容器的,但是默认监听的端口是 80
。而在创建 Abp 项目后,自动生成的端口是 44386
,而且 Abp 默认启用了 https 模式。此模式 docker 容器需要证书等配置,这里不做过多说明。我将对代码进行调整,以完成项目的容器化支持。即不使用 https 模式。
在进行 docker 相关调整前,可参考 Abp VNext 项目创建简介 这篇文章进行整体项目的调整。否则可能会出现一些报错。
1、 文件launchSettings.json的调整
在项目的 Properties
下找到此文件,然后按以下内容进行调整(只做参考):
{
"profiles": {
"DockerApp.Test.HttpApi.Host": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:44386"
},
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
"publishAllPorts": true
}
}
}
2、文件Program.cs的调整
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt"))
.WriteTo.Console() //方便在控制台中查看日志信息以进行调试
.CreateLogger();
internal static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseUrls("http://*:44386"); //指定监听端口
webBuilder.UseStartup<Startup>();
})
.UseAutofac()
.UseSerilog();
以上调整都在
HttpApi.Host
项目中
3、文件docker-compose.override.yml的调整
version: '3.4'
services:
dockerapp.test.httpapi.host:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://+:44386
ports:
- "44386"
volumes:
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
4、运行实例
右击 docker-compose 后选择【调试】->【启动新实例】,稍等一会后自动生成镜像和容器并启动浏览器,可直接查看页面效果。
下面我通过 vs code
提供了生成的镜像和容器查看,如下图:
也可以通过在 cmd
或 powershell
中运行 docker 相关命令进行生成镜像和启动容器,最后查看生成的效果并在浏览器中访问页面。
注意数据库连接,容器化后可能提示数据库连接不上。
总结
总体来说,按照这个方式可以成功完成容器化,要注意的就是数据库的连接问题。因为就算看到了界面,接口的访问也会有数据库连接失败的问题。这个后期在研究。
开始我有直接添加 Dockerfile 文件进行处理,但是各种报错,查了好久也没解决。
也有通过 vs code
中的 docker 插件来添加 Dockerfile ,同时也会添加 docker-compose 相关文件。从 Dockerfile 文件内容分析,应该是没有问题的,但是实际操作中也是各种报错,不知道为什么。
docker 在 .net core 中的使用还是任重而道远啊,要不断的学习才行!