Docker在Windows环境发布.net core项目

小占时光 2024-01-04 11:31:03 2722


介绍

        之前创建项目虽然可以调试了,当如何发布运行项目,也是一个难题,本来想象和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我就在想一个问题,用户上传的文件都在容器里的话,特殊情况要拷贝下来维护,或者有时手动修改这么办,特别是查看日志。所以想将容器下的某些存储目录修改一下位置,在镜像运行时可以配置镜像相关信息。一般也是推荐持久化数据挂载在容器外,服务挂了也不会导致已经持久化的数据丢失。

 

做完以上的步骤终于可以运行起来了

 

 

 

最后一次修改 : 2025/1/23 上午6:50:22

优秀
123
分享
123
奶茶
123
文章版权声明:版权归原作者(小占时光)所有。未经明确书面许可,严禁任何个人或组织以任何形式进行商业性或非商业性的使用、转载或抄袭。
评论