【Flask-2】使用Dockerfile创建镜像来部署一个基于Flask的深度学习项目

参考链接:使用Dockerfile创建镜像来部署一个基于Flask的深度学习项目_iQTan的博客-CSDN博客_dockerfile flask

容器与镜像的区别

镜像,是一个静态概念,一个镜像由若干只读层(read-only layer)构成。

容器和镜像一样,也是若干层的叠加,唯一区别是所有只读层的最上面一层,是一层可读可写层,如上图绿色图例所示。

Docker 镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部!这一层就是我们通常说的容器层,容器之下的都叫镜像层!

容器 = 容器镜像 + 可读可写层

1、Dockerfile文件:

# 基于的基础镜像
FROM python:3.7
# 维护者信息
MAINTAINER *** ***@qq.com
# 复制代码到code文件夹
COPY . ../code
# 设置code文件夹是工作目录
WORKDIR /code
RUN apt-get update
RUN apt-get install -y libgl1-mesa-dev
RUN pip install --upgrade pip
RUN pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
RUN pip install -r requirements.txt
# 申明镜像内服务监听的端口
EXPOSE 5000
CMD ["python","test.py"]

特别指出:

  • FROM python:3.8.0:python 3.8.0作为基础镜像(或父镜像)。
  • COPY:其用法为COPY [src] [dest],此处src为”.“,本例即将工作目录下的全部代码拷贝到dest(镜像下的目录)。
  • WORKDIR:其用法为WORKDIR [dir],本例即将本地工作目录设置为dir的"/aep-ai-seal-v1-yolov5"。
  • RUN apt-get update:拉取下来的基础镜像需要更新一下。
  • RUN apt-get install -y xxxxx:安装项目所需的一些组件。
  • RUN pip install --upgrade pip:更新pip,以便后续顺利安装其他组件。
  • RUN pip install torch-xxxx:加载YOLOv5所需的组件pytorch。
  • RUN pip install -r requirements.txt:加载镜像所需的库。
  • EXPOSE 5000:抛出的端口。
  • CMD [“python”,“run.py”]:python环境下运行镜像中主程序。

2、创建镜像:

打开一个终端,进入到工作目录下,输入以下命令进行编译。

# docker build -t 镜像名:tag名 .
docker build -t flask:1.0 .

需要注意,镜像名与tag可以根据需要命名,指令后的”.“不要遗漏,其表示默认Dockerfile。

3、测试镜像

docker images

4、启动镜像

docker run -p 本机映射端口:镜像映射端口 -d  --name 启动镜像名称 -e 设置环境变量   镜像名称:镜像版本号

  • 参数释义:
  •  -p   5000:5000表示端口映射,前面的端口是外部环境的端口,后面的端口表示镜像的端口,通过这句话将两个端口连接起来。访问外部环境的5000端口,就相当于访问镜像的5000端口
  •  -d   后台运行
  •  --name   容器名称
  •  -e    设置环境变量 
docker run -p 5000:5000 flask2.0:latest

5、docker读取NVIDIA显卡

创建nvidia-container-toolkit.sh脚本

$ cat nvidia-container-runtime-script.sh
 
# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

执行脚本

sh nvidia-container-runtime-script.sh

运行利用GPU的Ubuntu容器

# --rm 代表运行之后则删除容器
docker run -p 5000:5000 --gpus all --rm flask2.0:latest

6、Docker容器进入的方式

  • 使用docker attach进入Docker容器
sudo docker run -itd flask:1.0 /bin/bash  

使用docker attach进入该容器

sudo docker attach
  • 使用docker exec进入Docker容器
zxh@zxh-Precision-3640-Tower:~$ sudo docker ps
CONTAINER ID   IMAGE             COMMAND            CREATED          STATUS          PORTS                                       NAMES
8a6742c70360   flask2.0:latest   "python test.py"   17 minutes ago   Up 17 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   gifted_mirzakhani
zxh@zxh-Precision-3640-Tower:~$ sudo docker exec -it 8a6742c70360 /bin/bash
root@8a6742c70360:/code# nvidia-smi

PS:使用方式一时,当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。因为这个原因,所以docker attach命令不太适合于生产环境。

6、将镜像打成tar包

docker image save flask2.0> flask.tar

7、导入打包好的镜像

cong@cong-desktop:~$sudo docker load -i flask.tar 
open /var/lib/docker/tmp/docker-import-445297053/839f6fa1ac9daa8dc13a9b059857e5808443eda15bb1d63553a42a2ac79baf8a/json: no such file or directory
# 上述命名出现错误,可采用以下命令
cat flask.tar | sudo docker import - flask.tar 

相关命令:

# 为库中镜像改名:
docker tag {imageID} {repository}:{tag}
# 停止所有容器
docker stop $(docker ps -aq)
# 删除所有容器
docker rm $(docker ps -aq)
# 通过命令可以从镜像仓库中拉取镜像
docker image pull <repository>:<tag>
# commit镜像:先进入基础镜像的容器里面,然后安装需要的包,最后执行如下命令:
docker commit <podid> <imagetag>
apt update 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值