本文写给没有部署经验的小伙伴们,网上文章很多,但是照着网上的例子,有可能会遇到些问题,但切记不要着急,跟着错误提示,慢慢百度,总能找到你要的答案,你的问题一定不是个例。
预先准备:在Linux服务器上安装Docker;
先查看操作系统版本:cat /proc/version,比如:Ubuntu等;
然后参考菜鸟教程安装对应版本的docker(通过这个网站要熟悉常用的docker知识),这一步一般不会出问题,安装完成后执行以下命令:
sudo docker run hello-world,如果运行成功会出现Hello from Docker! This message shows……
表明成功了。Ubuntu Docker 安装 | 菜鸟教程Ubuntu Docker 安装 Docker Engine-Community 支持以下的 Ubuntu 版本: Xenial 16.04 (LTS) Bionic 18.04 (LTS) Cosmic 18.10 Disco 19.04 其他更新的版本…… Docker Engine - Community 支持上 x86_64(或 amd64)armhf,arm64,s390x (IBM Z),和 ppc64le(IBM..https://www.runoob.com/docker/ubuntu-docker-install.html
主要参考以下链接:完整Python使用docker打包部署flask项目(flask+gunicorn+gevent)___WuJian的博客-CSDN博客_gunicorn 打包环境:Ubuntu16.04,docker目录结构:.├── app_flask.py├── Dockerfile├── gunicorn.conf.py└── requirements.txt1、创建文件夹docker_flaskmkdir docker_flask2、创建appsudo vim app_flask.py添加代码:from flask impor...https://blog.csdn.net/WuJian_Home/article/details/98969009
1、mkdir docker_flask
2、sudo vim app_flask.py
添加以下代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
使用命令:wq退出保存,vim 没有可以自行安装,建议安装,使用方便
3、安装依赖:主要是requirements.txt
执行命令:pip freeze > requirements.txt,也可以手动添加,
此处有个包可以安装下:pip install pipreqs
,进入需要生成文件的目录执行: pipreqs ./ ,用dir 查看可以看到已经生成文件
4、编写gunicorn(绿色独角兽)配置文件gunicorn.conf.py文件
sudo vim gunicorn.conf.py
添加一下代码:
workers = 5
worker_class = "gevent"
bind = "0.0.0.0:8080"
5、执行python app_flask.py,如果成功可以用浏览器访问:http://127.0.0.1:5000/,可以看到hello world!
6、最关键的一步,我也会做详细的说明
sudo vim Dockerfile
添加以下内容:
FROM python:3
MAINTAINER WuJian_Home
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["gunicorn", "app_flask:app", "-c", "./gunicorn.conf.py"]
以下不用添加
解释一下参数:
FROM # 指明你创建的镜像,他的基础镜像是谁,说白了就是安装后面的环境python,并指定版本3,也可以指定其他版本,比如:python:3.6
MAINTAINER # 维护者信息, 添上自己的信息,这里还是用原作者的吧
COPY # 将宿主机的文件cp到创建的镜像当前路径下,这种./ .啥的,刚开始接触,可能有点陌生,习惯就好了,就类似windows的目录层级
RUN # 你需要在创建镜像之前,需要执行的命令,就是安装所需的所有依赖包,比如我需要numpy、pandas等一行放一个就可以,也可以指定版本号,这个requirements.txt文件可以自动添加,也可以手动输入
CMD # 创建容器后执行的第一个命令,这个写法可能对初学者看的一脸懵逼,什么玩意,其实就是在容器启动后执行的一行命令:翻译下这个命令,相当于在容器启动后执行,gunicorn app_flask:app -c ./gunicorn.conf.py,这是绿色独角兽的一条命令,详细可以了解下绿色独角兽的基本使用:gunicorn,当然执行这个命令往往会出些问题,不过当前你发现不了,因为还没执行,接下来会介绍。
7、制作docker image
我这里镜像的名字直接做成flask_demo了,注意后面有个点
docker build -t flask_demo:1.0 .
制作完成了,可以看到还是蛮大的,接下来就是使用它了
docker image ls -a | grep flask_demo
docker images | grep flask_demo
两个命令一样,喜欢用哪一个看你自己啊
8、使用这个镜像创建容器(如果对容器和镜像不太熟悉,可以先看看docker的基本知识)
docker run -it --name=flask_app -p 5001:8080 flask_demo:1.0
解释一下参数
--name # 是给你创建的容器起一个名字,在后续进行容器操作的时候可以直接使用名字,不用在使用id
-p # 将宿主机的端口映射到容器中,8080是必须的,上面指定了,前面的端口可以自己定义,后面用浏览器访问时要用到
如果没有报错,出现:
strarting gunicorn 19.9.0
Listening at: http://0.0.0.0:8080
.....
测试是否构建成功:在宿主机(就是你本地的机器)用浏览器访问:http://127.0.0.1:5000/(注意:不是这个地址http://0.0.0.0:8080),可以看到hello world!
按ctrl退出,再次启动,可以使用命令:docker container start flask_app,其中flask_app是容器的名字,刚才docker run时指定的
恭喜,不但成功构建了镜像,也构建了容器,服务成功启动,
如果想后台启动,在命令中加 -d
docker run -it -d --name=flask_app -p 5001:8080 flask_demo:1.0
此时不会再出现这一堆(strarting gunicorn 19.9.0
Listening at: http://0.0.0.0:8080
.....),而是会出现一串id,表明容器构建且启动成功了,并在容器中立即执行了gunicorn app_flask:app -c ./gunicorn.conf.py,一定要分清你的宿主机中,还是在容器中,CMD命令是容器启动后在容器中执行的命令。
9、后面可以发布你的镜像,用的时候再拉取。
如果你按照上面的操作,执行没有任何报错,恭喜你,你是幸运的,好多帖子也是你超我我超你,但是其实后面会遇到很多问题。我们一一总结下常见的问题。
本文主要参考:
完整Python使用docker打包部署flask项目(flask+gunicorn+gevent)___WuJian的博客-CSDN博客_gunicorn 打包
实际过程中,肯定会出现各种各样问题,对Linux及docker初学者来说有点懵逼,不要担心,根据错误提示,一般都能找到答案。
更换源比如可以写作:pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
引申:docker 设置国内镜像源
https://www.cnblogs.com/liuyi13535496566/p/12329027.html
创建或修改 /etc/docker/daemon.json 文件,修改为如下形式
vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
systemctl restart docker.service
主要参考pip install -r requirements.txt安装问题 - 一路向北321 - 博客园
主要参考:
docker部署,生成依赖项清单requirements.txt_gac0540的博客-CSDN博客_docker requirement
pip install pipreqs
进入需要生成文件的目录执行: pipreqs ./
首先在容器中(注意再强调遍,在容器中),执行apt-get update
然后执行:apt-get install vim
主要参考:
在docker容器中安装vim命令进行编辑文件 - 菩提树下的丁春秋 - 博客园
主要原因就是因为既安装了Python 2.7又安装了Python3.6等版本导致冲突,两种方法:
第一:在容器中根据错误提示目录位置(一般哪句错误都是提示绝对路径,在容器中找到即可),找到from_dict.py文件,修改为"from collections import Mapping" 改为"from collections.abc import Mapping"
第二:可以卸载Python2.7,重新安装Python3.6等版本,即可解决
主要参考:
Python3.10 ImportError: cannot import name ‘Mapping‘ from ‘collections‘ (/usr/local/lib/python3.10_hongel110的博客-CSDN博客
补充:linux环境下如何卸载软件,
卸载:python3.4
sudo apt-get remove python3.4
或者用该命令清除python3.4,sudo apt-get purge --auto-remove python3.4
主要参考:linux怎么卸载python?-Python教程-PHP中文网
创建一个docker组
$ sudo groupadd docker
添加当前用户到docker组
$ sudo usermod -aG docker $USER
//sudo usermod -aG docker yundong
登出,重新登录shell
$ sudo service docker restart
主要参考:
docker命令不需要敲sudo的方法__小鱼塘的博客-CSDN博客
问题6:OSError: [Errno 98] Address already in use,端口号占用,需要杀死原端口号,或是更滑端口,使用终端命令杀死进程
先查找进程id,使用命令 lsof -i:端口号 ,比如:lsof -i:5050 , 可通过端口号来查找进程ID
然后执行:kill -9 pid
主要参考:解决:OSError: [Errno 98] Address already in use_只小白的博客-CSDN博客
后记:每个人安装肯定会遇到不同的问题,不要慌,记住,你绝不是第一个出现该问题的人!
本文对引用的链接进行了说明,如果有不妥之处,请联系我,谢谢