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