Docker 之 Python Flask 服务的构建运行

前言

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

步骤

一.编写py代码

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

Docker 之 Python Flask 服务的构建运行_第1张图片

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

#!/user/bin/env python3
# -*- coding: utf-8 -*-
# @Email  : [email protected]

from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():
    return '

Hello World!

' @app.route('/user') def getUserName(): return '

Tommy

' if __name__ == '__main__': app.run(host='0.0.0.0', port=7777, debug=True)

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

Docker 之 Python Flask 服务的构建运行_第2张图片

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

Docker 之 Python Flask 服务的构建运行_第3张图片

二.把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

Docker 之 Python Flask 服务的构建运行_第4张图片

因为是后面补充的知识点,所以我的图有很多包,这是另一个项目的,不要在意,看看思路就行。

Docker 之 Python Flask 服务的构建运行_第5张图片

这些就是你要填在requirement.txt中的依赖了。

==============================================================================2021.4.15

2.开始构建镜像

2.1)cd 目录到你的python目录下,即:Dockerfile文件目录下

Docker 之 Python Flask 服务的构建运行_第6张图片

补充说明一点哈,如果你在这个目录下打包镜像,那么是会把venv这个文件夹一起打包的,无端增加了一波大小,所以最好自己创建一个文件夹,把这三文件丢里面,然后再cd到目录里面继续操作。

Ubuntu 右键在终端打开

Docker 之 Python Flask 服务的构建运行_第7张图片

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

Docker 之 Python Flask 服务的构建运行_第8张图片

可以看到,名称为 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 之 Python Flask 服务的构建运行_第9张图片

点击那个红色滴方块,关闭他。

再执行一波运行代码:

docker run -p 7777:7777 flask:tommy

Docker 之 Python Flask 服务的构建运行_第10张图片

OK,跑起来了,这个时候,浏览器一波输入:http://localhost:7777/user

Docker 之 Python Flask 服务的构建运行_第11张图片

可以正常访问,到此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                      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 看看是不是已经删除了。

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

你可能感兴趣的:(Linux,docker,python,ubuntu,linux,运维)