Docker 配置
这节课让我们来容器化Flask
应用吧......
首先你需要确保你的环境中已经安装了Docker
和Docker Compose
:
$ docker -v Docker version 17.05.0-ce, build 89658be $ docker-compose -v docker-compose version 1.14.0, build unknown
在项目的根目录下面创建一个Dockerfile
的文件:
FROM python:3.6.4 # 设置工作目录 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # 添加依赖(利用Docker 的缓存) ADD ./requirements.txt /usr/src/app/requirements.txt # 安装依赖 RUN pip install -r requirements.txt # 添加应用 ADD . /usr/src/app # 运行服务 CMD python manage.py runserver -h 0.0.0.0
然后同样的在根目录下面创建一个docker-compose.yml
的文件:
version: '2.1' services: users-service: container_name: users-service build: . volumes: - '.:/usr/src/app' ports: - 5001:5000 # 端口暴露(主机端口:容器端口)
执行上面的配置文件将根据Dockerfile
创建一个叫users-service
的容器。
docker-compose.yml
文件中的目录是相对路径
volumes
是用来将代码挂载进容器内部的,对于开发环境你最好这么做,不然你每次更新代码后都需要重新构建容器才会生效,显然这是非常影响效率的。
注意Docker compose 的文件版本,我们这里用的2.1,这其实与你安装的docker-compose
版本没有任何关系的,只与Docker
版本有关系(通过上面的连接可以选择合适的文件版本),但是文件版本3.x和2.x还是有很多不同的地方,注意查看文档。
然后我们来构建镜像:
$ docker-compose build
在第一次构建的时候会花费一点时间,不过别担心,由于Docker
会缓存第一次的构建结果,后续的构建都会快得多,构建完成后,启动容器:
$ docker-compose up -d
-d
标记是用来让容器在后台执行的
然后在浏览器中打开http://127.0.0.1:5001/ping,确保你能看到和上面看到的JSON 文件信息。
接下来在docker-compose.yml
文件中增加一个环境变量,用来加载开发环境的配置信息:
version: '2.1' services: users-service: container_name: users-service build: . volumes: - '.:/usr/src/app' ports: - 5001:5000 # 端口暴露(主机端口:容器端口) environment: - APP_SETTINGS=project.config.DevelopmentConfig
然后更新proejct/__init__.py
文件,从环境变量获取应用的配置信息:
import os from flask import Flask, jsonify # 初始化app app = Flask(__name__) # 环境配置 app_settings = os.getenv('APP_SETTINGS') app.config.from_object(app_settings) @app.route('/ping', methods=['GET']) def ping_pong(): return jsonify({ 'status': 'success', 'message': 'pong!' })
然后更新容器:
$ docker-compose up -d
怎么知道我们上面的这种方法就配置成功了呢?我们在project/__init__.py
文件下面打印下配置信息:
import sys print(app.config, file=sys.stderr)
因为我们将代码挂载到容器里面的,所以直接保存就会自动加载,然后查看日志:
$ docker-compose logs -f users-service
从日志中可以看出DEBUG=True,TESTING=False,证明是生效的(记得删除日志代码哦~~~)