【思考】為什么要用Fig來實現Docker自動化?

jopen 9年前發布 | 15K 次閱讀 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 datetime

app = 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.4

RUN 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:
- redis

redis: 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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!