docker compose入门

 阅读大约需要2分钟

docker compose入门

本篇文章介绍构建一个运行在docker compose上的python web应用程序,这个应用程序使用Flask框架同时维护一个计数器在redis中。

首先确保你已经安装Docker Engine和Docker Compose,你不需要安装python或者redis,因为它们是由Docker images提供。

安装

定义这个应用程序的依赖

  1. 为这项目创建一个目录
$ mkdir composetest
$ cd composetest
  1. 创建一个文件名为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)
  1. 创建另一个文件名字叫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文件定义了两个服务:webredis

Web service web服务使用的镜像是构建自当前目录下的Dockerfile文件,然后绑定容器和宿主机的端口, Flask web server使用的端口是5000,宿主机的端口是8000。

Redis service redis服务使用的是公共的Redis镜像从Docker Hub registry拉取的。

使用compose构建和运行你的应用程序
  1. 从你的项目目录,启动你的应用程序通过运行docker compose up
$ docker compose up
  1. 在浏览器中输入http://localhost:8000/观察程序的运行,你会在浏览器中看到下面的信息:
Hello World! I have been seen 1 times.
  1. 刷新页面

这个数字会增加

Hello World! I have been seen 2 times.
  1. 关闭应用程序
  • 可以通过在项目目录下运行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