Docker 配置

这节课让我们来容器化Flask应用吧...... 首先你需要确保你的环境中已经安装了DockerDocker 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.x2.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

print-log 从日志中可以看出DEBUG=True,TESTING=False,证明是生效的(记得删除日志代码哦~~~)