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