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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 本文讲的是为什么要用Fig来实现Docker自动化,【编者的话】本文主要讲解了如何用Fig来解决Docker多参数启动容器的问题(Fig入门可以参照这里)以及使用Fig需要注意的一些事项,亮点是文末介绍了Fig的一些缺陷与不足,同时作者认为Fig在测试场景中同样适用。
本文讲的是为什么要用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的海洋。

原文发布时间为:2015-01-11
本文作者:田浩浩 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:为什么要用Fig来实现Docker自动化?
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
jenkins 持续交付 开发者
自动化部署:使用Jenkins和Docker实现持续集成与交付
【8月更文挑战第31天】本文旨在为读者揭示如何通过Jenkins和Docker实现自动化部署,从而加速软件开发流程。我们将从基础概念讲起,逐步深入到实际操作,确保即使是初学者也能跟上步伐。文章将提供详细的步骤说明和代码示例,帮助读者理解并应用这些工具来优化他们的工作流程。
|
3月前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
91 9
|
4月前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
10月前
|
运维 监控 Docker
构建高效微服务架构:从理论到实践构建高效自动化运维体系:Ansible与Docker的完美融合
【5月更文挑战第31天】 在当今软件开发的世界中,微服务架构已经成为了实现可伸缩、灵活且容错的系统的关键策略。本文将深入探讨如何从零开始构建一个高效的微服务系统,涵盖从概念理解、设计原则到具体实施步骤。我们将重点讨论微服务设计的最佳实践、常用的技术栈选择、以及如何克服常见的挑战,包括服务划分、数据一致性、服务发现和网络通信等。通过实际案例分析,本文旨在为开发者提供一套实用的指南,帮助他们构建出既健壮又易于维护的微服务系统。
|
5月前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
147 2
|
5月前
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。
|
7月前
|
JSON JavaScript 开发者
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
【8月更文挑战第7天】Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
|
7月前
|
缓存 开发者 Docker
Dockerfile是Docker容器化过程中的核心组件,它允许开发者以一种可重复、可移植的方式自动化地构建Docker镜像
【8月更文挑战第19天】Dockerfile是构建Docker镜像的脚本文件,含一系列指令定义镜像构建步骤。每条大写指令后跟至少一个参数,按序执行,每执行一条指令即生成新的镜像层。常用指令包括:FROM指定基础镜像;RUN执行构建命令;EXPOSE开放端口;CMD指定容器启动行为等。优化策略涉及减少镜像层数、选择轻量基础镜像、利用缓存及清理冗余文件。示例:基于Python应用的Dockerfile包括设置工作目录、复制文件、安装依赖等步骤。掌握Dockerfile有助于高效自动化构建镜像,加速应用部署。
57 1
|
7月前
|
运维 监控 持续交付
构建高效自动化运维体系:Ansible与Docker的协同实践
【7月更文挑战第42天】 在当今快速发展的云计算和微服务架构时代,自动化运维已成为提升效率、确保系统稳定性的关键。本文将探讨如何利用Ansible这一强大的自动化工具与Docker容器技术相结合,搭建一个高效、可靠的自动化运维体系。文章首先简述了自动化运维的必要性和Ansible与Docker的基本概念,随后详细介绍了两者结合的优势,并通过实际案例分析展示了如何实现自动化部署、管理和扩展应用服务。通过阅读本文,读者将获得一套可行的自动化运维解决方案,以应对日益复杂的IT环境挑战。
|
7月前
|
JavaScript jenkins 持续交付
自动化部署与持续集成:使用Jenkins和Docker优化开发流程
【8月更文挑战第31天】在软件开发的世界里,时间就是一切。本文将引导你通过Jenkins和Docker的强大组合,实现自动化部署和持续集成,让你的开发流程如丝般顺滑。我们将从基础设置开始,逐步深入到构建管道,最终实现一键部署的梦想。准备好让你的开发效率飞跃,一起探索这个令人兴奋的旅程吧!