为什么要用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 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 compose未来可能会再利用现有Fig代码并且很可能有类似的语法和命令, 但我仍然建议现在使用Fig。此外,Fig的入门非常的快,你一定值得拥有。

原文链接:Why Use Fig for Docker Automation? (翻译:田浩浩 校对:李颖杰)

===========================
译者介绍
田浩浩悉尼大学USYD硕士研究生,目前在珠海从事Android应用开发工作。业余时间专注Docker的学习与研究,希望通过DockerOne把最新最优秀的译文贡献给大家,与读者一起畅游Docker的海洋。

0 个评论

要回复文章请先登录注册