1.我的目的
在docker环境中运行我的flask代码,并能够成功访问
2.实现
(1)首先我们将docker环境启动(可以docker ps一下,有查询结果的返回docker就是成功启动了)
(2)将自己的flask项目用到包导出
① 进入flask项目目录
② 在项目主目录下导出(cat检查一下文件内容是否导出成功)
pip freeze > requirements.txt
③ 在项目主目录下创建Dockerfile文件,内容如下,需要根据自己的项目有所更改
FROM python:3.8 # 基础镜像-python的版本
WORKDIR /usr/src/app # 工作路径
COPY requirements.txt ./ # 复制文件到容器中
RUN pip install --no-cache-dir -r requirements.txt # 下载依赖包
COPY . .
CMD [ "python", "./demo1.py" ] # 启动容器时自动执行的命令,我的flask启动命令写在demo1.py函数里,所以这里我直接去运行此文件 使容器一运行我的flask项目也开始运行
④ build镜像:
我直接cd到flask项目主目录下开始build,我的Dockerfile就在此路径下
docker build -t flaskdemo .
# -t :指定要创建的目标镜像名
# . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
通过docker images
查看镜像情况
⑤ 启动容器
docker run -d -p 127.0.0.1:6200:5000 --name mydemo1 flaskdemo
# -d :使容器在后台运行
# -p :端口映射,即访问本机的前者(6200)相当于访问docker容器中的后者(5000)
通过docker images
查看镜像情况
3.效果
(1)访问本机6200端口
成功访问到flask项目的首页,点击也能成功跳转
4.docker背景知识
(1)docker的镜像类似于linux的root文件系统,不会有动态数据,也不会被改变;容器是以镜像为基础,创建一个存储层,之后此容器的运行在此存储层之上,容器被销毁时存储层也会被清除。
(2)Dockerfile-FROM:
自定义镜像的构建也是要基于docker的基础镜像的,比如我的flask项目是用python3.8写的,那就指定基础镜像为python3.8
(3)Dockerfile-RUN:
在build的同时运行命令;
每一个RUN命令都会启动一个容器,执行命令,然后保存此次操作对存储层的修改;如果要修改每一层的工作路径,就用WORKDIR;
(4)Dockerfile-CMD:
在Docker中的每一个容器就是一个进程,在进程启动的时候要指定运行参数,CMD就是主进程运行命令;
(5)Dockerfile-WORKDIR:
指定工作路径----如果路径不存在,会自动创建
(6)Dockerfile-COPY:
通过 /bin/bash 进入查看我们的文件复制情况 :进入/usr/src/app目录下,可以看到我们flask下所有文件确实都被复制到此目录下了
(7)可能你会有疑问:为什么这里能用/bin/bash?这会进入到哪里?这里我的理解是 我们的python项目也是需要在一个"系统"上运行的,docker启动容器的时候就会模拟出一个"隔离的系统"(实际并不是系统,只是这样说容易理解)来运行我们的python项目,并提供了一个shell供我们使用,这就是/bin/bash。
每个容器都会有一个 pid 为 1 的进程,如果这个进程执行结束了,容器也就 close 了;可以看到pid为1的进程就是我们初始化容器时候的进程