【思考】为什么要用Fig来实现Docker自动化?
jopen 10年前
【编者的话】本文主要讲解了如何用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)
接着是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']
现在我们可以构建并运行此应用程序的容器:
$ 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
并且运行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
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