docker-compose 运行 Flask 应用最佳实践


背景

  以前部署应用,需要各种环境配置,各种shell操作才能搭建一套可用的服务。现在有了Docker之后,部署方式变了更加容易,不容易出现配置错误,环境不一致问题。解决了在本地环境可以运行,迁移到线上出现各种问题,这些问题大多出现在线上和本地环境有差异,配置容易出现错误等情况。那么docker-compose 和 docker 之间存在着什么联系呢?

先来看看docker-compose 的定义:
「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」

  我们知道 docker 可以通过 Dockerfile 模板文件来定义一个应用容器。实际应用中,经常遇到多个容器相配合运行一套应用程序的情况。比如,实现一个Flask应用,除了 Flask 服务本身之外,还需要一些数据库服务容器等。Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
  通过 Docker-Compose 用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose解决了容器与容器之间如何管理编排的问题。

实施步骤

使用 Dockerfile 定制镜像

  镜像的定制实际上就是定制每一层所添加的配置、文件,因为 Flask 应用需要一些环境依赖才能运行起来。所以想要将 Flask 应用运行在 Docker 容器中,该容器必须将该应用所有的环境依赖安装好。而 Dockerfile 就是提供给我们配置相关的环境依赖等操作。Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

下面以我的GitHub项目 flask-v2ex 应用的 Dockerfile 文件为例:

FROM daocloud.io/python:3.5MAINTAINER Guoweikuang <guoweikuang2015@gmail.com>
RUN mkdir -p /home/guoweikuang/app 
WORKDIR /home/guoweikuang/app ADD ./requirements.txt /home/guoweikuang/app/requirements.txt RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip 
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt ADD . /home/guoweikuang/app CMD python manage.py runserver -h 0.0.0.0FROM: 指定了基础镜像,以该镜像为基础,在其上进行定制操作
MAINTAINER: 用来指定镜像创建者信息
RUN: 创建了 **/home/guoweikuang/app** 文件夹 (后面 RUN pip3 安装Python扩展库)
WORKDIR: 切换目录,可以多次切换(相当于cd命令)
ADD: 从本地目录相应文件拷贝到容器路径里
CMD: 设置container启动时执行的操作,运行 Flask 应用并设置host为0.0.0.0

编写 docker-compose.yml 文件

docker-compose.yml 文件将把所有的东西关联起来。它描述了应用的构成(一个 web 服务和一个数据库)、使用的 Docker 镜像、镜像之间的连接、挂载到容器的卷,以及服务开放的端口。

下面以我的GitHub项目 flask-v2ex 应用的 docker-compose.yml 文件为例:

version: '2'services:web:build: .container_name: flask_v2exports:- "5000:5000"redis:image: "redis:alpine"

compose 中定义了两个服务 web 和 redis。

  • web 服务

    • build: 使用当前目录的 Dockerfile build 的镜像
    • ports: 映射宿主机 5000 端口到容器的 5000 端口
    • container_name: 指定了容器的名字
  • redis 服务

    • image: 使用 Docker Hub 中的 redis 镜像

使用 compose 构建并运行 Flask 应用

在运行 docker-compose up 之前,需要做一些修改,把项目里关于redis连接配置进行修改

r = redis.Redis(host='localhost', port=6379, decode_responses=True)修改为:r = redis.Redis(host='redis', port=6379, decode_responses=True)

在flask-v2ex 项目的根目录下使用 docker-compose up 命令,如下所示:

$ docker-compose upStarting flask_v2ex         ... done
Starting flask_v2ex_redis_1 ... done
Attaching to flask_v2ex_redis_1, flask_v2ex
redis_1  | 1:C 01 Jul 07:46:52.053 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 01 Jul 07:46:52.053 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 01 Jul 07:46:52.053 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 01 Jul 07:46:52.064 * Running mode=standalone, port=6379.
redis_1  | 1:M 01 Jul 07:46:52.064 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1  | 1:M 01 Jul 07:46:52.064 # Server initialized
redis_1  | 1:M 01 Jul 07:46:52.065 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1  | 1:M 01 Jul 07:46:52.065 * DB loaded from disk: 0.000 seconds
redis_1  | 1:M 01 Jul 07:46:52.065 * Ready to accept connections
flask_v2ex |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
flask_v2ex |  * Restarting with stat
flask_v2ex |  * Debugger is active!
flask_v2ex |  * Debugger PIN: 742-073-002

可以看到 Docker 守护进程里监听着 5000 端口了。可以通过http://localhost:5000 访问 Flask 应用。

docker-compose 使用

  • docker-compose up -d : 后台运行
  • docker-compose stop: 停止正在运行的服务
  • docker-compose down: 关闭所有容器并删除,默认保留 数据卷
  • docker-compose ps:列出当前运行的服务状态和相关信息
$ docker-compose psName                     Command               State           Ports
------------------------------------------------------------------------------------
flask_v2ex           /bin/sh -c python manage.p ...   Up      0.0.0.0:5000->5000/tcp
flask_v2ex_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
  • docker-compose run: 一次性命令。 例如查看 web 服务的环境变量:
$ docker-compose run web env PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=e4b6b17f39dc
TERM=xterm
LANG=C.UTF-8
GPG_KEY=97FC712E4C024BBEA48A61ED3A5CA953F73C700D
PYTHON_VERSION=3.5.4
PYTHON_PIP_VERSION=9.0.1
HOME=/root

如果需要停止已经运行中的服务,可以通过ctrl + c 或者 docker-compose stop 来停止服务。

参考

Docker从入门到实践 --实战Django
使用Dockerfile构建Docker镜像

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

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

相关文章

dbeaver导出表结构和数据_mall数据库表结构概览

mall是一套电商系统&#xff0c;后台系统主要包括商品管理、订单管理、营销管理(运营管理促销管理)、内容管理、用户管理等模块&#xff0c;本文主要对这些模块的数据库表结构及功能做大概的介绍。商品管理数据库表结构功能结构订单管理数据库表结构功能结构营销管理数据库表结…

arima模型 p q d 确定_自回归移动平均模型(ARMA)

自回归模型&#xff08;AR&#xff09;&#xff1a;①描述当前值和历史值之间的关系&#xff0c;用变量自身的历史时间数据对自身进行预测。②自回归模型必须满足平稳性的要求。③移动平均模型&#xff08;MA&#xff09;关注的是自回归模型中的误差项的累加。移动平均法能有效…

Mysql闪回工具之binlog2sql的原理及其使用

生产上误删数据、误改数据的现象也是时常发生的现象&#xff0c;作为运维这时候就需要出来补锅了&#xff0c;最开始的做法是恢复备份&#xff0c;然后从中找到需要的数据再进行修复&#xff0c;但是这个时间太长了&#xff0c;对于大表少数数据的修复来讲&#xff0c;动作太大…

禅道11.0windows本机安装

为了验证禅道的某个功能&#xff0c;需要用到生产上的数据&#xff0c;又不能在生产上进行。只能在本地搭建一套禅道&#xff0c;还原生产的数据到本地。 1.下载禅道 生产上用的是禅道11.0&#xff0c;数据库是11.0版本的数据库&#xff0c;为了更好兼容&#xff0c;下载禅道…

createtrackbar函数_【3】OpenCV图像处理模块(10)inRange函数实现阈值化,HSV图像分割...

本节使用inRange函数来实现阈值化。跟前面的阈值化方法一样&#xff0c;只不过在实现时用阈值范围来替代固定阈值。本节还提供了一种物体检测的手段&#xff0c;用基于像素值范围的方法&#xff0c;在HSV色彩空间检测物体。HSV色彩空间HSV&#xff08;hue&#xff0c;saturatio…

PPT取消自动播放

选中PPT页面&#xff0c;点击“切换”&#xff0c;检查下“设置自动换片时间”&#xff0c;如果勾选了&#xff0c;则去掉。

自动驾驶芯片_盘点全球自动驾驶芯片“战场”参与者

据了解&#xff0c;目前出货量最大的驾驶辅助芯片厂商Mobileye、Nvidia形成“双雄争霸”局面&#xff0c;Xilinx则在FPGA的路线上进军&#xff0c;Google、地平线、寒武纪向专用领域AI芯片发力&#xff0c;国内四维图新、全志科技、森国科(国科微)在自动驾驶芯片领域积极布局。…

word文档页码不连续怎么弄

页码不连续是因为在不连续页码的两页之间有分隔符。 第一步&#xff1a;搜索分节符 第二步&#xff1a;看页码与页面是否一致 wps的左下角 如果不一致&#xff0c;则第三步 第三步&#xff1a;设置页码&#xff1a;“继续上一页编码”

java多张图片合成一张_1分钟学会“全景照片”拍摄技巧,从单反拍摄到PS合成,收藏备用...

作为一名摄影爱好者&#xff0c;您知道如何才能快速拍出一张全景照片&#xff0c;同时保证高画质和照片不畸变&#xff1f;比如下面的2张图片&#xff1a;要想得到这样的全景照片&#xff0c;千万不要通过后期裁剪&#xff0c;否则清晰度肯定会大打折扣&#xff01;其实&#x…

Chrome查看cookie

不同版本的Chrome查看cookie的入口位置不同&#xff0c;这里介绍个通用的方法。 1.进入设置页 2.搜索cookie 3.进入“cookie....”&#xff0c;选择“查看所有......”

nginx 带宽_Nginx的Gzip功能

程序员自由之路 | 作者urlify.cn/eyuUVr | 来源什么是HTTP压缩有时候客户端和服务器之间会传输比较大的报文数据&#xff0c;这时候就占用较大的网络带宽和时长。为了节省带宽&#xff0c;加速报文的响应速速&#xff0c;可以将传输的报文数据先进行压缩&#xff0c;然后再进行…

分享朋友圈QQ空间需要哪些参数

shareTitle(分享标题 &#xff0c; shareDes(分享描述 &#xff0c; shareImg(分享图片地址&#xff0c; shareUrl(分享地址&#xff0c; shareType(分享类型&#xff0c;微信朋友&#xff1a;WEIXIN、微信朋友圈&#xff1a;WEIXIN_CIRCLE、QQ&#xff1a;QQ)

这一年多来,阿里Blink测试体系如何从0走向成熟?

2019独角兽企业重金招聘Python工程师标准>>> 摘要&#xff1a; 引言 Apache Flink是面向数据流处理和批处理的分布式开源计算框架&#xff0c;2016年阿里巴巴引入Flink框架&#xff0c;改造为Blink。2017年&#xff0c;阿里整合了所有流计算产品&#xff0c;决定以B…

system函数_自学C++基础教程【函数】

函数的概念一个函数由&#xff1a;函数的返回值类型、函数名、参数表、函数体 这4个部分组成。int Add( int _a , int _b ) {return _a _b; }该函数 Add 完成对两个整型数据的求和功能。函数的调用方式&#xff1a; 函数名&#xff08;参数表&#xff09;&#xff1b;…

宁波政务云资源的介绍与申请

介绍 如图所示&#xff1a; 宁波政务云分公共服务区与资源共享区。 公共服务区 公共服务区&#xff0c;一般部署允许互联网访问的系统&#xff0c;数据不敏感&#xff0c;不重要的&#xff0c;可对外开发的系统。 该区允许互联网访问&#xff0c;不允许访问资源共享区&…

python帮助文档在哪_python文档在哪里

对于Python中一些不清楚的模块&#xff0c;可以通过文档学习如何使用&#xff0c;但是python文档在哪里呢&#xff1f;这个问题我们可以使用Python命令进行查看。方法一 在python命令行输入以下内容help(time) # 很详细的模块文档 help(time.localtime()) # 很详细的函数文档 h…

政务云公共服务区与资源共享区数据交换的方式

上文《宁波政务云资源的介绍与申请》介绍过&#xff0c;公共服务区与资源共享区是不能互访的&#xff0c;只能是资源共享区单向访问公共服务区。 我有一项目&#xff0c;要能互联网访问&#xff0c;又要访问“宁波大数据共享平台”的接口&#xff0c;“宁波大数据共享平台”在…

Java程序员的IntelliJ IDEA使用教程

前言 博主是Java程序员&#xff0c;以前一直都用myeclipse来开发的&#xff0c;说实话感觉myeclipse毫无美感可言&#xff0c;后来经过同事介绍&#xff0c;认识了IDEA&#xff0c;一眼就相中了IDEA黑色的主题风格&#xff0c;自此就抛弃了旧爱myeclipse。当时还不懂IDEA功能上…

python中random函数用法_random函数的用法

展开全部 用法&#xff1a; 1、随2113机生成&#xff08;0,1&#xff09;之间的浮点数 random.random() 2、随机生成100-200的整数5261 random.randint(100,200) 3、随机产生范围为410210间隔为2的数 random.randrange(0,11,2) 注&#xff1a;这里输出&#xff08;0,2,4,6,8,10…

2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)

2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) 思路: A Exam 思路:水题 代码: #include<bits/stdc.h> using namespace std; int main(){int k;scanf("%d",&k);char s1[1010],s2[1010];scanf("%s%s",s1,s2);int same0;int ns…