赞
踩
使用Docker容器的形式运行一个简单的Flask项目
1.用python编写一个简单的Flask项目,这里我使用的是PyChram进行项目的编写
创建一个名叫app.py的文件如下:(值得注意的是:Flask 需要一波倒包,鼠标移动到Flask 按 Alt + Enter 完成倒包)
- #!/user/bin/env python3
- # -*- coding: utf-8 -*-
- # @Email : 3431463@qq.com
-
- from flask import Flask
-
- app = Flask(__name__)
-
-
- @app.route('/')
- def index():
- return '<h1>Hello World!</h1>'
-
-
- @app.route('/user')
- def getUserName():
- return '<h1>Tommy </h1>'
-
-
- if __name__ == '__main__':
- app.run(host='0.0.0.0', port=7777, debug=True)
2.代码编写完成,首先就是在PyCharm中先运行一波代码,测试下效果,空白处右键选择 Run ‘app’ 代码正常跑起来:
3.打开浏览器输入 http://localhost:7777 回车 出现 Hello World!说明你Flask没有问题阔以制作docker镜像了
1.创建两个文件 Dockerflie 跟 requirements.txt (注意:Dockerfile是没有拓展名的)
1.1)Dockerfile 是 docker 构建镜像文件的基础,docker会根据Dockerfile的命令构建镜像,Dockerfile代码如下:
- FROM python:3.8-alpine
-
- WORKDIR /app
-
- ADD . /app
-
- RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
-
- EXPOSE 7777
-
- CMD ["python", "app.py"]
大致意思:
- 采用的是 python3.8 版本
-
- 设置docker容器的工作目录 /app
-
- 将当前目录下的所有内容拷贝到容器中的 /app 目录下(app.py Dockerfile requirements.txt)
-
- 倒入app.py所需要的包(这里就是Flask的包了)后面是镜像源,万一你要引入的包需要阔学上网那就不好办了,所以设置了一个国内的镜像源确保万无一失
-
- 容器对外暴露的端口号:7777
-
- 执行 python 代码 app.py
1.2)requirement.txt为python的依赖库
Flask==1.1.1
2021.4.15 补充说明。这里有个问题,1.1.1哪里来的?要是我有很多很多的包,我总不能一个一个找吧?
==============================================================================2021.4.15
没有错,肯定是不用一个一个找的,我打开pycharm下面的Terminal命令行,输入 pip freeze 回车就会有你这个项目所依赖滴东西加版本
当然了,pip指的是你基于python2,很多老铁电脑里面是python3那就用 pip3 freeze
因为是后面补充的知识点,所以我的图有很多包,这是另一个项目的,不要在意,看看思路就行。
这些就是你要填在requirement.txt中的依赖了。
==============================================================================2021.4.15
2.开始构建镜像
2.1)cd 目录到你的python目录下,即:Dockerfile文件目录下
补充说明一点哈,如果你在这个目录下打包镜像,那么是会把venv这个文件夹一起打包的,无端增加了一波大小,所以最好自己创建一个文件夹,把这三文件丢里面,然后再cd到目录里面继续操作。
Ubuntu 右键在终端打开
2.2)执行构建镜像代码
需要注意的是:我下面都是直接 docker 直接运行了,正常情况下是需要 sudo 去运行的,为啥我滴可以这样?
- 默认情况下,只有 root 或者 有 sudo 权限的用户可以执行 Docker 命令。
- 想要以非 root 用户执行 Docker 命令,你需要将你的用户添加到 Docker 用户组,该用户组在 Docker CE 软件包安装过程中被创建。想要这么做,输入:
-
- $ sudo usermod -aG docker $USER
-
- $USER是一个环境变量,代表当前用户名。
- 登出,并且重新登录,以便用户组会员信息刷新。
- docker build -f Dockerfile -t Flask:tommy .
-
- #根据Dockerfile文件,创建一个镜像名为 Flask 标记名为 tommy 的docker镜像
执行错误提示1:
- tommy@tommy-Vostro-3900:~/PycharmProjects/pythonProject$ docker build -f Dockerfile -t Flask:tommy
- invalid argument "Flask:tommy" for "-t, --tag" flag: invalid reference format: repository name must be lowercase
- See 'docker build --help'.
名称必须是小写字母,Flask修改为flask:
docker build -f Dockerfile -t flask:tommy .
执行错误2:
- tommy@tommy-Vostro-3900:~/PycharmProjects/pythonProject$ docker build -f Dockerfile -t flask:tommy
- "docker build" requires exactly 1 argument.
- See 'docker build --help'.
-
- Usage: docker build [OPTIONS] PATH | URL | -
-
- Build an image from a Dockerfile
请扣亮你的双眼,最后是有一个点的而且还要加空格~!!!
docker build -f Dockerfile -t flask:tommy . <---这里有个点
2.3)构建完成执行代码查看镜像
docker images
可以看到,名称为 flask 标记为 tommy 的镜像已经创建成功。
3.把镜像跑起来
docker run -p 7777:7777 flask:tommy
报错提示:
- tommy@tommy-Vostro-3900:~/PycharmProjects/pythonProject$ docker run -p 7777:7777 7790f1ba6894
- docker: Error response from daemon: driver failed programming external connectivity on endpoint romantic_nash (25d453a1f5e5bb4c19cebe2c0922349cc6e4f4cff2abe3a9a142c5fd9849560f): Error starting userland proxy: listen tcp4 0.0.0.0:7777: bind: address already in use.
- ERRO[0000] error waiting for container: context canceled
说明你是在自己的机子测试的,你刚才第一步在PyCharm中运行测试了代码,你TM到现在都没关,导致7777端口被占用
点击那个红色滴方块,关闭他。
再执行一波运行代码:
docker run -p 7777:7777 flask:tommy
OK,跑起来了,这个时候,浏览器一波输入:http://localhost:7777/user
可以正常访问,到此docker部署flask镜像就算完成了。
进阶
- # 查看当前镜像
- docker images
-
- tommy@tommy-Vostro-3900:~$ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- localhost:8082/docker.tommy test 9975373d76d2 38 hours ago 217MB
- sonatype/nexus3 latest f07af611e0df 7 days ago 662MB
- mysql 5.7 a70d36bc331a 7 weeks ago 449MB
- python 3.8-slim be5d294735c6 8 weeks ago 113MB
- python 3.8 b0358f6298cd 8 weeks ago 882MB
- sonatype/nexus3 <none> 8716903d1912 2 months ago 629MB
- python 3.8-alpine 64df5e2068e3 2 months ago 44.5MB
- portainer/portainer latest 62771b0b9b09 7 months ago 79.1MB
- stakater/java8-alpine latest fbe5af149ba7 4 years ago 183MB
- training/webapp latest 6fae60ef3446 5 years ago 349MB
-
- # 可以看到 python 3.8 这个是全的版本,什么东西都有 882 M 很大,占用很多空间
- # 所以docker官网其实也提供了最小精简版本 python 3.8-alpine 这个版本的大小只有183M 还好还好
-
- # 所以Dockerfile文件下的FROM 改下,改成 python:3,8-alpine 可以节约很多空间
-
- FROM python:3.8-alpine
-
- WORKDIR /app
-
- ADD . /app
-
- RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
-
- EXPOSE 7777
-
- CMD ["python", "app.py"]
4.收尾工作,这个时候 Ctrl + C 发现服务会停止,也就是说 命令窗口一关服务就没了,那怎么办呢?
- # -d 后台运行,这样服务就可以后台一直运行了
- docker run -d -p 7777:7777 flask:tommy
-
- # 查看正在运行中的镜像
- docker ps
-
- # 停止一个正在运行的镜像(这个ID就是 ps 查询出来滴id)
- docker kill CONTAINER ID
-
- # 查看当前所有镜像
- docker images
-
- # 删除一个镜像
- docker rmi [name:tag] [image id]
- docker rmi flask:tommy
- docker rmi 7790f1ba6894
4.1)停止镜像
- tommy@tommy-Vostro-3900:~/PycharmProjects/pythonProject$ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- f01bd3055ea9 flask:tommy "python app.py" About a minute ago Up About a minute 0.0.0.0:7777->7777/tcp confident_borg
- b2dd9fb7f01c sonatype/nexus3 "sh -c ${SONATYPE_DI…" 2 days ago Up 5 hours 0.0.0.0:8081->8081/tcp nexus
lask:tommy镜像的 id为:f01bd355ea9
docker kill f01bd3055ea9
4.2)删除镜像
- tommy@tommy-Vostro-3900:~/PycharmProjects/pythonProject$ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- flask tommy 7790f1ba6894 32 minutes ago 907MB
- tommy/tt t1 b7e4080a6925 6 days ago 907MB
- mysql 5.7 a70d36bc331a 6 weeks ago 449MB
- python 3.8 b0358f6298cd 7 weeks ago 882MB
- sonatype/nexus3 latest 8716903d1912 7 weeks ago 629MB
- portainer/portainer latest 62771b0b9b09 7 months ago 79.1MB
- java latest d23bdf5b1b1b 4 years ago 643MB
- training/webapp latest 6fae60ef3446 5 years ago 349MB
查看当前存在的镜像,flask:tommy 镜像id 为:7790f1ba6894
- # 根据id删除
- docker rmi 7790f1ba6894
-
- # 根据名称标记删除
- docker rmi flask:tommy
执行错误提示:
- tommy@tommy-Vostro-3900:~/PycharmProjects/pythonProject$ docker rmi flask:tommy
- Error response from daemon: conflict: unable to remove repository reference "flask:tommy" (must force) - container fed9c379b0b6 is using its referenced image 7790f1ba6894
提示不能删除,想要删除必须强制删除
- # 根据id删除
- docker rmi -f 7790f1ba6894
-
- # 根据名称标记删除
- docker rmi -f flask:tommy
删除后,再运行 docker images 看看是不是已经删除了。
最后的最后:如果文章对您有帮助,下方的 <打赏> 按钮了解一下~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。