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