当前位置:   article > 正文

Docker 之 Python Flask 服务的构建运行_docker flask

docker flask

前言

使用Docker容器的形式运行一个简单的Flask项目

步骤

一.编写py代码

1.用python编写一个简单的Flask项目,这里我使用的是PyChram进行项目的编写

创建一个名叫app.py的文件如下:(值得注意的是:Flask 需要一波倒包,鼠标移动到Flask 按 Alt + Enter 完成倒包)

  1. #!/user/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # @Email : 3431463@qq.com
  4. from flask import Flask
  5. app = Flask(__name__)
  6. @app.route('/')
  7. def index():
  8. return '<h1>Hello World!</h1>'
  9. @app.route('/user')
  10. def getUserName():
  11. return '<h1>Tommy </h1>'
  12. if __name__ == '__main__':
  13. app.run(host='0.0.0.0', port=7777, debug=True)

2.代码编写完成,首先就是在PyCharm中先运行一波代码,测试下效果,空白处右键选择 Run ‘app’ 代码正常跑起来:

3.打开浏览器输入 http://localhost:7777 回车 出现 Hello World!说明你Flask没有问题阔以制作docker镜像了

二.把flask服务构建成一个docker镜像

1.创建两个文件 Dockerflie 跟 requirements.txt (注意:Dockerfile是没有拓展名的

1.1)Dockerfile 是 docker 构建镜像文件的基础,docker会根据Dockerfile的命令构建镜像,Dockerfile代码如下:

  1. FROM python:3.8-alpine
  2. WORKDIR /app
  3. ADD . /app
  4. RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
  5. EXPOSE 7777
  6. CMD ["python", "app.py"]

大致意思:

  1. 采用的是 python3.8 版本
  2. 设置docker容器的工作目录 /app
  3. 将当前目录下的所有内容拷贝到容器中的 /app 目录下(app.py Dockerfile requirements.txt)
  4. 倒入app.py所需要的包(这里就是Flask的包了)后面是镜像源,万一你要引入的包需要阔学上网那就不好办了,所以设置了一个国内的镜像源确保万无一失
  5. 容器对外暴露的端口号:7777
  6. 执行 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 去运行的,为啥我滴可以这样?

  1. 默认情况下,只有 root 或者 有 sudo 权限的用户可以执行 Docker 命令。
  2. 想要以非 root 用户执行 Docker 命令,你需要将你的用户添加到 Docker 用户组,该用户组在 Docker CE 软件包安装过程中被创建。想要这么做,输入:
  3. $ sudo usermod -aG docker $USER
  4. $USER是一个环境变量,代表当前用户名。
  5. 登出,并且重新登录,以便用户组会员信息刷新。
  1. docker build -f Dockerfile -t Flask:tommy .
  2. #根据Dockerfile文件,创建一个镜像名为 Flask 标记名为 tommy 的docker镜像

执行错误提示1:

  1. tommy@tommy-Vostro-3900:~/PycharmProjects/pythonProject$ docker build -f Dockerfile -t Flask:tommy
  2. invalid argument "Flask:tommy" for "-t, --tag" flag: invalid reference format: repository name must be lowercase
  3. See 'docker build --help'.

名称必须是小写字母,Flask修改为flask:

docker build -f Dockerfile -t flask:tommy .

执行错误2:

  1. tommy@tommy-Vostro-3900:~/PycharmProjects/pythonProject$ docker build -f Dockerfile -t flask:tommy
  2. "docker build" requires exactly 1 argument.
  3. See 'docker build --help'.
  4. Usage: docker build [OPTIONS] PATH | URL | -
  5. 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

报错提示:

  1. tommy@tommy-Vostro-3900:~/PycharmProjects/pythonProject$ docker run -p 7777:7777 7790f1ba6894
  2. 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.
  3. 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镜像就算完成了。

进阶

  1. # 查看当前镜像
  2. docker images
  3. tommy@tommy-Vostro-3900:~$ docker images
  4. REPOSITORY TAG IMAGE ID CREATED SIZE
  5. localhost:8082/docker.tommy test 9975373d76d2 38 hours ago 217MB
  6. sonatype/nexus3 latest f07af611e0df 7 days ago 662MB
  7. mysql 5.7 a70d36bc331a 7 weeks ago 449MB
  8. python 3.8-slim be5d294735c6 8 weeks ago 113MB
  9. python 3.8 b0358f6298cd 8 weeks ago 882MB
  10. sonatype/nexus3 <none> 8716903d1912 2 months ago 629MB
  11. python 3.8-alpine 64df5e2068e3 2 months ago 44.5MB
  12. portainer/portainer latest 62771b0b9b09 7 months ago 79.1MB
  13. stakater/java8-alpine latest fbe5af149ba7 4 years ago 183MB
  14. training/webapp latest 6fae60ef3446 5 years ago 349MB
  15. # 可以看到 python 3.8 这个是全的版本,什么东西都有 882 M 很大,占用很多空间
  16. # 所以docker官网其实也提供了最小精简版本 python 3.8-alpine 这个版本的大小只有183M 还好还好
  17. # 所以Dockerfile文件下的FROM 改下,改成 python:3,8-alpine 可以节约很多空间
  18. FROM python:3.8-alpine
  19. WORKDIR /app
  20. ADD . /app
  21. RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
  22. EXPOSE 7777
  23. CMD ["python", "app.py"]

4.收尾工作,这个时候 Ctrl + C 发现服务会停止,也就是说 命令窗口一关服务就没了,那怎么办呢?

  1. # -d 后台运行,这样服务就可以后台一直运行了
  2. docker run -d -p 7777:7777 flask:tommy
  3. # 查看正在运行中的镜像
  4. docker ps
  5. # 停止一个正在运行的镜像(这个ID就是 ps 查询出来滴id)
  6. docker kill CONTAINER ID
  7. # 查看当前所有镜像
  8. docker images
  9. # 删除一个镜像
  10. docker rmi [name:tag] [image id]
  11. docker rmi flask:tommy
  12. docker rmi 7790f1ba6894

4.1)停止镜像

  1. tommy@tommy-Vostro-3900:~/PycharmProjects/pythonProject$ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. f01bd3055ea9 flask:tommy "python app.py" About a minute ago Up About a minute 0.0.0.0:7777->7777/tcp confident_borg
  4. 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)删除镜像

  1. tommy@tommy-Vostro-3900:~/PycharmProjects/pythonProject$ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. flask tommy 7790f1ba6894 32 minutes ago 907MB
  4. tommy/tt t1 b7e4080a6925 6 days ago 907MB
  5. mysql 5.7 a70d36bc331a 6 weeks ago 449MB
  6. python 3.8 b0358f6298cd 7 weeks ago 882MB
  7. sonatype/nexus3 latest 8716903d1912 7 weeks ago 629MB
  8. portainer/portainer latest 62771b0b9b09 7 months ago 79.1MB
  9. java latest d23bdf5b1b1b 4 years ago 643MB
  10. training/webapp latest 6fae60ef3446 5 years ago 349MB

查看当前存在的镜像,flask:tommy 镜像id 为:7790f1ba6894

  1. # 根据id删除
  2. docker rmi 7790f1ba6894
  3. # 根据名称标记删除
  4. docker rmi flask:tommy

执行错误提示:

  1. tommy@tommy-Vostro-3900:~/PycharmProjects/pythonProject$ docker rmi flask:tommy
  2. Error response from daemon: conflict: unable to remove repository reference "flask:tommy" (must force) - container fed9c379b0b6 is using its referenced image 7790f1ba6894

提示不能删除,想要删除必须强制删除

  1. # 根据id删除
  2. docker rmi -f 7790f1ba6894
  3. # 根据名称标记删除
  4. docker rmi -f flask:tommy

删除后,再运行 docker images 看看是不是已经删除了。

最后的最后:如果文章对您有帮助,下方的 <打赏> 按钮了解一下~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/185754
推荐阅读
相关标签
  

闽ICP备14008679号