使用Docker容器的形式运行一个简单的Flask项目
1.用python编写一个简单的Flask项目,这里我使用的是PyChram进行项目的编写
创建一个名叫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’ 代码正常跑起来:
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 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 看看是不是已经删除了。
最后的最后:如果文章对您有帮助,下方的 <打赏> 按钮了解一下~