Docker:部署Flask api 服务


步入正题之前,依旧贴出经常使用的docker命令。

1、 Docker命令

docker start/stop container     #开启或停止容器
docker rm container  		#删除容器,删除前需停止
docker rmi images  			#删除镜像,删除前应删除其生成的所有容器
docker ps 					#查看正在运行的容器
docker ps -a 				#查看所有容器
docker images  				#查看镜像
docker build -t image_name:tag .  		#使用Dockerfile文件构建镜像

docker run -itd  image           		#生成容器,可带参数
	-v  /local_path:/container_path   	#数据挂载
	-p local_port:container_port     	#端口映射

docker rename oldname newname  			#容器的重命名
docker exec -it container bash   		#交互式进入已存在的容器
docker cp [local:path]  container:path   #复制宿主机上文件到容器内
docker commit container  image:tag    	#容器生成镜像
https://pypi.tuna.tsinghua.edu.cn/simple   #清华镜像源

2、项目准备

自己在本地使用python语言,flask框架搭建了一个后端服务,后期需要将这个服务部署到云端,就想到使Docker技术,将自己的依赖环境和代码封装到镜像中,保存在docker仓库中。这样云端部署时,拉取仓库镜像,创建容器就实现了一键部署云端的效果。

前期需要准备的东西,ai是整个工程的代码,requirements.txt则是所需依赖的文档,Dockerfile是构建镜像的指令文件。

代码就不需要说了,大家用自己的代码就行。
在这里插入图片描述

2.1 requirements文档

requirements.txt可以使用本机环境自动生成,导出文档后,可一键安装。

这种方式生成的文档,往往会带有文件路径

1、pip freeze > requirements.txt  

推荐使用这种,生成的文档最简洁

2、pip list --format=freeze >requirements.txt  

如果使用anaconda安装,可用下面的方式导出

3、conda list -e  > requirements.txt

对于导出的文档,可一键安装,这里用了清华镜像源

pip install -r requirements 
-i https://pypi.tuna.tsinghua.edu.cn/simple

2.2 Dockerfile文件

对于windows系统,可直接使用命令行创建该文件,当然也可手动创建文件,记得该文件没有任何后缀。

echo >Dockerfile

接下来,可以用记事本的形式打开该文件,进行编辑。

我的Dockerfile指令如下,基础镜像python3.9,将当前目录下的代码 ai 和依赖文档 requirements.txt 全部复制到镜像中。注意这里复制到镜像中的文件只是复制,不承担数据挂载的作用(如若不懂,后面有介绍)

按理说接下来该直接安装环境依赖了,但在安装依赖之前,我这里加了不少操作,如更新pip,gcc等,why?

必是需要这些玩意,要不代码起不来呀,我又是如何知道这些必不可少的操作呢?在这里插入图片描述

最简单的办法是,在一开始的指令里,直接安装环境依赖,看镜像是否成功创建,不成功会有提示哪里中断了,最常见的就是那个依赖包装不上了,这个时候就需要你更改requirements文档中的依赖版本了。

创建后代码是否能起来也是个问题,这时候可以用 docker logs container 查看容器日志了,不能起来大概率是缺了些不太懂的玩意。

这里友情提示,一开始的Dockerfile指令中不要加上最后一行CMD执行命令,要不你的容器都起不来。

以下指令是我从构建容器,起不来,缺啥,找到安装指令安装,直到能跑起来就代表不缺啥了,这中间用到的安装指令全都补充到Dockerfile文件中,然后基于新的指令文件,重新构建镜像…

所以我下面的指令大概率不会满足你的代码,哈哈。也是需要你自己基本失败总结出适合你自己的指令文件了。

From python:3.9-slim
#设置工作目录
WORKDIR /ai
#复制当前目录下文件到镜像
COPY requirements.txt .
COPY ai.
#更新pip
RUN pip install --upgrade pip
#安装gcc
RUN apt-get update && apt-get install -y gcc
#安装libglib
RUN apt-get update && apt-get install -y libglib2.0-0
RUN apt-get update && apt-get install -y libgl1-mesa-glx
#安装依赖环境
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
#启动命令
CMD ["python","app.py"]

3、构建镜像

上面三项内容都准备好之后,放到同一目录下,在该目录下cmd打开终端,基于Dockerfile指令构建镜像,这里的镜像名城是ai_zs

docker build -t ai_zs

构建镜像的过程中,会按步执行Dockerfile中的指令,一般在装依赖包时会有版本不对的问题,修改依赖文件就行。完事后,可使用如下指令查看镜像,是否成功。

docker images

在这里插入图片描述

4、创建容器

容器是镜像的实例化,可用指令生成容器,由于我的flask服务启用的是39029端口号,所以在创建容器时就做了端口映射。

端口映射成功后,宿主机上也可直接请求该服务。

docker run -itd -p 39029:39029 ai_zs

容器创建成功后,可用下面命令查看,上面用到了-d参数,所以容器在生成时就启动了,可直接用docker ps 查看,如果没有,大概率你在Dockerfile中定义了CMD python app.py命令,这个命令表示在容器启动时,就会执行app这个脚本文件,但是如果代码没起来,就会造成容器起不来的现象。

docker ps 

如果不信,可以用下面指令步骤测试,先查看所有容器,找到容器名,再用指令的方式启动容器,再查看运行中的容器,发现还是没有。

这时候可以用查看容器日志的方式,看下是因为什么原因,脚本文件没起来。这也是我上面添加的安装gcc等工具的原因。

docker ps -a
docker start container
docker ps 
docker logs container

找到原因和安装指令后,可添加在Dockerfile指令中,重新构建镜像。

重复构建镜像比较笨,所以可在初次尝试时,去掉Dockerfile文件中的CMD指令,防止容器起不来。去掉以后,启动容器,可在容器内直接执行 python app.py,在分析什么原因起不来,缺什么装什么,直至起来,可以将期间安装的指令补充到Dockerfile文件中。这样,在重新构建镜像时,基本没啥问题了,加上CMD命令,按上面的步骤在走一遍流程。

我这里做了个flask服务,启动容器时也做了端口映射,所以直接在宿主机上用postman工具调用接口测试就行。

5、数据复制和挂载

在 Docker 中,有两种常见的数据管理方法,复制(Copy)和挂载(Mount),这两种方法有不同的用途和适用场景。

5.1、复制

将宿主机系统中的文件或目录复制到容器的文件系统中,但不保留与宿主机文件系统的实时连接。有两种方式,一种是在构建镜像时使用 COPY 指令,这样基于该镜像实例化的容器都会有该文件;另一种则是通过 docker cp 命令手动将文件复制到正在运行的容器中,只存在于该容器内。

docker cp [local:path]  container:path

5.2、挂载

挂载这种方式不止是复制文件到容器内,还可将宿主机中的文件与容器内的文件关联起来,不论是在容器内修改文件,还是在宿主机中修改文件,都会同步给另一方。

挂载通常在容器生成时进行配置,加上-v 和文件路径,即可实现。

docker run -d -v /host/path:/container/path image_name

复制和挂载在 Docker 中都有各自的用途和优势,选择合适的方式取决于你的具体需求和应用场景。

复制适用于静态文件或配置,如果文件在容器启动时不需要变化,并且需要在镜像构建时就确定,复制是一个不错的选择。

挂载适用于动态数据和持久化存储,如果需要容器能够动态访问和修改主机上的文件,并且希望修改能够保留在主机文件系统中,使用挂载更为合适。

6、共享镜像

6.1、推送到公共或私有仓库

公共仓库,Docker Hub允许用户将自己的镜像推送到公共仓库中,其他人可以通过 docker pull 命令来获取并使用这些镜像。
这种方式,首先你需要有自己的docker 账户,访问Docker Hub的官方网站,即https://hub.docker.com/,先注册,注册成功后,建自己的docker 仓库,推送,我尝试发现向上推送不知道是受网络的影响,还是别的原因,特别慢,而且也没成功。

私有仓库,搭建在本地或云服务上的私有仓库(如AWS ECR、Azure Container Registry等),可以通过相应的认证方式让授权用户访问。这种方式暂时还没尝试过。

6.2、共享镜像文件

镜像文件,一般是指tar 格式的,其他人可以使用 docker load 命令加载这个镜像文件到他们的 Docker 环境中。

首先需要将自己的镜像文件导出:

docker save -o images.tar my_image:tag

对于导出的镜像包,使用者需要加载:

docker load -i image.tar

这种方式一键迁移,会省去不少沟通成本。

6.3、 分享构建指令Dockerfile

这种方式就很好理解了,我们自己构建镜像时用到的Dockerfile指令,分享给他人也可以使用这个 Dockerfile 构建镜像,并附带操作的一些命令和流程。

7、附录,代码

如果有想直接尝试的,百度网盘下载即可,为了保密代码,这里的代码ai是个非常简单的输出 hello,world,但是不妨碍我们创建镜像,生成容器,端口映射,宿主机上访问服务

链接:https://pan.baidu.com/s/1ClkzP-tIrIP910n1g8njfg?pwd=npql
提取码:npql

初学者可专查看第一篇docker内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值