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
留言
張貼留言