在这一页,你将学习到如何构建一个简单的python的web应用,并通过Docker compose来运行。这个应用程序使用的是Flask框架,并维护着一个存储在reids里的点击计数器。由于这个案例使用的是python,所以你其中的一些概念你必须了解,即使你对它不是很熟悉。

前提条件

确定你已经安装了 Docker 引擎和Docker Compose。你不必安装python和Redis,它们将有Docker引擎提供。

第一步:设置

定义应用的依赖。

  1. 为项目创建一个目录

    $ mkdir composetest
    $ cd composetest
  2. 在项目目录下创建app.py的文件,并粘贴下面的内容:

    import time
    
    import redis
    from flask import Flask app = Flask(__name__)
    cache = redis.Redis(host='redis', port=6379) def get_hit_count():
    retries = 5
    while True:
    try:
    return cache.incr('hits')
    except redis.exceptions.ConnectionError as exc:
    if retries == 0:
    raise exc
    retries -= 1
    time.sleep(0.5) @app.route('/')
    def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

    在这个案例中,redis是应用网络中的redis容器的主机名。我们使用的是redis的默认端口号6379

    处理临时错误

    注意get_hit_count函数的实现。这个基本的重试循环让我们能在redis服务不可用时多次重试我们的请求。当我们的应用上线时,这个操作十分有用。而且会使我们的应用更有弹性,当redis服务在应用生命周期内需要频繁重启时。在一个集群中,这也帮助我们处理节点间链接瞬时断开的场景。

  3. 在项目目录中创建 requirements.txt文件,并粘贴一下内容:

    flask
    redis

第二步:创建Dockerfile文件

在这一步,你将编写一个用于构建Docker镜像的Dockerfile文件。这个镜像包含这个Python应用说需要的所以依赖,并包含python本身。

在你的项目目录下,创建一个名为Dockerfile的文件,然后粘贴以下内容:

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

这相当于告诉Docker要做以下事情:

  • 根据Python3.7镜像来构建这个镜像
  • 设置工作目录为/code
  • 设置环境变量给flask命令使用
  • 安装gcc的so文件、python 包(比如:MarkupSafe和 SQLAIchemy)用于编译加速
  • 复制requirements.txt然后安装python依赖
  • 复制宿主机当前目录.到镜像的工作目录.
  • 为容器设置默认命令flask run

想获得更多关于如何编写Dockerfiles的信息,请参阅 Docker user guideDockerfile reference.

第三步: 在Compose file 中定义服务

在项目中创建一个叫docker-compose.yml的文件,然后粘贴以下内容:

version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"

这个Compose 文件定义了两个服务:webredis

Web 服务

这个web服务使用之前在当前目录的Dockerfile构建出来的镜像。它将绑定及暴露容器和宿主机的5000端口。这个案例服务使用的是Flask web服务的默认端口5000

Redis 服务

这个redis服务使用的是Docker Hub 库中的公开的 Redis镜像。

第四步:通过Compose构建并运行你的应用

  1. 在你的工程目录下,使用docker-compose up来启动你的应用

    $ docker-compose up
    Creating network "composetest_default" with the default driver
    Creating composetest_web_1 ...
    Creating composetest_redis_1 ...
    Creating composetest_web_1
    Creating composetest_redis_1 ... done
    Attaching to composetest_web_1, composetest_redis_1
    web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
    redis_1 | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    redis_1 | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started
    redis_1 | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
    web_1 | * Restarting with stat
    redis_1 | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.
    redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    web_1 | * Debugger is active!
    redis_1 | 1:M 17 Aug 22:11:10.483 # Server initialized
    redis_1 | 1:M 17 Aug 22:11:10.483 # 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.
    web_1 | * Debugger PIN: 330-787-903
    redis_1 | 1:M 17 Aug 22:11:10.483 * Ready to accept connections

    Compose 会拉取Redis镜像,然后为你的代码构建一个惊喜,并启动你定义的所有服务。在这个案例中,你的代码将会在构建时静态拷贝到镜像中。

  2. 在浏览器中输入 http://localhost:5000 ,你将会看到你的应用正在运行。

    如果你是在你的本地使用Docker,那么你的web 应用正在你的Docker后台监听5000端口。在浏览器上输入 http://localhost:5000,将会看到hello world消息。如果看不到,你可以尝试输入http://127.0.0.1:5000

    你将会看到

    Hello World! I have been seen 1 times.

  3. 刷新页面。

    这个数字会增长

    Hello World! I have been seen 2 times.

  1. 切换到其他终端窗口,键入docker image ls,将会列出本地镜像。列出的镜像中将会看到redisweb

    $ docker image ls
    REPOSITORY TAG IMAGE ID CREATED SIZE
    composetest_web latest e2c21aa48cc1 4 minutes ago 93.8MB
    python 3.4-alpine 84e6077c7ab6 7 days ago 82.5MB
    redis alpine 9d8fa9aa0e5b 3 weeks ago 27.5MB

    你可以检查这个镜像,使用如下命令docker inspect <tag or id>

  2. 关于停止应用, 你可以在另一个终端中、你的项目目录下执行docker-compose down来终止; 或者也可以在之前执行docker-compose up的终端中键入 CTRL+C 来终止应用。

第五部:编辑Compose文件,增加数据卷绑定

编辑项目目录下的docker-compose.yml,为web服务增加一个绑定的数据卷。

version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
redis:
image: "redis:alpine"

volumes关键字绑定了宿主机的项目目录和容器内的/code目录,这样就允许你快速的修改代码,快速生效,而不用重新构建镜像了。environment关键字设置了FLASK_ENV环境变量,它用来告诉flask run运行开发模式,并当代码变更时重新加载。这个模式只能用于开发。

第六步: 通过Compose重新构建和运行应用

在你的项目目录下,键入docker-compose up和更新了的Compose文件来构建你的应用,并运行应用。

$ docker-compose up
Creating network "composetest_default" with the default driver
Creating composetest_web_1 ...
Creating composetest_redis_1 ...
Creating composetest_web_1
Creating composetest_redis_1 ... done
Attaching to composetest_web_1, composetest_redis_1
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
...

检查hello wolrd是否出现在浏览器上,然后刷新浏览起,看数字是否增长。

共享的目录、数据卷 和挂载绑定

如果你的项目在用户目录(cd ~)之外,那么你需要共享出你使用的Dockerfile和数据卷的驱动或位置。如果你获得了一个运行时错误,该错误指出应用文件找不到、数据卷挂载被拒绝、或服务不能启动,请尝试使文件或驱动能被共享。数据卷挂载需要为用户目录(Windows: C:\Users; Mac: /Users)之外的项目共享驱动,这对于使用Linux容器的Windows桌面Docker应用的项目是必须的。更多信息请参考see Shared Drives on Docker Desktop for Windows, File sharing on Docker for Mac。 一些常见的案例请参考 Manage data in containers

如果你是在一个比较旧的Windows系统上使用VirtualBox,你可能会遇到一个关于共享目录的问题,它记录在了VB trouble ticket。新的Windows系统上因为使用的是Docker桌面应用,而不再使用VirtualBox,所以符合条件。

第七步: 升级应用

由于我们应用代码是挂载到容器数据卷的,你可以修改代码并且立刻会看到变化,而不必重新构建镜像。

  1. 修改代码app.py中的问候方式并保存。比如:改变Hello WorldHello from Docker

    return 'Hello from Docker! I have been seen {} times.\n'.format(count)
  2. 在浏览器中刷新应用,问候语应该会改变,且计数仍然增长。

第八步: 体验一下其他的命令

如果你想在后台运行你的服务,你可以使用-d标签("detached"模式)来运行docker-compose up,然后用docker-compose ps来查看运行情况:

$ docker-compose up -d
Starting composetest_redis_1...
Starting composetest_web_1... $ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------
composetest_redis_1 /usr/local/bin/run Up
composetest_web_1 /bin/sh -c python app.py Up 5000->5000/tcp

docker-compose run命令允许你为你的服务执行一次性的命令。举个例子,查看web服务有哪些环境变量在生效中:

$ docker-compose run web env

docker-compose --help可以查看还有哪些可以使用的命令。你也可以为bash和zsh安装 command completion,这样也可以做到还有哪些可用的命令。

如果你是通过 compose 命令docker-compose up -d 启动的服务,你也可以通过下面的命令来停止服务:

$ docker-compose stop

你可以关掉一切,通过down命令,来删除所有的容器。加入--volumns还可以移除掉容器使用的数据卷

$ docker-compose down --volumes

这一节,你已经学会了Compose的基础。

docker-compose入门--翻译的更多相关文章

  1. Docker笔记(十二):Docker Compose入门

    1. Compose简介 Docker Compose是Docker官方的用于对Docker容器集群实现编排,快速部署分布式应用的开源项目.Docker Compose通过docker-compose ...

  2. Docker Compose 入门使用指南

    Compose is a tool for defining and running multi-container Docker applications. With Compose, you us ...

  3. Docker入门(三)使用Docker Compose

    Compose介绍   Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排.Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 ...

  4. Docker Compose安装以及入门

    Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用. Compose 简介 Compose 项目是 Docker 官方的开源 ...

  5. .Net Core微服务入门全纪录(八)——Docker Compose与容器网络

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 前言 上一篇[.Net Core微服务入门全纪录(七)--IdentityServer4-授权认证]中使用IdentityServer4 ...

  6. docker和docker compose安装使用、入门进阶案例

    一.前言 现在可谓是容器化的时代,云原生的袭来,导致go的崛起,作为一名java开发,现在慌得一批.作为知识储备,小编也是一直学关于docker的东西,还有一些持续继承jenkins. 提到docke ...

  7. Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh

    本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于Kubernetes的教程仿佛不是亲儿子,写得非常随便,不仅缺 ...

  8. Docker技术入门与实战 第二版-学习笔记-9-Docker Compose 项目-1-举例说明

    Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用 Compose 通过一个配置文件来管理多个Docker容器,在配置文件中 ...

  9. Docker入门-docker compose的使用

    Compose简介 Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排.其代码目前在https://github.com/docker/compose 上开源. ...

  10. Docker从入门到精通(八)——Docker Compose

    恭喜大家,学到这里,对于 docker 的基础玩法大家应该都会了,下面会介绍 docker的一些编排工具. 1.为什么需要 Docker Compose? 官网镇楼:https://www.runoo ...

随机推荐

  1. 《Java编程思想》学习笔记_多态

    多态 多态指一个行为产生多种状态,针对父类类型可接收其子类类型,最终执行的状态由具体子类确定,其不同子类可呈现出不同状态.例如人[父类]都会跑步[行为],但小孩[子类]跑步.成年人[子类]跑步.运动员 ...

  2. python小题目练习(二)

    题目:输出1-100之间不包括7的倍数,含有7的数的其他数 """Author:mllContent:输出1-100之间不包括7的倍数,含有7的数的其他数Date:202 ...

  3. VScode运行总是显示running状态

    一.每次点击运行都显示code is already running,而且键盘也没有办法输入 二.解决办法 注意:记得重新启动VScode

  4. 如何在.Net Framework应用中请求HTTP2站点

    背景介绍 本文的需求背景是对接苹果公司的推送服务(APNS),苹果在安全方面比较积极,已经严格限制API只支持HTTP2.但是我这里的应用目前仍然是.NET Framework平台,所以必须寻找一种解 ...

  5. Servlet-3 :JDBC+重定向

    请求重定向 redirect1) Servlet接收到浏览器端请求并处理完成后,给浏览器端一个特殊的响应,这个特殊的响应要求浏览器去请求一个新的资源,整个过程中浏览器端会发出两次请求,且浏览器地址栏会 ...

  6. 02 MySQL_数据库相关的SQL

    数据库相关的SQL 1. 查看所有数据库 show databases; 2. 创建数据库 格式:create database 数据库名称: 示例: create database db1; 3. ...

  7. Redis_

    Redis学习 Redis学习(一) 1. NoSQL的引言 NoSQL(Not Only SQL ),意即不仅仅是SQL, 泛指非关系型的数据库.Nosql这个技术门类,早期就有人提出,发展至200 ...

  8. C++ 实现可变参数的三个方法

    有时我们无法提前预知应该向函数传递几个实参.例如,我们想要编写代码输出程序产生的错误信息,此时最好用同一个函数实现该项功能,以便对所有错误的处理能够整齐划一.然而,错误信息的种类不同,所以调用错误输出 ...

  9. git 生成key并添加key(Windows)

    简介 一般来说,在项目代码拉取或者提交前都需要添加项目权限,除此之外也需要将对应设备的public key添加至对应的git上,因此需要生成public key 步骤 1.安装git插件(Window ...

  10. Canal实时解析mysql binlog数据实战

    一.说明 通过canal实时监听mysql binlog日志文件的变化,并将数据解析出来 二.环境准备 1.创建maven项目并修改pom.xml配置文件 <dependencies> & ...