背景

  以前部署应用,需要各种环境配置,各种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镜像

docker-compose 运行 Flask 应用最佳实践相关推荐

  1. Docker Compose运行MySQL、Redis服务

    Docker Compose运行MySQL.Redis服务 前言:通过容器来统一管理开发中使用到的依赖,顺便学习docker-compose 1.docker-compose.yml 文件说明 2.d ...

  2. Spring Boot 2.0:Docker Compose + Spring Boot + Nginx + Mysql 实践

    Spring Boot 2.0:Docker Compose + Spring Boot + Nginx + Mysql 实践 Spring Boot + Nginx + Mysql 是实际工作中最常 ...

  3. Docker容器入门及网易最佳实践

    文章目录 第一节 Docker容器入门 1.1.1 基础概念 1. Docker是什么 2. Docker和传统虚拟机的对比 3. 为什么要使用Docker 4. Docker架构 5. Docker ...

  4. RHEL 8 - 用podman compose替代docker compose运行Ansible Tower

    <OpenShift 4.x HOL教程汇总> 已在 RHEL 8.4 上验证 本文的前置条件:RHEL8 - 配置基于安装 ISO 文件的 YUM Repo 文章目录 安装podman ...

  5. 【站在微笑的肩上】Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践

    文章目录 前言 原文章 1. Spring Boot 案例 1.1 配置信息 1.2 核心代码 1.2.1 entity 1.2.2 repository 1.2.3 controller 2. Do ...

  6. Spring Boot 2.0(五):Docker Compose + Spring Boot + Nginx + Mysql 实践

    我知道大家这段时间看了我写关于 docker 相关的几篇文章,不疼不痒的,仍然没有感受 docker 的便利,是的,我也是这样认为的,I know your felling . 前期了解概念什么的确实 ...

  7. (转)Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践

    http://www.ityouknow.com/springboot/2018/03/28/dockercompose-springboot-mysql-nginx.html 我知道大家这段时间看了 ...

  8. docker容器增加端口映射最佳实践(修改配置文件方式)

    前言: 在日常的docker运维中,经常遇到这样一个问题:已经配置好且运行的docker容器要根据业务需要增加端口映射到宿主机,如何简单有效的解决呢? 下面以mysql容器为例,详细说明操作步骤. 一 ...

  9. Flask 应用最佳实践

    一个好的应用目录结构可以方便代码的管理和维护,一个好的应用管理维护方式也可以强化程序的可扩展性 应用目录结构 假定我们的应用主目录是"flask-demo",首先我们建议每个应用都 ...

最新文章

  1. java语言只保留了什么_java语言的保留的关键字【小白必读】
  2. ubuntu linux 编译 opencv
  3. cocos2dx游戏开发——微信打飞机学习笔记(三)——WelcomeScene的搭建
  4. Android Gradle Plugin 源码解析之 externalNativeBuild
  5. VNC怎么和宿主机共享粘贴板(整理)
  6. 有向无环图 前一个任务 后一个任务称为什么 英文
  7. 数组中元素的动态增加和删除
  8. STL源码剖析之迭代器
  9. python控制台清屏_python清屏命令
  10. python for spss statistics_IBM SPSS Statistics 与用户自定义 Python 模块的集成及分析
  11. 计算机硬盘数据如何恢复,如何防止硬盘数据被恢复?毁灭数据教程
  12. 软件测试周刊(第28期):越向前走,越有光明的前途。
  13. SAR图像去噪方法研究
  14. 皮卡丘python turtle海龟绘图(电力球版)附源代码
  15. 在LINLUX下面建立GPRS无线MODEM拨号
  16. “所选的用户密钥未在远程主机上注册,请再试一次”问题解决
  17. java 7编程高级进阶_Java7编程高级进阶-积累(1)
  18. android 指纹 分发,移动终端及基于指纹识别来实现操作的方法和系统与流程
  19. Matlab保留工作区变量教程
  20. java实训西游记人物实现_学习练习 java编写西游记人物类

热门文章

  1. zemax评价函数编辑器_ZEMAX软件使用入门
  2. 【c语言数据结构】二叉树
  3. 计算机辅助设计还需要手绘吗,西安电脑如此发达为什么还要学习手绘
  4. java了解异常_ID检测_Java入门第三季7-1简易扑克牌游戏(自定义玩家个数,玩家个数和ID异常检测)...
  5. qt 在label上以光标位置进行缩放_缩放|位移|渐变简单动画
  6. 试卷8449c 语言,二级C语言上机题库参考答案
  7. linux syslog 删除文件_Linux没有当心删除日记文件syslog怎样办
  8. html表格通过邮件发送,通过html表格发电子邮件
  9. oracle 字段全大写,Oracle如何批量将表中字段名全转换为大写(利用简单存储过程)...
  10. codeforces B. Strongly Connected City(dfs水过)