Docker (9) docker compose 範例

通常啟動 web service 時會需要搭配 DB 的容器,透過 Docker Compose 可以一次啟動所有需要的容器。

Docker Compose 還有一個好處是容器間會建立一個內部網路,透過這個網路可以取得容器的 IP 對應。

1. 建立一個需要 DB 的服務:

專案配置如下,可以先建立空的檔案。

.
├── app.py              # Flask service
├── docker-compose.yml  # start flask and redis
└── dockerfile          # build flask

編輯 app.py 建立一個 Flask service,啟動時會連線到 redis:6379 並利用 Redis 存取訪問的次數。

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_visit_count():
    return cache.incr('visit') # 幫 visit +1

@app.route('/') # service 位置 127.0.0.1:5000/
def hello():
    count = get_visit_count()
    return 'Hello! I have been here {} times.\n'.format(count)

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

需要注意的是 host='redis',代表連線時須知道/定義 redis 對應的 IP。

編輯 dockerfile。Docker Compose 可以在啟動時 build image 或是直接使用 image,所以這邊先不用 build。

FROM python:3.7-stretch

RUN apt-get update -y && \
    apt-get install -y vim && \
    apt-get install -y less && \
    apt-get install -y net-tools && \
    pip install -U pip && \
    pip3 install flask redis && \
    mkdir /home/flask_demo
    
COPY . /home/flask_demo

WORKDIR /home/flask_demo

EXPOSE 5000

CMD ["python3", "app.py"]

2. 編寫 docker-compose.yml:

Docker Compose 會參考 docker-compose.yml 的內容配置多個容器。

version: '3'
services:
  flask:
    build: .
    ports:
     - "5000:5000"
    depends_on:
      - redis
   
  redis:
    image: "redis"

上面宣告了 flask 和 redis 兩個 services。

flask 是 build from dockerfile,redis 則是使用 image。

depends_on 告訴 Docker Compose flask 相依於 redis 所以要在 redis 運行後再建置。


3. 執行 Docker Compose:

最後直接使用 docker-compose 就可以照 docker-compose.yml 啟動服務。

$ docker-compose up

用 docker ps -a,確認一下兩個服務都有被啟動,然後可以用瀏覽器訪問 http://127.0.0.1:5000/。

CONTAINER ID        IMAGE           ...
0e54ff28ba5e        flasktest_flask ...
6a4da23fbbb6        redis           ...

最後證明一下 Docker Compose 中容器可以看見彼此,所以 flask 可以連線到 redis:6379

登入 flask 的容器然後 ping 看看 redis。

$ docker exec -it 0e54ff28ba5e bash
> ping redis -c 10 

留言

熱門文章