背景故事

话说去年年底给另外一个组的同事写了一个简单的工单查询系统,用flask写的,当时是部署在我们组的一台测试物理机上,操作系统是Redhat 7。后来我们组的这台测试物理机要做其它用途,领导给两天时间让把应用迁走,问了使用这个应用的同事,他们组自己有一台测试机,可以部署到他们自己的测试机上,于是又搞一通部署。最近使用这个应用的同事又跑过来找我,说他们那台测试机要重装系统,有其它用途。彻底无语,忍无可忍了,用docker吧!搞完之后总结一下,记个笔记。

准备环境

Linux OS

[root@labhost ~]# cat /etc/redhat-releaseCentOS Linux release 7.8.2003 (Core)

Docker Engine

Docker安装请参考官网:https://docs.docker.com/engine/install/centos/#install-using-the-repository

[root@labhost pyalpine]# docker versionClient: Docker Engine - Community Version:           19.03.12 API version:       1.40 Go version:        go1.13.10 Git commit:        48a66213fe Built:             Mon Jun 22 15:46:54 2020 OS/Arch:           linux/amd64 Experimental:      falseServer: Docker Engine - Community Engine:  Version:          19.03.12  API version:      1.40 (minimum version 1.12)  Go version:       go1.13.10  Git commit:       48a66213fe  Built:            Mon Jun 22 15:45:28 2020  OS/Arch:          linux/amd64  Experimental:     false containerd:  Version:          1.2.13  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429 runc:  Version:          1.0.0-rc10  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init:  Version:          0.18.0  GitCommit:        fec3683

环境准备好之后开搞

#创建项目文件夹[root@labhost ~]# mkdir pyalpine#进入项目文件夹[root@labhost ~]# cd pyalpine#创建requirements.txt,实际项目开发中是直接用pip freeze直接生成,这里为了方便是手动创建的,而且这里面我只放了Flask,实际项目会有很多依赖包。[root@labhost pyalpine]# vim requirements.txt[root@labhost pyalpine]# cat requirements.txtFlask>=1.1.1,<1.2#创建app.py文件[root@labhost pyalpine]# vim app.py#代码如下:[root@labhost pyalpine]# cat app.pyfrom flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world():    return 'Hello, Flask which is running on Docker container!'if __name__ == "__main__":   app.run(debug=True, host="0.0.0.0", port="5000")#接下来我们创建Dockerfile,注意:Dockerfile的首字母是大写!!![root@labhost pyalpine]# vim Dockerfile

Dockerfile内容如下:

[root@labhost pyalpine]# cat Dockerfile#拉取镜像FROM python:3.7-alpine#指定工作目录,目录名称自己定义,如果当前指定的目录不存在的话,这个目录会自动被创建WORKDIR /demoapp#复制当前文件夹下的所有项目文件到docker的工作目录,也就是我们上面指定的目录COPY ./ ./#根据requirements.txt文件,安装相关依赖包RUN pip install -r requirements.txt#指定docker运行的时候默认执行的命令,我们想让flask网站随docker启动时就运行CMD ["python", "app.py"]

接下来我们来构建我们自己的docker image:(注意不要把点号给遗漏了!-t参数指定tag,也就是你的docker image叫什么名字)

[root@labhost pyalpine]# docker build . -t mypyalpineSending build context to Docker daemon  4.096kBStep 1/5 : FROM python:3.7-alpine ---> 6ca3e0b1ab69Step 2/5 : WORKDIR /demoapp ---> Using cache ---> c89343983176Step 3/5 : COPY ./ ./ ---> 2cb8fce548c8Step 4/5 : RUN pip install -r requirements.txt ---> Running in 00911a463614Collecting Flask<1.2,>=1.1.1  Downloading Flask-1.1.2-py2.py3-none-any.whl (94 kB)Collecting itsdangerous>=0.24  Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)Collecting Jinja2>=2.10.1  Downloading Jinja2-2.11.2-py2.py3-none-any.whl (125 kB)Collecting click>=5.1  Downloading click-7.1.2-py2.py3-none-any.whl (82 kB)Collecting Werkzeug>=0.15  Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)Collecting MarkupSafe>=0.23  Downloading MarkupSafe-1.1.1.tar.gz (19 kB)Building wheels for collected packages: MarkupSafe  Building wheel for MarkupSafe (setup.py): started  Building wheel for MarkupSafe (setup.py): finished with status 'done'  Created wheel for MarkupSafe: filename=MarkupSafe-1.1.1-py3-none-any.whl size=12629 sha256=f9ec10f37be2db2c6a39211640b9b8336c7be48743dd4a91d13db0ea5e8fe727  Stored in directory: /root/.cache/pip/wheels/b9/d9/ae/63bf9056b0a22b13ade9f6b9e08187c1bb71c47ef21a8c9924Successfully built MarkupSafeInstalling collected packages: itsdangerous, MarkupSafe, Jinja2, click, Werkzeug, FlaskSuccessfully installed Flask-1.1.2 Jinja2-2.11.2 MarkupSafe-1.1.1 Werkzeug-1.0.1 click-7.1.2 itsdangerous-1.1.0Removing intermediate container 00911a463614 ---> 12e21da37c96Step 5/5 : CMD ['python', 'app.py'] ---> Running in ad78a874fd79Removing intermediate container ad78a874fd79 ---> f0d4b0160413Successfully built f0d4b0160413Successfully tagged mypyalpine:latest

恭喜你,你已经成功构建了一个自己的docker image:mypyalpine,那我们现在来让他跑起来:

[root@labhost ~]# docker run -p 5050:5000 --name myflask mypyalpine * Serving Flask app "app" (lazy loading) * Environment: production   WARNING: This is a development server. Do not use it in a production deployment.   Use a production WSGI server instead. * Debug mode: on * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 236-169-898

简单介绍一下:

  • docker run:想要跑一个docker,必须要敲的命令

  • -p 5050:5000:指定端口映射,冒号前面的是暴露到外面的端口号,冒号后面的是在docker里面的端口号

  • --name  myflask:指定将要跑起来的docker的名称,可选参考,但是推荐加上,否则docker服务会自己随机给你的docker起个名字,你都不认识,所以自己的孩子还是起个好听点的名字,方便自己记忆和使用。

  • mypyalpine:这个是上一步我们构建docker image时,给image起的名字,这个必须指定,别指定错了。

小伙伴发现了没有,上面我们运行docker之后,终端直接显示的我们的flask程序启动的信息,没办法再输入其它命令了,如果你想继续输入指令怎么搞?所以上面运行docker的命令格式不是太好,我们再来改造一下,让我们的docker启动之后在后台运行,只需加上一个 -d参数即可,然后我们再用docker ps来查看正在运行的container信息:

[root@labhost pyalpine]# docker run -d -p 5050:5000 --name myflask mypyalpined464fd0fa04893db4640cc3f2afe201ca07718978bc55f7a17bcc909cab25475[root@labhost pyalpine]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMESd464fd0fa048        mypyalpine          "python app.py"     3 seconds ago       Up 2 seconds        0.0.0.0:5050->5000/tcp   myflask[root@labhost pyalpine]#

注意:如果你第一次运行docker run没有加 -d参数,想再次运行docker run加-d参数,是会报错的,此时你需要先停止当前运行的container,然后删除container,最后再运行加上 -d参数的命令就可以了。

[root@labhost ~]# docker run -d -p 5050:5000 mypyalpine387d43c0920574fd8ea7c75db611c74de7fbc4bdb5be2961246fb8642ad7bc5cdocker: Error response from daemon: driver failed programming external connectivity on endpoint quizzical_bassi (0696007b82f3f83880fc6b43830b5b6680bf8cfc6cd48856fd7b504dc0e87abc): Bind for 0.0.0.0:5050 failed: port is already allocated.[root@labhost ~]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES42b0bd3bf39c        mypyalpine          "python app.py"     4 hours ago         Up 4 hours          0.0.0.0:5050->5000/tcp   goofy_faraday[root@labhost ~]# docker stop 42b0bd3bf39c42b0bd3bf39c[root@labhost ~]# docker rm 42b0bd3bf39c42b0bd3bf39c[root@labhost pyalpine]# docker run -d -p 5050:5000 --name myflask mypyalpined464fd0fa04893db4640cc3f2afe201ca07718978bc55f7a17bcc909cab25475[root@labhost pyalpine]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMESd464fd0fa048        mypyalpine          "python app.py"     3 seconds ago       Up 2 seconds        0.0.0.0:5050->5000/tcp   myflask[root@labhost pyalpine]#

我们现在来访问一下flask网站:http://192.168.137.200:5050

可能大家对上面我们拉取的base image有点疑问,为什么选择python:3.7-alpine这个image作为我们的base image来构建我们的docker?原因很简单:身材苗条。我们可以看一下build好的image mypyalpine大小和一个ubuntu或者centos的image大小比较:

  • myflask这个是我用python:3.6这个base image构建的,925MB,将近1GB.

  • mypyalpine这个是我们用python:3.7-alpine构建的,只有83.8MB,不到100MB.

[root@labhost pyalpine]# docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED             SIZEmypyalpine          latest              160344652c41        35 minutes ago      83.8MBmyflask             latest              c35e990ccb0c        About an hour ago   925MBpython              3.6                 e0373ff33a19        9 days ago          914MBpython              3.7-alpine          6ca3e0b1ab69        9 days ago          73.1MBbusybox             latest              c7c37e472d31        10 days ago         1.22MBubuntu              latest              74435f89ab78        3 weeks ago         73.9MBcentos              latest              831691599b88        3 weeks ago         215MB

最后,Enjoy your Docker!

centos部署python flask_用Dockerfile部署你的Flask Web应用相关推荐

  1. docker 部署Python项目 以及dockerfile文件的编写

    Dockerfile文件详解:https://www.cnblogs.com/panwenbin-logs/p/8007348.html Docker的基本使用(部署python项目): https: ...

  2. docker 打包部署 python项目_Docker如何部署Python项目的实现详解

    Docker 是一个开源项目,为开发人员和系统管理员提供了一个开放平台,可以将应用程序构建.打包为一个轻量级容器,并在任何地方运行.Docker 会在软件容器中自动部署应用程序. 在本篇中,我将介绍如 ...

  3. docker如何部署python项目_Docker如何部署Python项目的实现详解

    Docker 是一个开源项目,为开发人员和系统管理员提供了一个开放平台,可以将应用程序构建.打包为一个轻量级容器,并在任何地方运行.Docker 会在软件容器中自动部署应用程序.IBV免费资源网 在本 ...

  4. linux 下部署Python项目

    2019-02-18  by 崔斐然 目录 一.启用ROOT账户及密码和ssh 二.安装screen实现不掉线运行程序 三.部署Python项目 四.部署项目环境 五.善后 一.启用ROOT账户及密码 ...

  5. Dockerfile实战之部署python网站

    Dockerfile实战之部署python网站 一.创建python文件 二.编写Dockerfile脚本 三.创建镜像 1.生成镜像 2.查看镜像 四.创建容器 1.生成容器 2.查看容器状态 五. ...

  6. CentOS中使用Dockerfile部署初始化sql文件的mysql

    场景 Docker中部署mysql数据库: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99213563 CentOS中使用Do ...

  7. CentOS中使用Dockerfile部署带websocket的SpringBoot的jar包

    场景 CentOS7中使用Dockerfile部署后台jar包: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119818808 ...

  8. Linux(Centos)部署 Python项目

    一.前言 我的项目不大就是一个main.py,由于上级要求需要部署到Linux中,第一次做linux部署python,很多都不懂,找了很多资料,也走了很多弯路,所以把整个部署过程记录下. 首先想要在l ...

  9. centos部署python个人博客项目

    python环境部署,将Django项目部署到linux服务器上,我们部署的linux系统是centos7首先,我们先在linux上搭建我们的Python3环境: 在这里首先强调一下,Centos7系 ...

最新文章

  1. jittor和pytorch生成网络对比之ebgan
  2. DCMTK:将显示曲线导出到文本文件
  3. 记录java应用部署到k8s中
  4. 使用腾讯开发平台获取QQ用户数据资料
  5. 阿里云ECS服务器连接不上3306端口?
  6. OpenCV3学习(12.2) 目标跟踪之运动模板法segmentMotion实现(Mat版本)
  7. Laravel核心解读--Database(四) 模型关联
  8. [导入][转载]超强大的jquery formValidator
  9. flexgdsgen
  10. tensorflow之reshape
  11. 10个Jquery幻灯片插件教程
  12. python链表的实例_python数据结构链表之单向链表(实例讲解)
  13. fanuc机器人试题_工业机器人知识要点解析(FANUC机器人)
  14. i511260h参数 i5 11260h评测
  15. Tegra environment
  16. iterm2 + oh my zsh 实现 macOS X 下炫酷终端
  17. 双线macd指标参数最佳设置_一文讲透双线MACD指标及其实战运用
  18. Elasticsearch启动报错:warning: ignoring JAVA_HOME=C:\Program Files\Java\jdk1.8.0_191; using bundled JDK
  19. ZZNUOJ_C语言1032:员工薪水(完整代码)
  20. 做前端的你,如何克服技术焦虑?

热门文章

  1. 《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问
  2. SQLite For .Net 已经整合了32位和64位
  3. 循环所有数据库执行脚本
  4. 推荐几个配色和图标网站
  5. Android Service 的一些笔记
  6. JavaScript操作大全整理(思维导图三--函数基础)
  7. pythom打包文件太大_从SQL注入到整站打包与本地搭建
  8. python杀死了excel_Python杀死了Excel|自动更新表格,告别繁琐
  9. Spring上传时报Invalid CSRF Token错误解决方案
  10. 龙芯购买MIPS指令集的授权