介绍
之前创建项目虽然可以调试了,当如何发布运行项目,也是一个难题,本来想象和IIS发布网站是不是一样的,将文件拷贝到指定目录下面就可。但根据docker 的介绍就知道,能忽略不同不同服务器环境的影响,当然不可能那么简单。Docker 项目的发布通常涉及构建和分发容器镜像。发布的方式可以通过将镜像上传到容器注册表(container registry)来实现,这样其他服务器或者用户就可以从该注册表下载镜像。这是一种常见的分发和部署方式,因为它提供了集中式的位置来存储和管理镜像。
如果你不想使用容器注册表,而是想直接复制文件,也是可行的,但可能不是最佳实践。直接复制文件可能会导致一些问题,比如文件版本不一致、依赖项丢失等。此外,Docker 镜像的构建过程通常会包含多个步骤,而不仅仅是简单的文件复制。
为了能更接近正式项目实际发布情况,我使用了ABP 的CMS 模块能开创建测试项目。也可以创建简单web测试。
发布docker镜像
docker发布是将项目文件打包发布到docker的服务器上,docker官方的镜像服务器是 docker hub( ➤ https://hub.docker.com/ ),国外网站网络访问有一定难度。我使用阿里云创建了服务,➤ https://cr.console.aliyun.com/ 创建后就能得到一个服务地址,账号密码后面将会用到。
vs 右键项目“发布“,选择“Docker 容器注册表”
下一步,选择“其他Docker容器注册表”
下一步,输出入镜像服务器地址和账号密码,我的是阿里云的,也可以填其他。(在复制阿里云公网地址时,不要带仓库名,因为仓库已经存在,提交不上去。复制到命名空间那一层即可,上传后会自动创建仓库)
下一步,选择Doker Desktop(以前已经安装好的)
点击“完成”。到阿里云后台就可以看到上传的镜像了。
发布的版本
发不过程还需要注意版本号,如果不修改或者设置版本号,每一次上传上去都只会有一个版本。
在vs 发布设置好后,在发布设置页面(项目右键“发布”),点击“编辑图像标记”。
这里有两种模式,一种是“自定义标记”,就是自己写版本号,只要自己分辨得出来即可。
得到结果就是下面这样。
另一种是“发布时生成标记”,结果是下面这样,用时间来主版本号
发布一般是在开发人员电脑上,完成之后。就是到服务上下载镜像,运行镜像。
下载镜像
本来是想全部使用Docker Desktop界面操作来完成镜像下载的,但是一直能弄没成功,只能使用命令了。(网上看了一些教程修改设置,使用阿里云地址,依然没有弄成功,有没有大佬会搞,求教)。
此处用命令比较简单、阿里云每个仓库下面都有介绍,照着走一遍,就行了。
登录后拉取镜像,再运行镜像,这样就行了。
MS SQL 连接
当前只是为了测试web 发布,所以并没有sql 的数据镜像,为了方便直接使用本机数据库。由于上面运行过镜像,在Docker Desktop就可以看到容器了,先试一下docker 容器和本机通讯是正常,ping一下就知道了 (host.docker.internal 表示本机IP地址,配置sql 连接服务器,直接写这个就可以了),如果ping不通,配置一下无服务器出站/入站规则,测试服务器为了快速测试,我直接关闭了防火墙(不推荐这样做)
连接后sql 还是提示错误
SqlException: 用户 'NT AUTHORITY\ANONYMOUS LOGON' 登录失败。
修改sql连接为账号认证即可
"ConnectionStrings": {
"Default": "Server=host.docker.internal;Database=CMStest;User ID=sa;Password=123;Integrated Security=False;"
},
注释:Integrated Security :true windows验证 , false 账号验证
ABP虚拟文件无法访问
运行时abp报错如下
参考abp官网文档,做如下修改即可
https://docs.abp.io/en/abp/latest/Virtual-File-System#dealing-with-embedded-files-during-development
[DependsOn(typeof(MyModule))]
public class MyWebAppModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var hostingEnvironment = context.Services.GetHostingEnvironment();
if (hostingEnvironment.IsDevelopment()) //only for development time
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.ReplaceEmbeddedByPhysical<MyModule>(
Path.Combine(
hostingEnvironment.ContentRootPath,
string.Format(
"..{0}MyModuleProject",
Path.DirectorySeparatorChar
)
)
);
});
}
}
}
网站用户文件目录
使用docker我就在想一个问题,用户上传的文件都在容器里的话,特殊情况要拷贝下来维护,或者有时手动修改这么办,特别是查看日志。所以想将容器下的某些存储目录修改一下位置,在镜像运行时可以配置镜像相关信息。一般也是推荐持久化数据挂载在容器外,服务挂了也不会导致已经持久化的数据丢失。
做完以上的步骤终于可以运行起来了