在本文我们来学习使用docker compose来构建一个简单的Python web应用程序。这个应用程序使用的是Flask框架并在Redis维护一个点击计数器。虽然这个示例使用到了Python,不过即使你不熟悉Python也可以很容易理解这些操作。
1.创建一个项目目录:
$ mkdir composetest $ cd composetest
2.在项目目录中创建一个app.py文件并复制下面的内容到这个文件:
from flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='redis', port=6379) @app.route('/') def hello(): count = redis.incr('hits') return 'Hello World! I have been seen {} times. '.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
3.在项目目录创建另一个文件requirements.txt并复制下面这些内容:
flask redis
这个文件定义了应用程序的依赖。
在这个步骤中,我们创建一个Dockerfile用来构建docker镜像。这个镜像包含了Python应用程序所需的所有依赖,包含Python。
在项目目录中,创建一个Dockerfile文件并复制如下内容:
FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"]
这个文件解释如下:
从Python 3.4镜像开始构建镜像 添加当前的目录到镜像中的/code目录 设置工作目录为/code 安装Python依赖 设置容器的默认命令为python app.py在项目目录中创建docker-compose.yml文件并复制如下内容:
version: '2' services: web: build: . ports: - "5000:5000" volumes: - .:/code redis: image: "redis:alpine"
compose文件定义了两个服务,web和redis。web服务部分介绍如下:
使用了一个从当前目录的Dockerfile构建的镜像。 映射容器的5000端口到主机的5000端口。 挂载主机上的项目目录到容器内的/code目录,这样更新代码时就不需要重建镜像了。redis服务使用了从docker hub registry拉取的公共Redis镜像。
1.从项目目录,启动你的应用程序。
$ docker-compose up Pulling image redis... Building web... Starting composetest_redis_1... Starting composetest_web_1... redis_1 | [8] 02 Jan 18:43:35.576 # Server started, Redis version 2.8.3 web_1 | * Running on http://0.0.0.0:5000/ web_1 | * Restarting with stat
compose拉取一个redis镜像,为你的代码构建了一个镜像并启动你所定义的服务。
2.在浏览器键入http://0.0.0.0:5000/来查看你的应用程序运行情况。
3.刷新页面。数字应该会递增了。
因为使用了数据卷把应用程序代码挂载到了容器里,可以对代码进行更新,然后就会马上看到更新了,而不需要重建镜像。
1.更新app.py并保存。例如:
return 'Hello from Docker! I have been seen {} times. '.format(count)
2.在浏览器中刷新app。应该能看到更新了。
如果想让你的服务在后台运行,传递-d参数到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可以查看其它可用的命令。
如果使用了docker-compose up -d启动应用,当不需要时可能要停止服务:
$ docker-compose stop
使用down命令可以关掉所有,删除整个容器。传递–volume也会删除由redis容器使用的数据卷:
$ docker-compose down --volumes