分享

为什么要用Fig来实现Docker自动化?

hochikong 发表于 2015-2-17 13:23:47 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 10543
问题导读:
1.什么是Fig?
2.目前Fig存在什么缺陷?
3.Docker compose是什么?


【编者的话】本文主要讲解了如何用Fig来解决Docker多参数启动容器的问题,以及使用Fig需要注意的一些事项,亮点是文末介绍了Fig的一些缺陷与不足,同时作者认为Fig在测试场景中同样适用。

如果你正在使用Docker,但还没有尝试过Fig,那这篇文章正适合你。你可能像我一样已经习惯使用长而笨重的使用多个参数的Docker命令,也可能通过一堆Shell脚本来启动你的容器。Fig就是一个简单的自动化和抽象化的工具来解决这个问题。

下边将通过一个例子简单地解释一下。我们将创建一个简单的Python Flask应用程序,每次请求都会显示一个时间戳。 Python代码不用很在意,你可以随意跳过它,但如果你想跟着步骤来,那么首先在新目录中创建文件


app.py
  1. from flask import Flask
  2. from redis import StrictRedis
  3. from datetime import datetime
  4. app = Flask(__name__)
  5. redis = StrictRedis(host='redis', port=6379)
  6. @app.route('/')
  7. def home():
  8. redis.lpush('times', datetime.now().strftime('%H:%M:%S'))
  9. return 'This page was requested at: {}\n'.format(
  10.     [t.decode('utf-8') for t in redis.lrange('times', 0, -1)])
  11. if __name__ == '__main__':
  12. app.run(host='0.0.0.0', debug=True)
复制代码


接着是Dockerfile的内容:
  1. FROM python:3.4
  2. RUN mkdir /code
  3. COPY app.py /code/app.py
  4. WORKDIR /code
  5. RUN pip install flask redis
  6. CMD ['python', 'app.py']
复制代码


现在我们可以构建并运行此应用程序的容器:
  1. $ docker build -t fig_ex .
  2. ...snip...
  3. $ docker run -d --name redis redis
  4. 68fece140431f4ad67fbd9fbaa43253785b4c3cb6ceeda1b1eb7de2eee22615c
  5. $ docker run -d -p 5000:5000 --link redis:redis fig_ex
  6. cb7588cd15ade0ec09e005ea64aaa8753befa2d47d9a8e331a711137fdc59bc8
  7. $ curl localhost:5000
  8. This page was requested at: ['13:18:39']
  9. $ curl localhost:5000
  10. This page was requested at: ['13:18:40', '13:18:39']
  11. $ curl localhost:5000
  12. This page was requested at: ['13:18:41', '13:18:40', '13:18:39']
复制代码


或者同样地我们可以使用Fig来实现。在以上相同的目录下创建一个名为fig.yml的文件:
  1. figex:
  2. build: .
  3. ports:
  4. - '5000:5000';
  5. links:
  6. - redis
  7. redis:
  8. image: redis
复制代码


并且运行fig up:
  1. $ fig up
  2. Creating figcode_redis_1...
  3. Creating figcode_figex_1...
  4. Attaching to figcode_redis_1, figcode_figex_1
  5. 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
  6. ...snip...
  7. redis_1 | [1] 06 Jan 10:27:12.749 * The server is now ready to accept connections on port 6379
  8. figex_1 |  * Running on http://0.0.0.0:5000/
  9. figex_1 |  * Restarting with reloader
复制代码


Fig会构建镜像(如有必要),并以正确的顺序启动容器并连接到它们。容器会输出带有容器名称的前缀(默认情况下为目录名和镜像名称的串联)。我们可以在新的终端内测试这些容器:
  1. $ curl localhost:5000
  2. This page was requested at: ['13:24:27']
  3. $ curl localhost:5000
  4. This page was requested at: ['13:24:28', '13:24:27']
  5. $ curl localhost:5000
  6. 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命令。尽管如此有些事情你应该了解:
1.目前的YAML文件没有语法检查。这意味着,如果你犯了一个错误如忘记一个字符,你会得到一个令人困惑的错误。

2.Fig有关Volume的使用很混乱。当fig up执行时,它会尝试使用–volumes-from挂载之前任何的Volume。这将会导致一些问题,如果改变fig.yml文件中Volume的声明(因为它往往会与之前的Volumes冲突,所以需要改动), 通常的解决方案是只要确保你总是使用fig rm删除之前的容器。此问题的部分原因是Docker本身需要更多的工具来处理Volume。

3.Fig主要设计用于开发,但我还发现在测试场景中它也很有用,而且它还可以在小规模部署上使用。

最后,值得指出的是,在Docker compose中,Fig将会成为接班人。尽管Docker compose未来可能会再利用现有Fig代码并且很可能有类似的语法和命令, 但我仍然建议现在使用Fig。此外,Fig的入门非常的快,你一定值得拥有。



############################################################
本文转自:http://dockerone.com/article/134

欢迎加入about云群9037177932227315139327136 ,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条