Docker Compose与Docker Stack的不同之处

Posted julianhuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker Compose与Docker Stack的不同之处相关的知识,希望对你有一定的参考价值。

翻译原文

Docker引擎在1.12 版本集成了Docker Swarm,  带来了一些新工具。

现在可以无需安装 Docker Compose, 就可以利用docker-compose.yml 文件创建Docker 容器堆栈。

这个命令是 docker stack,  使用方式与docker-compose 类似, 下面是示例:

$ docker-compose -f docker-compose up

$ docker stack deploy -c docker-compose.yml somestackname

使用方式基本相同,这两个命令都能操纵docker-compose.yml文件中定义的docker services、volumes 、networks等。

但是为什么会发生这种情况,并且Docker Stack与Docker Compose是否有所不同?为什么要引入?除了语法,还有什么不同?

表象不同点

① docker stack 忽略了docker-compose中的“build”指令, 你不可以在stack 命令中创建镜像。 Docker stack 需要已经存在的镜像, 因此docker compose更适合开发场合。

② docker stack 、docker-compose 各自都会忽略docker-compose.yml文件部分指令, 请在这个页面中搜索 “ignore” 查看更多细节。

最初诞生的差异

docker-compose 是一个Python 项目。 最初有一个名叫fig的Python项目能够解析 fig.yml ------- 启动docker 容器堆栈。

所有人都很喜欢这个工具,尤其是github fork 这个项目的forkers, 这个工具慢慢产品化并被改名为docker-compose,

但是这始终是一个Python工具,作用在Docker引擎的顶层

  在内部,它使用Docker API根据规范启动容器,您仍然必须单独安装docker-compose才能将其与Docker一起在您的计算机上使用。

------------------------------------------###-------------------------------------------------

docker stack的能力来源自docker引擎内部,你不需要安装额外的工具包去启动docker 容器堆栈(docker stack 是docker swarm的一部分)。

docker stack 支持与docker-compose 相似的能力, 但是在Docker引擎内Go语言环境中运行的, 在使用docker stack命令之前你还必须创建一个swarm机器(这也不是什么问题)。

docker stack 不支持版本2规范编写的docker-compose.yml文件,必须使用最新的3.0+ 版本。docker-compose工具依然可以处理 版本2,3(如上所述,会忽略掉不再适用于该工具的某些指令)。

结论

docker stack 和docker-compose 都可以应用在版本3编写的docker-compose.yml 文件上,版本3之前的docker-compose.yml 文件可继续使用docker-compose工具,

如果你想要升级,也不会花很多时间。

因为docker stack几乎能做docker-compose 所有的事情,如果你打算使用docker swarm 操纵容器,可以尝试一下docker stack。

如果你仅需要一个能操作多个容器的工具,你依旧可以使用docker-compose 工具。

我的看法

现在docker-compose.yml 版本3与docker stack有些耦合,甚至于有些捆绑。

这个捆绑不仅体现在docker-compose版本3页面中“Ignore”的指令:

   build、cap_add, cap_drop、external_links 等

还包括在很常用的两个功能:

restart_policy指令: 这个容器自动重启指令在版本3中处于deploy指令下面,deploy指令又必须捆绑docker stack,导致版本3编写的docker-compose.yml 不能原生自动重启容器。 F**K’

env file:: docker-compose工具默认会识别并应用同目录下的.env 环境变量文件, 而这个常见的功能竟然在docker  stack 指令中被忽略。

猜测Docker 公司是想让大家在应用docker-compose 版本3的时候使用docker stack(docker stack 是docker swarm 的一部分),

在Kubernetes已经成为事实上的集群容器编排标准的情况下,Docker 公司妄图通过将docker-compose.yml 版本3文件与Docker Swarm捆绑, 以期扩大Docker Swarm的市场占有率。

所以我的建议是如果你要上手 Kubernetes,暂时可以忽略docker stack命令, 因为要将docker-compose版本3文件升级到Docker Swarm环境并不是 想象的那么简单。

 

原文: https://vsupalov.com/difference-docker-compose-and-docker-stack/

 

以上是关于Docker Compose与Docker Stack的不同之处的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose up与docker-compose up -d

Docker Compose与Docker Stack的不同之处

24.Docker技术入门与实战 --- Docker三剑客之Compose

docker-compose概述与编排部署

Docker系列器九:docker-compose与docker-compose.yml语法

Docker系列- Docker-compose使用与负载均衡