centos部署python flask_用Dockerfile部署你的Flask Web应用

背景故事

284b0f3de6587a4949c92d42a3fa0192.png

话说去年年底给另外一个组的同事写了一个简单的工单查询系统,用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

c1c80c9f14b2e182dd69f62285b885ac.png

可能大家对上面我们拉取的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!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7安装flink集群_《从0到1学习Flink》—— Flink 写入数据到 Kafka

前言之前文章 《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch 写了如何将 Kafka 中的数据存储到 ElasticSearch 中&#xff0c;里面其实就已经用到了 Flink 自带的 Kafka source connector&#xff08;FlinkKafkaConsumer&#xff09;。存入到 ES 只是其中一种情况&a…

Qt中的私有信号

一、什么是Qt私有信号&#xff1f; 直接引用Qt文档中的描述&#xff1a; 二、私有信号的作用 私有信号只能被响应&#xff0c;不能被用户代码来发射&#xff08;emit&#xff09;。这是一种对某些信号的权限控制&#xff0c;也就是用户代码没有权力“发号施令”&#xff0c;只…

opencv获取图片像素坐标_利用OpenCV从图片中提取矩形并标注坐标(室内平面地图)(一)

​某城市会展中心室内地图背景一名室内设计师的日常工作从设计一张会展地图开始。常常有这样的场景&#xff1a;划分除规范的展位后&#xff0c;进入销售阶段&#xff0c;频繁的需要修改这张地图&#xff0c;如展示拆分、合并、换位置、标记已交易。问题从上图中标记色块的是有…

【转】C#中ToString()格式详解

以下内容均摘自博客园&#xff0c;仅供资料查询。 ToString格式化 在很多对象显示为字符串的时候都会使用到ToString中的格式化&#xff0c;由于以前没怎么注意到这个问题&#xff0c;想总结一下各个基础结构对象的格式化&#xff0c;以便后备之用&#xff01;&#xff01;&am…

【编译原理】入门总结

教程资源 入门教程在&#xff1a;手把手教你做一个 C 语言编译器 学习过程 19年尝试学了一下&#xff0c;中途看不懂放弃了。20年底从头再看一遍&#xff0c;经过一年的知识积累&#xff0c;在仔细研读之下&#xff0c;终于算是学懂了。此文中记录了我在最初学习时遇到的问题…

Qt添加翻译文件

以在Qt Creator中开发为例&#xff1a; 第一步 在.pro文件中添加一行 TRANSLATIONS projectName_zh.ts 保存&#xff0c;执行一次qmake。 注&#xff1a;ts文件是xml文件保存了需要翻译的信息。 第二步 选择菜单&#xff1a;工具->外部->Qt预言家->更新翻译。 可…

应用程序标准输入输出、Shell、程序界面的关系

发展史 计算机在发展初期&#xff0c;电脑上的软件是没有窗口的&#xff0c;只有一个命令行&#xff0c;这个软件叫Shell&#xff0c;中文的意思是外壳。Shell是一个统一的叫法&#xff0c;实际在不同的系统中&#xff0c;又有很多种Shell软件&#xff0c;如下表所示&#xff…

安卓简单天气预报app源码_七个个小众但实用的APP,效率翻倍~

推荐7个小众但实用的APP1、PDF处理助手下面就是软件的启动图&#xff0c;没有任何广告。并且直接标明了这个软件的三大特点&#xff1a;简单、免费、快捷下面就是软件的启动图&#xff0c;没有任何广告。而且免注册登录即可使用&#xff0c;简直是一款良心软件了。2、菜鸟教程菜…

【转】Jenkins详细教程

最近花了一段时间研究jenkins这个工具。所以写下这篇文章&#xff0c;算是当做记录吧&#xff01; 一、jenkins是什么&#xff1f; Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要…

拼接符 防注入正则校验_Apache Kylin 命令注入漏洞调试分析(CVE-2020-1956)

1、前言Apache Kylin是一个开源的、分布式的分析型数据仓库&#xff0c;提供Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据。近日&#xff0c;百度云安全团队监测到Apache官方发出了一个漏洞通告&#xff0c;披露了Apache kylin多版本存在命令注入漏…

can使能上拉 gpio_IMX6ULL 的 GPIO 操作方法

来源&#xff1a;百问网作者&#xff1a;韦东山本文字数&#xff1a;1652&#xff0c;阅读时长&#xff1a;4分钟CCM: Clock Controller Module (时钟控制模块) IOMUXC : IOMUX Controller&#xff0c;IO 复用控制器 GPIO: General-purpose input/output&#xff0c;通用的输入…

【转】.NET 的 WebSocket 开发包比较

转载于http://www.oschina.net/translate/websocket-libraries-comparison-2 编者按 本文出现在第三方产品评论部分中。在这一部分的文章只提供给会员&#xff0c;不允许工具供应商用来以任何方式和形式来促销或宣传产品。请会员报告任何垃圾信息或广告。 Web项目常常需要将数…

vb checkbox选中和不选中_UE4 4.23 RetainerBox 选中框位置不正确

Bug表现在UE4 4.23版本&#xff0c;实现自定义控件时&#xff0c;继承了RetainerBox&#xff0c;发现当内部包裹子控件时&#xff0c;先编辑器面板选中子物体&#xff0c;发现选中位置有偏移。位置偏移当窗口缩放时&#xff0c;选中框位置发现当窗口最小化时&#xff0c;偏移位…

去哪查阅ISO国际标准?

ISO官网 访问ISO官网&#xff0c;不需要翻墙&#xff0c;只要懂点英文就行。 ISO官网地址&#xff1a;https://www.iso.org/&#xff08;可进行全面了解、购买付费内容&#xff09; ISO部分公开标准下载地址&#xff1a;https://standards.iso.org/ittf/PubliclyAvailableSt…

【转】开源的C# websocket-sharp组件解析

下面我们介绍一款WebSocket组件websocket-sharp的相关内容。 一.websocket-sharp组件概述 websocket-sharp是一个C#实现websocket协议客户端和服务端&#xff0c;websocket-sharp支持RFC 6455&#xff1b;WebSocket客户端和服务器&#xff1b;消息压缩扩展&#xff1b;安全连接…

java异或_JAVA面试必备之HashMap必会点

今天我们就面试会问到关于HashMap的问题进行一个汇总&#xff0c;以及对这些问题进行解答。1、HashMap的数据结构是什么&#xff1f;2、为啥是线程不安全的&#xff1f;3、Hash算法是怎样实现的&#xff1f;4、HashMap是如何处理Hash碰撞的&#xff1f;5、增加元素的方法是怎么…

对分查找的最多次数_「剑指offer题解」数组中出现次数超过一半的数字

关注我——个人公众号&#xff1a;后端技术漫谈我目前是一名后端开发工程师。主要关注后端开发&#xff0c;数据安全&#xff0c;网络爬虫&#xff0c;物联网&#xff0c;边缘计算等方向。原创博客主要内容Java知识点复习全手册Leetcode算法题解析剑指offer算法题解析SpringClo…

rabbitmq导出队列_消息队列BCMQ在大云运维管理平台BCDeepWatch中的应用

友情提示&#xff1a;全文约2600字&#xff0c;预计阅读时间12分钟摘要消息队列作为重要的中间件&#xff0c;广泛用于分布式系统中各子系统间的异步解耦&#xff1b;本文主要介绍了大云消息队列中间件BC-MQ在BC-DeepWatch中的应用案例。一、消息队列应用场景简介消息队列是分布…

【编译原理】如何编写BNF?

此篇文章承接上一篇&#xff1a;【编译原理】理解BNF 前言 理解了BNF&#xff0c;就能实现代码解析了吗&#xff1f;还有点早&#xff0c;因为理解了BNF&#xff0c;还要会写BNF。实际上&#xff0c;BNF实现有固定的模式&#xff0c;也有现成的工具&#xff0c;比如可以使用ya…

python 当前时间减一个月_python排序了解一下

排序是每个开发人员都需要掌握的技能。排序是对程序本身有一个全面的理解。不同的排序算法很好地展示了算法设计上如何强烈的影响程序的复杂度、运行速度和效率。今天的文章和谈谈大家都熟悉的各种排序使用 Python 如何实现&#xff0c;废话就不多说啦&#xff0c;开干&#xf…