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