docker compose入门
本篇文章介绍构建一个运行在docker compose上的python web应用程序,这个应用程序使用Flask框架同时维护一个计数器在redis中。
首先确保你已经安装Docker Engine和Docker Compose,你不需要安装python或者redis,因为它们是由Docker images提供。
安装
定义这个应用程序的依赖
- 为这项目创建一个目录
$ mkdir composetest
$ cd composetest
- 创建一个文件名为
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
在你的项目下,然后粘贴下面的代码:
flask
redis
创建Dockerfile
在你的项目目录创建一个文件叫Dockerfile
,然后粘贴下面的内容:
# syntax=docker/dockerfile:1
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"]
定义服务在一个compose文件中
创建一个文件叫docker-compose.yml
在你的项目目录,然后粘贴下面的内容:
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
这个compose文件定义了两个服务:web
和redis
Web service web
服务使用的镜像是构建自当前目录下的Dockerfile文件,然后绑定容器和宿主机的端口, Flask web server使用的端口是5000,宿主机的端口是8000。
Redis service redis
服务使用的是公共的Redis
镜像从Docker Hub registry拉取的。
使用compose构建和运行你的应用程序
- 从你的项目目录,启动你的应用程序通过运行
docker compose up
。
$ docker compose up
- 在浏览器中输入
http://localhost:8000/
观察程序的运行,你会在浏览器中看到下面的信息:
Hello World! I have been seen 1 times.
- 刷新页面
这个数字会增加
Hello World! I have been seen 2 times.
- 关闭应用程序
- 可以通过在项目目录下运行
docker compose down
命令 - 或者在原来运行程序的终端按下CTRL+C
编辑compose文件,添加一个绑定挂载
编辑docker-compose.yml
文件,为web
服务添加bind mount:
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
volumes:
- .:/code
environment:
FLASK_DEBUG: True
redis:
image: "redis:alpine"
volumes关键字挂载当前目录到容器/code目录,允许你直接更改代码,不需要重新构建镜像。
重新构建和运行程序用compose
在你的项目目录,输入docker compose up
用更新后的compose文件去构建程序和运行程序。
$ docker compose up
更新应用程序
因为应用程序的代码已经通过volume挂载到容器的code目录,你可以直接修改代码并且可以立刻看到变化, 不需要重新构建镜像。
修改app.py
文件,把Hello World!
修改为Hello from Docker!
:
return 'Hello from Docker! I have been seen {} times.\n'.format(count)
在浏览器中刷新应用,返回的信息应该更新了,并且计数器的数字仍然在增长。
其他命令
如果你想要你的服务运行在后台,你可以加上-d
flag
$ docker compose up -d
[+] Running 3/3
⠿ Network composetest_default Created 0.1s
⠿ Container composetest-redis-1 Start... 0.6s
⠿ Container composetest-web-1 Started 0.6s
$ docker compose ps
NAME COMMAND SERVICE STATUS PORTS
composetest-redis-1 "docker-entrypoint.s…" redis running 6379/tcp
composetest-web-1 "flask run" web running 0.0.0.0:8000->5000/tcp
如果你启动compose用docker compose up -d
,停止你的服务使用
$ docker compose stop
使用down
命令可以删除所有容器,加上--volumes
会同时删除redis容器使用的数据卷。
$ docker compose down --volumes