0、先安装好docker,可以参考https://cloud.tencent.com/developer/article/1944114
1、新建一个python 项目,命名为flask_docker
2、在根目录下新建app.py文件
文件名:app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "Hello Docker Flask!"
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True)
安装flask模块,可以用以下命令安装,速度比较快
pip3 install flask -i https://pypi.tuna.tsinghua.edu.cn/simple/
然后在终端执行
pip3 freeze > requirements.txt
此时在根目录下会生成requirements.txt文件,里面是项目的各种依赖模块
3、在根目录下创建Dockerfile描述文件
Dockerfile是一个放置在项目根目录下的描述文件,其中包含了一条条指令,有了这个文件,就可以创建出我们所需要的镜像。
文件名:Dockfile
FROM python
WORKDIR /flask_demo
#把requirements.txt文件放到和Dockerfile相同的目录。
#在Dockerfile中使用COPY命令,把requirements.txt文件复制到容器内部
#安装requirements.txt
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
COPY . /flask_demo
CMD ["python3","app.py"]
4、项目目录如下:
5、终端执行命令,创建镜像
docker build -f ./Dockerfile -t flask_demo_ct:1.0 .
注意1.0的后面有个空格,还有个点
参数说明:
-f : 指定要使用的Dockerfile路径
-t :指定要创建的目标镜像名,1.0为指定版本号,可以不写
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
6、终端执行命令,查看创建的镜像
docker images
可以看到刚才新建的镜像flask_demo_ct
(venv) chenhaibing@chenhaibingdeMacBook-Pro flask_docker % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
flask_demo_ct 1.0 570e04d2f13f 2 hours ago 936MB
7、基于创建的镜像运行一个容器
docker run -d --name flask_docker_web -p 5000:5000 flask_demo_ct:1.0
参数说明:
-d :后台运行
–name : 指定容器的名称,这里为flask_docker_web
-p: 映射端口号,【本机端口号:容器端口号】 将本机的端口号5000映射到容器的5000
执行命令,可以查看容器相关信息
docker ps
8、打开网页,查看结果
打开浏览器,输入http://localhost:5000/
9、挂载目录,可以更好地对代码进行调试
通过步骤7的命令运行的容器存在一个问题,当修改app.py中的内容时(修改项目目录下的任何文件都可),在浏览器刷新页面,显示的内容不会更新,为了更好的调试,可以用以下命令启动容器。
容器的名字我改成了flask_docker_web2,相当于运行了一个新的容器,否则会提示容器已经存在
docker run -d --name flask_docker_web2 -v /Users/chenhaibing/code/pythonProject/pythonProject/flask_docker:/flask_demo -p 5000:5000 flask_demo_ct:1.0
可以看到多了-v的参数,这里是把主机目录下挂载到了容器对应的目录。
有可能会遇到报错
:docker: Error response from daemon: Mounts denied:
The path xxx is not shared from OS X and is not known to Docker.
解决方法:
打开桌面应用Docker
再次执行运行容器的命令,如果提示NAME已经存在,删掉原来的或者再换个新名称就行。
运行新的容器后,每次修改项目目录下的文件,到浏览器刷新页面时,都会更新为新的内容。