Docker初学到实战(六)搭建WebApi-后端

        我后端开发是用的C#语言.net5版本,开发工具用的VS,我主要是开发了一个把长链接转换为短链接的项目,总共就2个API,具体WebApi怎么开发,大家另起一个课程吧,我这里就放几个截图看看吧:

 如上就是我们开发好的一个完整的API项目,那么问题来了,我们如何把这个项目部署到Docker容器中呢?

如果是传统的windows服务器,我们只需要把这个项目生成一个EXE的文件,把相关的文件全部拷贝到服务器上,运行起来就行了,当然在代码中还得指定访问端口。

但是现在我们要放到Docker里面,启动一个Docker容器时需要一个镜像的,所以我们这里得把这个WebApi项目打包成镜像。

以目前我们的开发环境和目的来看,我就一个人,用自己的电脑开发的,不涉及多人开发,自动发布,我自己手动发不就行了。咱先学会一中方法,以后再自行去扩展CICD,自动化发布和测试。所以我们这里发布的流程就是可以有几种:

1.在本地开发电脑上把项目打包成Docker镜像→上传到Docker镜像仓库→在服务器上拉取镜像并启动。

2.把本地项目的源代码拷贝到服务器→在服务器上打包成Docker镜像→以该镜像启动容器。

第二种比较麻烦,还可把源代码复制到服务器,又是Linux的服务器复制文件也麻烦,操作全是命令,一点不方便,但是这个方式是比较适合做自动发布的。

所以我们这里选择第一种方式:

一、打包镜像

        1.首选要下载一个DockerDesktop(Docker Desktop for Mac and Windows | Docker)的一个桌面应用,这样就相当于我们本机也有了一个docker环境,同样可以运行docker容器了,但是我这里不需要干这些事,我只是用来打包镜像而已,下载安装好之后如下:

补充一下:如果你的服务器是Windwos的,你也可以用这个DockerDesktop来启动和管理容器,就不用我前面几章说的哪些东西了。

 记得注册一个DockerHub的账号,然后登陆,方便我们上传镜像到DockerHub的公共镜像仓库。

        2.在VS中,选择项目右键→添加→选择Docker支持

在选择目标OS:我们的服务器是Linux

 

 点击确定后会在目录下生成一个Dockerfile的文件,里面有段代码是指定端口的,大家可以不用纠结,最后面我会补充到,里面的内容建议大家可以另起一个课程学习。

 重点注意:

        建立项目是一定要把下图这个复选框选上,如果不选上,那么在自动生成dockerfile的时候会出行路径问题,需要自己去手动改路径,具体修改方式自己根据后面生成镜像时的报错多试试。

         3.在开发者PowerShell中我们就可以使用Docker命令生成镜像了。

 执行命令: docker build -t qq418181574/tinyurl-api:v1.5 .

 最后这个“空格”和“点”,这个点表示的意思是以当前目录下的dockerfile文件为依据生成镜像。生成镜像的代码还有跟多扩展的知识,大家可以度娘,比如那个点可以是一个路径。

如果生成途中报错了回有提示,根据提示处理就行,以我们目前操作的手法,大部分问题就是路径问题,什么复制文件找不到路径之类的。 

         4.生成镜像成功后,我们到docker desktop上面去看看

上图就是现在我们本地的Docker镜像列表。 

二、上传镜像

        1.把本地镜像推送到DockerHub上,当然是当前登录账上:

注意,如下图,当前登录帐号就是在打包镜像时候取名字时的那个帐号,不然会推不上去,这个好像是DockerHub的一个规范,镜像前面都是帐号名称,这个点我还没弄得很明白,保持一致就一致吧,目前没啥影响我的。

         2.推送完成之后可以切换选项卡查看是否成功,如下图:

 我这里就是同一个项目,同一个镜像名字,推送了很多次,只是每次的Tag(版本)不一样。

        3.当然也可以通过登录Docker Hub 网站上去查看自己账号下的镜像:

 

 

 

三、拉取镜像启动容器

        拉取镜像可以在服务器上用命令,也可以在我们之前安装的portainer容器管理上来操作,我这图方便就用portainer来操作,有可视化的交互界面为啥不用呢,哈哈

接下来的操作就跟前面几章介绍的安装mysql是一样的,我就放几个截图,然后圈一下聚焦点:

 

直接添加一个容器,镜像填写我们自己刚刚生成的 ,会自动拉取的。

最后查看是否启动正常:

 最后我们同样的要在物理机上开放对应端口:

 至此我们自己写的项目就打包并且启动完成了。可以使用postman或者访问api的swagger页面进行测试:

 

补充:关于端口的问题,我们的项目里面指定不指定都无所谓,我两个项目没有指定端口,就是默认的80,然后在容器中启动后拿物理机的响应的端口对应80就行了,我是觉得这样方便,就如下图:        

这两个项目就是我的前后端,我在项目里面都没指定端口,就用默认80,在启动容器时再确定用物理机上哪个端口来对应。81:80表示物理机上的81对应容器中的80。每个容器都有自己的端口,所以不冲突。

dockerfile中指定的端口我还没发现有什么用,这个自动生成的文件,没用也可以删掉这段。

posted @ 2022-02-14 15:58  新空间-刘亚东  阅读(355)  评论(0)    收藏  举报