我们使用compose
建设一个python的web应用, 我们会使用到flash框架和redis.
预备知识
请确保你已经安装了docker engine
和docker compose
, 你不需要安装python和redis, 因为我们要使用docker镜像.
步骤一
定义程序的依赖(www.hedaoshe.com)
创建一个文件夹来存放程序
mkdir compose-test cd compose-test
创建一个
app.py
文件, 并且把下面内容粘贴进文件中import time
import redis from flask import Flask
app = Flask(name) cache = redis.Redis(host='redis', port=6379)
def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\n'.format(count)
创建一个
requirements.txt
文件, 并粘贴下面内容到文件, 该文件是让python知道安装哪些依赖包.flask redis
步骤二 创建一个Dockerfile
这个Dockerfile是以python镜像为基础来构建我们的python应用.
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
我们来解释下上面的内容:
- 以
python:3.7-alpine
为基础镜像 - 设置我们的工作目录为
/code
- 设置
flask
需要用到的两个环境变量 - 安装gcc和其他依赖
- 复制
requirement.txt
到镜像并且安装python依赖 - 让启动后的容器打开5000端口
- 复制当前目录的所有文件到镜像的工作目录
/code
里面(主要是复制app.py文件) - 设置容器启动后执行的命令
flask run
步骤三 开始写我们的compose文件
创建一个docker-compose.yml
文件, 并粘贴下面内容到里面
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
解释 ①这个compose创建了两个容器, 一个名叫
web
, 另一个叫redis
②这个web
容器是使用Dockerfile
构建的镜像生成的, 并且把容器5000端口和本机的5000端口绑定
步骤四 使用compose来构建和运行我们的程序
- 在
compose-test
目录里面, 运行docker-compose up
命令
compose会根据docker-compose.yml
的代码来配置镜像, 然后启动这些配置好的镜像, 生成容器.
- 在浏览器中输入
http://localhost:5000/
来观察程序的运行情况.
你会观察到下图的内容
- 刷新页面
数字应该会增加
Hello World! I have been seen 2 times.
- 在命令行窗口输入
docker image ls
列出本地的所有镜像
在本地镜像中一定有web
和redis
两个镜像. 你可以通过docker inspect <tag or id>
来检查具体的镜像信息.
- 命令行输入
docker-compose down
命令停止程序的运行
步骤五 编辑docker-compose.yml使用挂载卷
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
environment:
FLASK_ENV: development
redis:
image: "redis:alpine"
我们使用了新的volumes
关键字, 它会让主机上的当前文件夹和容器内的/code
文件夹进行绑定. 这样我们就可以自由修改主机当前文件夹内容而不需重新构建镜像.
而且我们增加了FLASK_ENV: development
, 该命令的意思是告诉flask
框架进入开发者模式, 该模式的主要作用就是当检测到文件改变就热启动应用程序.(容器内热启动, 不会重新构建镜像启动容器)
步骤六 重新构建并运行容器
在你的项目目录下, 运行docker-compose up
命令, 然后在浏览器中重新检查
步骤七 修改主机上挂载的卷内容,然后观察变化
修改app.py
, 把Hello world!
修改为Hello from docker!
return 'Hello from Docker! I have been seen {} times.\n'.format(count)
重新刷新浏览器就可以看见我们的应用被更新了
步骤八 可以测试其他的docker-compose命令
#使用守护进程启动应用
docker-compose up -d
#查看应用的状态
docker-compose ps
#如果使用守护进程模式启动后,必须使用该命令来停止应用
docker-compose stop
#停止应用并且删除容器
docker-compose down