部署

上面的课程我们已经完成了测试和3个API接口的开发,现在我们来完成部署我们的应用。

首先在项目根目录新建一个docker-compose-prod.yml的文件,将docker-compose.yml文件的内容全部拷贝过来,然后去掉users-service下面的volumes,因为这是我们在开发阶段便于调试,将代码挂载到容器中的,生产环境就需要这样做了,然后就是需要将环境变量更改成生产环境的配置:

environment:
  - APP_SETTINGS=project.config.ProductionConfig
  - DATABASE_URL=mysql+pymysql://root:root321@users-db:3306/users_prod
  - DATABASE_TEST_URL=mysql+pymysql://root:root321@users-db:3306/users_test

然后执行构建镜像、创建数据库、添加初始数据、测试等命令:

(tdd3)$ docker-compose -f docker-compose-prod.yml up -d --build
(tdd3)$ docker-compose -f docker-compose-prod.yml run users-service python manage.py recreate_db
(tdd3)$ docker-compose -f docker-compose-prod.yml run users-service python manage.py seed_db
(tdd3)$ docker-compose -f docker-compose-prod.yml run users-service python manage.py test

测试阶段test_app_is_development这个测试用例肯定不会通过的,因为现在是生产环境了。

在生产环境我们一般使用Gunicorn来处理我们的网络请求,在requirements.txt文件中添加gunicorn==19.7.1,然后安装。安装完成后,在docker-compose=prod.yml文件中的users-service区域增加一条命令:

command: gunicorn -b 0.0.0.0:5000 manage:app

command会覆盖上面Dockerfile中的CMD命令。重新构建镜像:

(tdd3)$ docker-compose -f docker-compose-prod.yml up -d --build

由于增加了新的依赖文件,所以我们需要重新构建,--build是必须的。

接下来我们来安装Nginx,对我们的网络请求进行反向代理,提高我们接口的性能。在项目根目录下面新建一个nginx的文件夹,然后在该目录中新增Dockerfile文件:

FROM nginx:1.13.0

RUN rm /etc/nginx/conf.d/default.conf
ADD /flask.conf /etc/nginx/conf.d

然后在当前目录新建一个flask.conf的文件:

server {
    listen 80;
    location / {
        proxy_pass http://users-service:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

上面是一个普通的nginx配置文件,意思是从80端口来的请求都转发到后端的http://users-service:5000服务上,后端的users-service服务就是上面我们用gunicorn启动的服务,更多的nginx资料,可以Google查询。

接下来我们将我们的nginx服务添加到docker-compose-prod.yml文件中:

nginx:
  container_name: nginx
  build: ./nginx/
  restart: always
  ports:
    - 80:80
  depends_on:
    users-service:
      condition: service_started
  links:
    - users-service

然后将users-service区域中的端口暴露改成只暴露容器端口,因为主机不需要使用了:

expose:
  - '5000'

最后重新构建Docker镜像:

(tdd3)$ docker-compose -f docker-compose-prod.yml up -d --build

构建成功后,我们就可以通过你机器的IP 来访问我们的服务了,如果你有域名的话,就可以将你的域名解析到你主机的IP 上,然后就可以愉快的用域名进行访问我们的服务了,Done!