使用 docker-compose 部署 flask 应用
为了让开发环境、测试环境和线上环境统一,使用 docker 镜像部署应用是一个不错的方案。裸用 docker-cli 管理服务过于麻烦,在开发机上 k8s 又凭空增加了很多复杂性,使用 docker-compose 部署应用是一个不错的折中方案。
Docker-compose 是 docker 官方推出的一个管理多容器服务的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。其主要特性有:
- 使用一个 Host 启动多个服务
- 容器启动时持久化数据卷到宿主机
- 只在镜像发生变化时重新创建容器
- 更方便地管理环境变量
我们这里准备了一个示例项目,是一个 flask web 项目。提供了一个接口来根据参数生成二维码。 可以看一下它的 Dockerfile:
代码语言:javascript复制FROM python:3.8-slim
COPY requirements.txt /tmp/requirements.txt
RUN set -xe
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
&& pip install --no-cache-dir -r /tmp/requirements.txt
&& rm -f /tmp/requirements.txt
COPY app.py /code/app.py
WORKDIR /code
CMD gunicorn app:app -b :8080 -k gevent --log-level info
流程比较简单,安装依赖,拷贝代码文件到/code/
目录,设置/code/
为工作目录,并且制定了启动命令。
然后再看一下docker-compose.yml
:
version: "3"
services:
qr-web:
build: .
ports:
- 0.0.0.0:8080:8080
command: gunicorn app:app -b :8080 -k gevent --log-level info
我们定义了一个服务qr-web
,指定这个服务的镜像从当前目录的Dockerfile
构建,将容器的8080
暴露到宿主机的0.0.0.0:8080
上,并且指定了启动命令。
定义好docker-compose.yml
,我们就可以通过docker-compose build
命令来构建镜像。启动服务时只需要运行docker-compose up
命令就可以了,如果希望服务在后台常驻,需要加上-d
选项。
这个示例项目还只需要启动一个容器,并不能体现出docker-compose
在管理多容器服务上的优势,下篇文章会讲一讲如何使用docker-compose
部署和管理更复杂的服务。