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