Docker是目前主流IT公司广泛接受和使用的,用于构建、管理和保护它们应用程序的工具。
容器,例如Docker允许开发人员在单个操作系统上隔离和运行多个应用程序,而不是为服务器上的每个应用程序专用一个虚拟机。使用容器更轻量级,可以降低成本、更好地使用资源和发挥更高的性能。
本文将使用Flask开发一个简单的Python web应用程序,并为“容器化”做好准备。然后创建一个Docker映像,并将其部署到测试和生产环境中。
注意: 请确保机器上已安装Docker,如果没有请参考Docker官方安装教程。
2. Docker介绍Docker是一种工具,它使开发人员能够交付他们的应用程序(以及库或其他依赖项),确保他们可以使用正确的配置运行,而不受部署环境影响。
这是通过将应用程序隔离在单独的容器中来实现的,这些应用程序虽然被容器分隔开,但是却可以共享操作系统和其他资源。
Docker包含两部分:
Docker Engine — 应用打包工具,用于封装应用程序。
Docker Hub — 用于管理云上容器应用程序的工具。
3.为何选择容器了解容器的重要性和实用性非常重要,虽然它和直接将应用部署到服务器没有多大区别,但是当涉及到比较复杂的且相当吃资源的应用,尤其是多个应用部署在同一台服务器,或是同一应用要部署到多台服务器时。容器就变得非常有用。
在容器之前,这是通过 VMWare 和 Hypervisor等虚拟机解决的,但是它们在效率、速度和可移植性方面已被证明并不是最佳选择。
Docker容器是虚拟机的轻量级的替代品-与VM不同,我们不需要为它预先分配RAM、CPU或其他资源,也不需要为每个应用程序启动一个VM,仅仅只需要一个操作系统即可。
使用容器开发人员就不需要为不同环境制定特殊版本,这样可以专注于应用程序的核心业务逻辑。
4.创建Python应用Flask是Python的一个轻量级Web应用框架,简单易用,可以很快速地创建web应用。我们用它来创建此demo应用。
如果还没有安装Flask模块,可以使用下面命令安装:
$ pip install flask安装成功后,新建一个应用目录,命名为FlaskDemo。并在该目录下创建应用代码文件app.py。
在app.py中,首先引入Flask模块,然后创建一个web应用:
from flask import Flask app = Flask(__name__)然后定义路由/和其对应的请求处理程序:
@app.route("http://www.likecs.com/") def index(): return """ <h1>Python Flask in Docker!</h1> <p>A sample web-app for running Flask inside Docker.</p> """最后,添加运行主程序并启动该脚本:
if __name__ == "__main__": app.run(debug=True, host='0.0.0.0') $ python app.py然后在浏览器中访问:5000/,可以看到Dockerzing Python app using Flask这样的页面。
5.Dokcer打包应用要在Docker上运行应用程序,首先必须构建一个容器,而且必须包含使用的所有依赖项——在我们的例子中只有Flask。因此,新建一个包含所有依赖包的 requirements.txt 文件,然后创建一个Dockerfile,该文件用来描述构建映像过程。
此外,当启动容器时还需要放开应用程序的HTTP端口。
准备工作requirements.txt 文件非常简单,只需要填入项目的依赖包和其对应版本即可:
Flask==1.0.2接下来,需要将应用程序运行所需的所有Python文件都放在顶层文件夹中,例如,名为app的目录。
同时建议将主入口程序命名为 app.py ,将脚本中创建的Flask对象命名为 app 是一种通常的做法,这样也可以简化部署。
FlaskApp ├── requirements.txt ├── Dockerfile └── app └── app.py └── <other .py files> 创建DockerfileDockerfile本质上是一个文本文件,其中明确定义了如何为我们的项目构建Docker镜像。
接下来创建一个基于Ubuntu 16.04 和 Python 3.X的Dokcer镜像:
FROM ubuntu:16.04 MAINTAINER jhao104 "j_hao104@163.com" RUN apt-get update -y && \ apt-get install -y python3-pip python3-dev COPY ./requirements.txt /requirements.txt WORKDIR / RUN pip3 install -r requirements.txt COPY . / ENTRYPOINT [ "python3" ] CMD [ "app/app.py" ]Dockerfile的基本指令有十三个,上面用到了部分;
FROM - 所有Dockerfile的第一个指令都必须是 FROM ,用于指定一个构建镜像的基础源镜像,如果本地没有就会从公共库中拉取,没有指定镜像的标签会使用默认的latest标签,如果需要在一个Dockerfile中构建多个镜像,可以使用多次。
MAINTAINER - 描述镜像的创建者,名称和邮箱。