docker yaml文件
铃响了! Docker v1.13发布了!
在与Docker相关的讨论和研讨会期间,我收到的最常见问题通常与Swarm和Compose有关。
有人 :如何将Docker Compose与Docker Swarm结合使用?
我 :你不能! 您可以将Compose文件转换为不支持所有Swarm功能的捆绑软件。 如果要充分利用Swarm,请为docker service create命令做好准备, docker service create命令包含docker service create无休止的参数列表。
这样的回答通常令人失望。 Docker Compose向我们展示了在YAML文件中指定所有内容的优势,而不是试图记住我们必须传递给docker命令的所有参数。 它使我们能够将服务定义存储在存储库中,从而为管理它们提供了可重复且记录良好的流程。 Docker Compose替换了bash脚本,我们喜欢它。 然后,Docker v1.12出现并在我们面前提出了一个艰难的选择。 我们应该采用Swarm并丢弃Compose吗? 自2016年夏季以来,Swarm和Compose不再相爱了。 离婚很痛苦。
但是,在分离了将近半年之后,他们又回到了一起,我们可以见证他们的第二次蜜月。 种类…Swarm服务不需要Docker Compose二进制文件,但是我们可以使用其YAML文件。
Docker Engine v1.13引入了对stack命令中Compose YAML文件的支持。 同时,Docker Compose v1.10引入了其格式的新版本3。 它们一起使我们能够使用已经熟悉的Docker Compose YAML格式管理Swarm服务。
我假设您已经熟悉Docker Compose,并且不会详细介绍我们可以使用它进行的所有操作。 相反,我们将通过一个示例创建一些Swarm服务。
我们将探索如何通过Docker Compose文件和docker stack deploy命令创建Docker Flow Proxy服务。
要求
以下示例假定您使用的是Docker v1.13 +,Docker Compose v1.10 +和Docker Machine v0.9 +。
如果您是Windows用户,请运行Git Bash (通过Docker Toolbox安装)中的所有示例。 另外,请确保将您的Git客户端配置为检出代码AS-IS 。 否则,Windows可能会将回车符更改为Windows格式。
群集群设置
要使用Docker Machine设置Swarm集群示例,请运行以下命令。
如果您已经有可用的Swarm集群,请随时跳过本节。
curl -o swarm-cluster.sh \
https://raw.githubusercontent.com/
vfarcic/docker-flow-proxy/master/scripts/swarm-cluster.sh
chmod +x swarm-cluster.sh
./swarm-cluster.sh
docker-machine ssh node-1
现在,我们准备部署docker-flow-proxy服务。
通过Docker Stack命令创建Swarm服务
我们将从创建网络开始。
docker network create --driver overlay proxy
代理网络将专用于代理容器和将附加到它的服务。
我们将使用vfarcic / docker-flow-proxy存储库中的docker -compose-stack.yml创建docker-flow-proxy和docker-flow-swarm-listener服务。
docker-compose-stack.yml文件的内容如下。
version: "3"
services:
proxy:
image: vfarcic/docker-flow-proxy
ports:
- 80:80
- 443:443
networks:
- proxy
environment:
- LISTENER_ADDRESS=swarm-listener
- MODE=swarm
deploy:
replicas: 2
swarm-listener:
image: vfarcic/docker-flow-swarm-listener
networks:
- proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DF_NOTIFY_CREATE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/reconfigure
- DF_NOTIFY_REMOVE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/remove
deploy:
placement:
constraints: [node.role == manager]
networks:
proxy:
external: true
该格式以版本3编写(对于docker stack deploy必需的)。
它包含两个服务; proxy和swarm-listener 。 由于本文并不旨在教您如何使用代理,因此我不会深入探讨每个参数的含义。
与以前的Compose版本相比,大多数新参数是在deploy中定义的。 您可以将该部分视为Swarm特定参数的占位符。 在这种情况下,我们指定proxy服务应具有两个副本,而swarm-listener服务应限于经理角色。 为这两个服务定义的所有其他内容都使用与早期Compose版本相同的格式。
YAML文件的底部是services内引用的网络列表。 如果服务未指定任何服务,则将自动创建default网络。 在这种情况下,我们选择手动创建网络,因为来自其他堆栈的服务应该能够与代理进行通信。 因此,我们手动创建了一个网络,并在YAML文件中将其定义为external网络。
让我们根据我们探索的YAML文件创建堆栈。
curl -o docker-compose-stack.yml \
https://raw.githubusercontent.com/
vfarcic/docker-flow-proxy/master/docker-compose-stack.yml
docker stack deploy -c docker-compose-stack.yml proxy
第一条命令从vfarcic / docker-flow-proxy存储库下载了Compose文件docker-compose-stack.yml 。 第二个命令创建了构成堆栈的服务。
可以通过stack ps命令查看堆栈的任务。
docker stack ps proxy
输出如下(为简洁起见,删除了ID)。
NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
proxy_proxy.1 vfarcic/docker-flow-proxy:latest node-2 Running Running 2 minutes ago
proxy_swarm-listener.1 vfarcic/docker-flow-swarm-listener:latest node-1 Running Running 2 minutes ago
proxy_proxy.2 vfarcic/docker-flow-proxy:latest node-3 Running Running 2 minutes ago
我们正在运行proxy两个副本(以确保出现故障时的高可用性)和其中一个swarm-listener 。
部署更多堆栈
让我们部署另一个堆栈。
这次,我们将使用位于vfarcic / go-demo存储库中的Compose文件docker-compose-stack.yml中定义的Docker堆栈。 如下。
version: '3'
services:
main:
image: vfarcic/go-demo
environment:
- DB=db
networks:
- proxy
- default
deploy:
replicas: 3
labels:
- com.df.notify=true
- com.df.distribute=true
- com.df.servicePath=/demo
- com.df.port=8080
db:
image: mongo
networks:
- default
networks:
default:
external: false
proxy:
external: true
堆栈定义了两个服务( main和db )。 它们将通过由堆栈自动创建的default网络相互通信(不需要docker network create命令)。 由于main服务是API,因此应该可以通过代理进行访问,因此我们还将附加proxy网络。
需要注意的重要一点是,我们使用了deploy部分来定义特定于Swarm的参数。 在这种情况下, main服务定义应该有三个副本和几个标签。 与之前的堆栈一样,我们将不介绍每个服务的详细信息。 如果您想更深入地了解与main服务一起使用的标签,请访问以自动模式重新配置的以群集模式运行Docker Flow代理 。
让我们部署堆栈。
curl -o docker-compose-go-demo.yml \
https://raw.githubusercontent.com/
vfarcic/go-demo/master/docker-compose-stack.yml
docker stack deploy \
-c docker-compose-go-demo.yml go-demo
docker stack ps go-demo
我们下载了堆栈定义,执行了创建服务的stack deploy命令,并运行了stack ps命令,该命令列出了属于go-demo堆栈的任务。 输出如下(为简洁起见,删除了ID)。
NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
go-demo_main.1 vfarcic/go-demo:latest node-2 Running Running 7 seconds ago
...
go-demo_db.1 mongo:latest node-2 Running Running 21 seconds ago
go-demo_main.2 vfarcic/go-demo:latest node-2 Running Running 19 seconds ago
...
go-demo_main.3 vfarcic/go-demo:latest node-2 Running Running 20 seconds ago
...
由于Mongo数据库比main服务要大得多,因此拉取它需要花费更多时间,从而导致一些故障。 如果go-demo服务无法连接到其数据库,则该服务将失败。 一旦db服务运行, main服务应停止失败,并且我们将看到三个副本,它们的当前状态为Running 。
片刻之后, swarm-listener服务将从go-demo堆栈中检测main服务,并向proxy发送请求以重新配置自身。 我们可以通过将HTTP请求发送到代理来查看结果。
curl -i "localhost/demo/hello"
输出如下。
HTTP/1.1 200 OK
Date: Thu, 19 Jan 2017 23:57:05 GMT
Content-Length: 14
Content-Type: text/plain; charset=utf-8
hello, world!
代理已重新配置,并将所有带有基本路径/demo请求转发到go-demo堆栈中的main服务。
有关代理的更高级用法,请参阅“ 在具有自动重配置的群集模式下运行Docker Flow代理”教程中的示例,或查阅配置和用法文档。
堆叠还是不堆叠
Docker堆栈是Swarm模式的重要补充。 我们不必处理往往具有docker service create无休止的参数列表的docker service create命令。 使用Compose YAML文件中指定的服务,我们可以用简单的docker stack deploy替换那些长命令。 如果这些YAML文件存储在代码存储库中,我们可以将相同的实践应用于服务部署,就像在软件工程的任何其他领域一样。 我们可以跟踪更改,进行代码审查,与他人共享等等。
Docker stack命令的新增功能及其使用Compose文件的功能是Docker生态系统非常受欢迎的功能。
清理
请删除我们创建的Docker Machine VM。 您可能需要这些资源来完成其他一些任务。
exit
docker-machine rm -f node-1 node-2 node-3
DevOps 2.1工具包:Docker Swarm
如果您喜欢本文,则可能对DevOps 2.1 Toolkit:Docker Swarm一书感兴趣。 与本系列的前一篇文章( DevOps 2.0工具包:使用容器化微服务自动化持续部署管道 )提供了对一些最新DevOps实践和工具的总体了解不同,本书完全致力于Docker Swarm以及流程和工具。我们可能需要构建,测试,部署和监视集群中运行的服务 。
这本书仍在“发展中”。 您可以从LeanPub获取副本。 它也可以作为DevOps Toolkit系列软件包提供。 如果现在下载它,请在其完全完成之前,通过新的章节和更正获得频繁的更新。 更重要的是,您可以通过向我发送反馈意见来影响本书的发展方向。
我选择精益方法来出版图书,因为我相信早期反馈是生产优质产品的最佳方法。 请帮助我,使本书成为任何想要采用Docker Swarm进行集群编排和调度的人的参考。
docker yaml文件

所有评论(0)