Docker发布.net6.0项目[转]

1、创建一个项目,并且添加docker支持(我这边是用了一个以前就创建好的项目)

  如下图,添加docker支持,选择linux,添加后会自动生成一个Dockerfile文件(这个文件是构建docker镜像的关键)

  

  

   如下图,打开Dockerfile文件查看,发现需要使用到两个基础的镜像

  mcr.microsoft.com/dotnet/aspnet:6.0 基础镜像

  mcr.microsoft.com/dotnet/sdk:6.0 sdk镜像

  

 2、安装基础镜像(mcr.microsoft.com/dotnet/aspnet:6.0 和 mcr.microsoft.com/dotnet/sdk:6.0)

  直接在系统中无脑 docker pull xxx

docker pull mcr.microsoft.com/dotnet/aspnet:6.0
docker pull mcr.microsoft.com/dotnet/sdk:6.0

  

   

   然后docker images查看下,镜像都已经有了 

  

3、将项目上传到linux机器上(我这边使用的是本机的windows子系统,在linux子系统中直接可以访问到本地硬盘,可以直接用cp命令,省去了很多事)

  windows的linux子系统中,本身有个mnt目录,在mnt目录下,可以直接访问到本机硬盘的内容,如下图,在mnt目录下可以看到又c盘和d盘

  ps:非windows子系统需要使用其他传文件方式,具体方法自行百度把。

  

   在/home/smj/projects/  下创建  antServiceApi 文件夹用来放文件,然后将本地的项目复制到linux系统中。

# 复制文件
cp -r /mnt/d/workspace/AntServiceApi/ant-service-api/* /home/smj/projects/antServiceApi/

  /mnt/d/workspace/AntServiceApi/ant-service-api/* 表示本地项目,ant-service-api/* 表示文件夹下所有文件

  /home/smj/projects/antServiceApi/ 表示linux机器上的文件夹,将本地的项目复制到这个文件夹下

  注意:复制时,需要从待解决方案的那一层开始复制

   

 4、通过Dockerfile生成docker镜像(docker build ...)

  我们发现,通过vs自动创建的Dockerfile没有和项目的解决方案在一个层级的目录,所以需要将Dockerfile复制到工作目录。

 

mv Dockerfile ../

 

  

  原因:由于vs自动创建的dockerfile不在实际工作目录(解决方案目录)

  建议:直接在vs项目中将Dockerfile移动好然后传到linux机器上,这样就省去到linux机器上移动了

   然后执行编译命令:docker build -t antservice .

docker build -t antservice .

  antservice 表示镜像的名称

  最后一个点. 表示使用当前目录的Dockerfile(所以这个命令需要在解决方案目录下执行)

  

   执行完命令后查看查看镜像(docker images),antservice已经创建成功

  

 5、通过镜像运行Docker容器(docker run ...)

docker run --name antservice -p 8001:80 -d antservice

  --name antservice 表示容器名称

  -p 8001:80 表示端口映射,-p 宿主机端口:容器端口

  -d 表示后台运行,返回容器id

  最后的antservice 表示使用的镜像名称

  正常情况下到这就算结束了,但是,我这边运行之后发现,容器没跑起来!!!

  

6、踩坑记录(数据库链接,以及swagger踩坑)

  6.1、数据库链接配置不正确

    经过查看容器日志发现,我项目里使用了mysql数据库,但是在docker中连不上数据库,导致容器没有启动。 

复制代码
# docker查看日志命令
docker logs <OPTIONS> <CONTAINER>

# <OPTIONS>
#  -f : 跟踪日志输出
#  -t : 显示时间
#  --tail :仅列出最新N条容器日志
#  --since:显示某个日期至今的所有日志

# <CONTAINER>
#  代表容器ID或容器名称

# -------------举例-----------------

# 查看最近10条日志, 并持续打印
docker logs -f --tail 10 容器id或名称
# 查看某个日期至今的所有日志,并持续打印
docker logs -f --since "2022-11-20" efb78392fcc6 容器id或名称

复制代码

    6.1.1、首先安装在docker中安装mysql,详情见 Docker安装mysql

    6.1.2、然后再项目的配置文件中修改数据库连接串。

    6.1.3、然后执行上述3-5的步骤重新编译和部署

  6.2、swagger以来的xml没有生成

    有一些项目会使用swagger作为接口文档,项目中也会引入swagger,而然swagger依赖项目生成的xml。

    我们设置项目时,一般只会在Debug模式下才会生成xml,Release分支默认不会生成xml,所以导致编译到docker中的项目找不到相应xml。

    解决方法:设置Release分支也生成xml,然后重复上述3-5的步骤

    

 

     

  6.3、项目配置文件挂载

     项目的配置文件,建议设置挂载,使用宿主机上的配置文件。

    6.3.1、在宿主机上新建配置文件,我创建到了/home/docker/volumes/serviceconfig/antservice/appsettings.json

     

    6.3.2、删除容器后重新使用挂载方式创建(因为挂载需要在docker run的时候进行挂载)

复制代码
# 停止容器
docker stop 容器id
# 删除容器
docker rm -f 容器id
# 使用挂载方式启动容器
docker run --name antservice -p 8001:80 -d -v /home/docker/volumes/serviceconfig/antservice/appsettings.json:/app/appsettings.json antservice
复制代码

      -v /home/docker/volumes/serviceconfig/antservice/appsettings.json:/app/appsettings.json 表示挂载,含义: -v 宿主机目录文件:容器目录文件

    6.3.3、验证:将宿主机上的appsetting中的数据库配置故意改错,然后重启容器,会发现连不上mysql,则表示挂载成功

7、最后访问项目的swagger

 

转自: https://www.cnblogs.com/smj-7038/p/16905934.html

posted @ 2023-03-29 18:23  韩梦芫  阅读(479)  评论(0编辑  收藏  举报