用 Ansible Container 去管理 Linux 容器
创始人
2024-03-01 21:24:42
0

Ansible Container 解决了 Dockerfile 的不足,并对容器化项目提供了完整的管理。

Ansible Container: A new way to manage containers

Image by : opensource.com

我喜欢容器,并且每天都使用这个技术。即便如此,容器并不完美。不过,在过去几个月里,一系列项目已经解决了我遇到的一些问题。

我刚开始时,用 Docker 使用容器,这个项目使得这种技术非常流行。除了使用这个容器引擎之外,我学到了怎么去使用 docker-compose 以及怎么去用它管理我的项目。使用它使得我的生产力猛增!一个命令就可以运行我的项目,而不管它有多复杂。因此,我太高兴了。

使用一段时间之后,我发现了一些问题。最明显的问题是创建容器镜像的过程。Docker 工具使用一个定制的文件格式作为生成容器镜像的依据:Dockerfile。这个格式易于学习,并且很短的一段时间之后,你就可以自己制作容器镜像了。但是,一旦你希望进一步掌握它或者考虑到复杂场景,问题就会出现。

让我们打断一下,先去了解一个不同的东西:Ansible 的世界。你知道它吗?它棒极了,是吗?你不这么认为?好吧,是时候去学习一些新事物了。Ansible 是一个允许你通过写一些任务去管理你的基础设施,并在你选择的环境中运行它们的项目。不需要去安装和设置任何的服务;你可以从你的笔记本电脑中很容易地做任何事情。许多人已经接受 Ansible 了。

想像一下这样的场景:你在 Ansible 中,你写了很多的 Ansible 角色 role 和 剧本 playbook ,你可以用它们去管理你的基础设施,并且你想把它们运用到容器中。你应该怎么做?通过 shell 脚本和 Dockerfile 去写容器镜像定义?听起来好像不对。

来自 Ansible 开发团队的一些人问到这个问题,并且他们意识到,人们每天编写和使用的那些同样的 Ansible 角色和剧本也可以用来制作容器镜像。但是 Ansible 能做到的不止这些 —— 它可以被用于去管理容器化项目的完整生命周期。从这些想法中,Ansible Container 项目诞生了。它利用已有的 Ansible 角色转变成容器镜像,甚至还可以被用于生产环境中从构建到部署的完整生命周期。

现在让我们讨论一下,我之前提到过的在 Dockerfile 环境中的最佳实践问题。这里有一个警告:这将是非常具体且技术性的。出现最多的三个问题有:

1、 在 Dockerfile 中内嵌的 Shell 脚本

当写 Dockerfile 时,你可以指定会由 /bin/sh -c 解释执行的脚本。它类似如下:

RUN dnf install -y nginx

这里 RUN 是一个 Dockerfile 指令,其它的都是参数(它们传递给 shell)。但是,想像一个更复杂的场景:

RUN set -eux; \
    \
# this "case" statement is generated via "update.sh"
    %%ARCH-CASE%%; \
    \
    url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \
    wget -O go.tgz "$url"; \
    echo "${goRelSha256} *go.tgz" | sha256sum -c -; \

这仅是从 golang 官方镜像 中拿来的一段。它看起来并不好看,是不是?

2、 解析 Dockerfile 并不容易

Dockerfile 是一个没有正式规范的新格式。如果你需要在你的基础设施(比如,让构建过程自动化一点)中去处理 Dockerfile 将会很复杂。仅有的规范是 这个代码,它是 dockerd 的一部分。问题是你不能使用它作为一个 库 library 来使用。最容易的解决方案是你自己写一个解析器,然后祈祷它运行的很好。使用一些众所周知的标记语言不是更好吗?比如,YAML 或者 JSON。

3、 管理困难

如果你熟悉容器镜像的内部结构,你可能知道每个镜像是由 层 layer 构成的。一旦容器被创建,这些层就使用联合文件系统技术堆叠在一起(像煎饼一样)。问题是,你并不能显式地管理这些层 — 你不能说,“这儿开始一个新层”,你被迫使用一种可读性不好的方法去改变你的 Dockerfile。最大的问题是,必须遵循一套最佳实践以去达到最优结果 — 新来的人在这个地方可能很困难。

Ansible 语言和 Dockerfile 比较

相比 Ansible,Dockerfile 的最大缺点,也是 Ansible 的优点,作为一个语言,Ansible 更强大。例如,Dockerfile 没有直接的变量概念,而 Ansible 有一个完整的模板系统(变量只是它其中的一个特性)。Ansible 包含了很多更易于使用的模块,比如,wait_for,它可以被用于服务就绪检查,比如,在处理之前等待服务准备就绪。在 Dockerfile 中,做任何事情都通过一个 shell 脚本。因此,如果你想去找出已准备好的服务,它必须使用 shell(或者独立安装)去做。使用 shell 脚本的其它问题是,它会变得很复杂,维护成为一种负担。很多人已经发现了这个问题,并将这些 shell 脚本转到 Ansible。

关于作者

Tomas Tomecek - 工程师、Hacker、演讲者、Tinker、Red Hatter。喜欢容器、linux、开源软件、python 3、rust、zsh、tmux。More about me


via: https://opensource.com/article/17/10/dockerfiles-ansible-container

作者:Tomas Tomecek 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

在CentOS系统中为Do...
理解Docker存储的核心机制:驱动与分层管理 在CentOS系统...
2025-06-16 07:41:58
Docker 4.42 版...
IT之家 6 月 12 日消息,科技媒体 linuxiac 昨日(...
2025-06-12 15:13:33
我的docker随笔39:...
本文介绍在容器中修改时间而不影响宿主机的系统时间。 问题提出 某容...
2025-06-01 18:45:21
【Docker】Netwo...
文章目录网络情况查看宿主机网络情况 `ifconfig&#...
2025-06-01 12:34:38
【Docker】Mysql...
文章目录安装mysql主从复制新建主服务器容器实例3307配置文件...
2025-05-31 14:48:56
ansible完全攻略
ansible完全攻略 ansible安装: apt安装: apt...
2025-05-31 03:08:02

热门资讯

为什么计量 IT 的生产力如此... 在某些行业里,人们可以根据一些测量标准判定一个人的生产力。比如,如果你是一个零件制造商,可以通过一个...
硬核观察 #885 苹果 AR... 苹果 AR 眼镜被无限期推迟据报道,由于技术上的挑战,苹果公司已经无限期推迟了其轻型增强现实(AR)...
值得收藏的 27 个机器学习的... 机器学习 ( Machine Learning ) 有很多方面,当我开始研究学习它时,我发现了各种各...
PHP最佳实践(译) 简介PHP是一门复杂的语言,经过多年折腾,使其不同版本之间高度不一致,有时还有些bug。 每个版本都...
8 个提升你的隐私防护的开源密... 使用一些顶级开源密码管理器,确保你的登录凭证安全无虞。密码管理器是一项非常有用的实用程序。在你想寻找...
8个有趣的Linux提示与技巧... 我们时不时给你带来关于Linux的提示与技巧。和这个系列保持一致,这里有8个我们从读者收到最有趣的提...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
2020 年的 GitHub ... 距离 2020 年结束只剩下区区 24 天,我们即将结束魔幻的 2020 ,迎来新的一年,新的一年或...
开源新闻速递:openSUSE... 今日关注openSUSE 项目组的 Dominique Leuenberger 在他的周报中说:“这...
KDE4.11 Beta1 正...   KDE 项目工作组刚刚发布了 KDE Software Compilation 4.11 Bet...