部署
上面的课程我们已经完成了测试和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!