【思考】為什么要用Fig來實現Docker自動化?
【編者的話】本文主要講解了如何用Fig來解決Docker多參數啟動容器的問題(Fig入門可以參照這里)以及使用Fig需要注意的一些事項,亮點是文末介紹了Fig的一些缺陷與不足,同時作者認為Fig在測試場景中同樣適用。
如果你正在使用Docker,但還沒有嘗試過Fig,那這篇文章正適合你。你可能像我一樣已經習慣使用長而笨重的使用多個參數的Docker命令,也可能通過一堆Shell腳本來啟動你的容器。Fig就是一個簡單的自動化和抽象化的工具來解決這個問題。
下邊將通過一個例子簡單地解釋一下。我們將創建一個簡單的Python Flask應用程序,每次請求都會顯示一個時間戳。 Python代碼不用很在意,你可以隨意跳過它,但如果你想跟著步驟來,那么首先在新目錄中創建文件app.py:
from flask import Flask from redis import StrictRedis from datetime import datetimeapp = Flask(name) redis = StrictRedis(host='redis', port=6379)
@app.route('/') def home(): redis.lpush('times', datetime.now().strftime('%H:%M:%S')) return 'This page was requested at: {}\n'.format( [t.decode('utf-8') for t in redis.lrange('times', 0, -1)])
if name == 'main': app.run(host='0.0.0.0', debug=True)</pre>
接著是Dockerfile的內容:FROM python:3.4RUN mkdir /code COPY app.py /code/app.py WORKDIR /code RUN pip install flask redis CMD ['python', 'app.py']</pre>
現在我們可以構建并運行此應用程序的容器:$ docker build -t fig_ex . ...snip... $ docker run -d --name redis redis 68fece140431f4ad67fbd9fbaa43253785b4c3cb6ceeda1b1eb7de2eee22615c $ docker run -d -p 5000:5000 --link redis:redis fig_ex cb7588cd15ade0ec09e005ea64aaa8753befa2d47d9a8e331a711137fdc59bc8 $ curl localhost:5000 This page was requested at: ['13:18:39'] $ curl localhost:5000 This page was requested at: ['13:18:40', '13:18:39'] $ curl localhost:5000 This page was requested at: ['13:18:41', '13:18:40', '13:18:39']
或者同樣地我們可以使用Fig來實現。在以上相同的目錄下創建一個名為fig.yml的文件:
figex: build: . ports: - '5000:5000'; links: - redisredis: image: redis</pre>
并且運行fig up:$ fig up Creating figcode_redis_1... Creating figcode_figex_1... Attaching to figcode_redis_1, figcode_figex_1 redis_1 | [1] 06 Jan 10:27:12.745 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf...snip...
redis_1 | [1] 06 Jan 10:27:12.749 The server is now ready to accept connections on port 6379 figex_1 | Running on http://0.0.0.0:5000/ figex_1 | * Restarting with reloader</pre>
Fig會構建鏡像(如有必要),并以正確的順序啟動容器并連接到它們。容器會輸出帶有容器名稱的前綴(默認情況下為目錄名和鏡像名稱的串聯)。我們可以在新的終端內測試這些容器:$ curl localhost:5000 This page was requested at: ['13:24:27'] $ curl localhost:5000 This page was requested at: ['13:24:28', '13:24:27'] $ curl localhost:5000 This page was requested at: ['13:24:29', '13:24:28', '13:24:27']
Fig棒極了,它非常簡單:之前要使用3個帶多個參數的Docker命令,而現在僅用兩個命令。本質上來說是我們將所有的煩人的配置參數移動到了fig.yml文件。
要停止容器只需按Ctrl-C。你可以使用fig rm來刪除它們。大多數時候,你不想要容器輸出,因此你就可以使用fig up -d在分離模式下啟動Fig。然后,您需要用fig stop來停止容器。
關于Fig的內容確實不多,多數命令都可以一對一的映射其docker run命令。盡管如此有些事情你應該了解:
- 目前的YAML文件沒有語法檢查。這意味著,如果你犯了一個錯誤如忘記一個字符,你會得到一個令人困惑的錯誤。
- Fig有關Volume的使用很混亂。當fig up執行時,它會嘗試使用–volumes-from掛載之前任何的Volume。這將會導致一些問題,如果改變fig.yml文件中Volume的聲明(因為它往往會與之前的Volumes沖突,所以需要改動), 通常的解決方案是只要確保你總是使用fig rm刪除之前的容器。此問題的部分原因是Docker本身需要更多的工具來處理Volume。
- Fig主要設計用于開發,但我還發現在測試場景中它也很有用,而且它還可以在小規模部署上使用。
最后,值得指出的是,在Docker compose中,Fig將會成為接班人。盡管Docker的組件未來可能會再利用現有Fig代碼并且很可能有類似的語法和命令, 但我仍然建議現在使用Fig。此外,Fig的入門非常的快,你一定值得擁有。
原文鏈接:Why Use Fig for Docker Automation? (翻譯:田浩 校對:李穎杰)
來自:http://dockerone.com/article/134