Docker-Compose 是一個可以用來定義且執行多個 Container 應用程式的工具

可以很簡單的透過 Compose 的 yaml 來設定你的container應用程式

並且透過一個指令,就可以建立及啟動所有yaml設定的應用程式

Compose 可以在產品、階段產品、開發或測試項目使用

在使用上大致可以區分為三個過程:

  • 透過 Dockerfile 定義你的APP環境,並且這個設定可以在任何地方重複使用
  • 在 docker-compose.yml 定義 services
  • 執行 docker-compose up 就能執行及啟動你的APP

docker-compose.yml 格式大致像這樣:

version: '3'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Compose 提供一些命令可以用來管理你的應用程式生命週期

  • start, stop, rebuild service
  • 查看執行中的 services status
  • 執行中的 service 的 stream 及 log
  • 可指定終止特定的service

Mac 的使用者使用 Docker for Mac 安裝的Docker環境就已經 包含了 Compose,因此不必再額外安裝

Hello World

在一開始前,必須先確定已經安裝好 Docker Engine 以及 Docker Compose

在這裡我們依照官網提供的方式,建立一個 Docker Compose 以及執行簡單的 Python Web

建立專案資料夾

首先,建立專案資料夾

mkdir pythontest
cd pytontest

在 pytontest/ 中,建立 app.py 檔案,內容如下: 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)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

在 app.py 裡面,redis 就是 redis container 的 hostname,並且使用Redis預設port 6379

建立 requirements.txt

建立檔案 requirements.txt,並輸入以下內容

requirements.txt

flask
redis

建立 Dockerfile

建立一個名為 Dockerfile 的檔案

Dockerfile

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

讓 Docker 可以根據 Dockerfile 處理下列事情

  • 建立 Python 3.4 image 並啟動
  • 在當前目錄加入 /code
  • 將 /code 設定為工作目錄
  • 安裝 Python 相關依賴
  • 在Container設定預設指令: python app.py

關於 Dockerfile更多的用法,可以參考 Dockerfile reference

定義 docker-compose.yml Services

建立 docker-compose.yml ,並且放入下方內容

docker-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

這裡定義了兩個 services: web 及 redis

其中,Flash Web 使用預設 port 5000,而 redis 則會使用 Docker Hub 上面pull redis image

透過 Compose 運行 APP

透過下方指令讓 docker-compose 執行 Dockerfile 定義的內容

docker-compose up

開啟瀏覽器,前往 http://localhost:5000 查看是否會看到以下訊息

Hello World! I have been seen 1 times.

這時可以開啟另一個terminal 視窗,查看目前專案資料夾的 local images

會看到 redis, web 項目

docker image ls

更新內容

當在上面的 docker-compose.yml 檔案設定執行 docker-compose up 之後

若是直接透過 docker-compose down ,更新 app.py 之後,執行 docker-compose up 仍無法顯示最新內容

這時必須透過 rebuild 方式來重新執行

docker-compose down

docker-compose build --no-cache

docker-compose up -d