在本文我们来学习使用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.\n'.format(count)
-
- if __name__ == "__main__":
- app.run(host="0.0.0.0", debug=True)
3.在项目目录创建另一个文件requirements.txt并复制下面这些内容:
这个文件定义了应用程序的依赖。
第二步:创建一个Dockerfile
在这个步骤中,我们创建一个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
第三步:在compose文件中定义服务
在项目目录中创建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镜像。
第四步:使用compose构建和运行你的app
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.\n'.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启动应用,当不需要时可能要停止服务:
使用down命令可以关掉所有,删除整个容器。传递–volume也会删除由redis容器使用的数据卷:
- $ docker-compose down --volumes