两周前宣布了Docker 1.12的第一个发布候选版本 。 此版本计划了几个新功能。

该博客将展示如何从Docker Compose创建分布式应用程序捆绑包,并将其作为Docker堆栈以Docker Swarm模式部署。 非常感谢@friism帮助我理解这些概念。

让我们先来看一下这些功能:

  • 内置编排 :典型的应用程序是使用Docker Compose文件定义的。 该定义由多个容器组成,并部署在多个主机上。 这样可以避免单点故障(SPOF),并保持应用程序的弹性。 多个编排框架(例如Docker Swarm,Kubernetes和Mesos)使您可以编排这些应用程序。 但是,这正是应用程序的重要特性,Docker Engine现在具有内置的编排。 在以后的博客中,有关此主题的更多详细信息。
  • 服务 :可以使用docker service create命令轻松创建复制,分布式和负载平衡的服务。 提供了应用程序的“所需状态”,例如运行3个Couchbase容器,并且自我修复的Docker引擎确保群集中正在运行许多容器。 如果某个容器发生故障,则将启动另一个容器。 如果某个节点发生故障,则该节点上的容器将在另一个节点上启动。 有关更多信息,请参见后面的博客。
  • 零配置安全性 :Docker 1.12随附经过相互认证的TLS,可为现存集群中每个参与节点的通信提供认证,授权和加密。 有关更多信息,请参见后面的博客。
  • Docker堆栈和分布式应用程序捆绑包 :分布式应用程序捆绑包(DAB)是一种多服务可分发映像格式。 进一步阅读以获取更多详细信息。

到目前为止,您可以获取一个Dockerfile并使用Dockerfile docker build命令Dockerfile创建映像。 可以使用docker run命令启动容器。 通过多次给出该命令,可以轻松启动多个容器。 或者,您也可以使用Docker Compose文件并使用docker-compose scale命令docker-compose scale容器。

图像是单个容器的可移植格式。 分布式应用程序捆绑包 (DAB)是Docker 1.12中引入的新概念,是一种可移植的格式,用于多个容器。 然后可以在运行时将每个捆绑软件部署为堆栈

在docker.com/dab上了解有关DAB的更多信息。

为了简单起见,可以得出一个类比:

Dockerfile->图片->容器

Docker Compose->分布式应用程序捆绑-> Docker Stack

让我们使用一个Docker Compose文件,从中创建一个DAB,并将其部署为Docker Stack。

重要的是要注意,这是1.12-RC2中的实验功能。

从Docker Compose创建分布式应用程序捆绑包

Docker Compose CLI添加了一个新的bundle命令。 可以找到更多详细信息:

docker-compose bundle --help
Generate a Docker bundle from the Compose file.Local images will be pushed to a Docker registry, and remote images
will be pulled to fetch an image digest.Usage: bundle [options]Options:-o, --output PATH          Path to write the bundle file to.Defaults to ".dsb".

现在,让我们采用Docker Compose定义并从中创建一个DAB。 这是我们的Docker Compose定义:

version: "2"
services:db:container_name: "db"image: arungupta/oreilly-couchbase:latestports:- 8091:8091- 8092:8092 - 8093:8093 - 11210:11210web:image: arungupta/oreilly-wildfly:latestdepends_on:- dbenvironment:- COUCHBASE_URI=dbports:- 8080:8080

该Compose文件将启动WildFly和Couchbase服务器。 Java EE应用程序已在WildFly服务器中预先部署,该服务器连接到Couchbase服务器,并允许使用REST API执行CRUD操作。

该文件的来源位于: github.com/arun-gupta/oreilly-docker-book/blob/master/hello-javaee/docker-compose.yml 。

用它生成一个应用程序包:

docker-compose bundle
WARNING: Unsupported key 'depends_on' in services.web - ignoring
WARNING: Unsupported key 'container_name' in services.db - ignoring
Wrote bundle to hellojavaee.dsb

depends_on仅在两个服务之间创建依赖关系,并使它们以特定顺序启动。 这只能确保启动Docker容器,但容器中的应用程序可能需要更长的时间才能启动。 因此,此属性只能部分解决问题。 container_namecontainer_name一个特定的名称。 依赖于特定的容器名称是紧密耦合的,并且不允许缩放容器。 因此,暂时可以忽略这两个警告。

此命令使用Compose项目名称(即目录名称)生成文件。 因此,在本例中,将生成hellojavaee.dsb文件。 在RC3中,此文件扩展名已重命名为.dab

生成的应用程序包如下所示:

{"services": {"db": {"Image": "arungupta/oreilly-couchbase@sha256:f150fcb9fca5392075c96f1baffc7f893858ba763f3c05cf0908ef2613cbf34c", "Networks": ["default"], "Ports": [{"Port": 8091, "Protocol": "tcp"}, {"Port": 8092, "Protocol": "tcp"}, {"Port": 8093, "Protocol": "tcp"}, {"Port": 11210, "Protocol": "tcp"}]}, "web": {"Env": ["COUCHBASE_URI=db"], "Image": "arungupta/oreilly-wildfly@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914", "Networks": ["default"], "Ports": [{"Port": 8080, "Protocol": "tcp"}]}}, "version": "0.1"
}

该文件提供了应用程序中包含的服务的完整描述。 我不太确定Distributed Application Bundle是否是最合适的名称,请在#24250中进行讨论。 如果可以在这里支持其他容器格式,例如Rkt,甚至VM,那就太好了。 但就目前而言,Docker是唯一受支持的格式。

在Docker中初始化Swarm模式

如上所述,“所需状态”现在由Docker Swarm维护。 现在,它已经被移植到Docker Engine中了。

Docker Swarm概念也在不断发展,可以在Swarm模式下的关键概念中阅读。 稍后将发布有关此内容的更详细的博客。

但对于此博客,现在添加了新命令docker swarm

docker swarm --helpUsage:    docker swarm COMMANDManage Docker SwarmOptions:--help   Print usageCommands:init        Initialize a Swarmjoin        Join a Swarm as a node and/or managerupdate      Update the Swarmleave       Leave a Swarminspect     Inspect the SwarmRun 'docker swarm COMMAND --help' for more information on a command.

在Docker Engine中初始化Swarm节点(作为工作程序):

docker swarm init
Swarm initialized: current node (ek9p1k8r8ox7iiua5c247skci) is now a manager.

可以使用docker swarm inspect命令找到有关此节点的更多详细信息。

docker swarm inspect
[{"ID": "1rcvu7m9mv2c8hiaijr7an9zk","Version": {"Index": 1895},"CreatedAt": "2016-07-01T23:52:38.074748177Z","UpdatedAt": "2016-07-02T04:54:32.79093117Z","Spec": {"Name": "default","AcceptancePolicy": {"Policies": [{"Role": "worker","Autoaccept": true},{"Role": "manager","Autoaccept": false}]},"Orchestration": {"TaskHistoryRetentionLimit": 10},"Raft": {"SnapshotInterval": 10000,"LogEntriesForSlowFollowers": 500,"HeartbeatTick": 1,"ElectionTick": 3},"Dispatcher": {"HeartbeatPeriod": 5000000000},"CAConfig": {"NodeCertExpiry": 7776000000000000}}}
]

输出显示该节点只是一个工作程序,而不是管理程序。 如果群集只有一个节点,这可能很好。 但是,多节点群集至少应具有一个管理器。

部署Docker堆栈

使用docker deploy命令创建堆栈:

docker deploy -f hellojavaee.dsb hellojavaee
Loading bundle from hellojavaee.dsb
Creating network hellojavaee_default
Creating service hellojavaee_db
Creating service hellojavaee_web

如#24249中所述,可以肯定地简化命令用法。

请参阅服务列表:

docker service ls
ID            NAME             REPLICAS  IMAGE                                                                                                COMMAND
2g8kmrimztes  hellojavaee_web  1/1       arungupta/oreilly-wildfly@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914
46xhlb15cc60  hellojavaee_db   1/1       arungupta/oreilly-couchbase@sha256:f150fcb9fca5392075c96f1baffc7f893858ba763f3c05cf0908ef2613cbf34c

输出显示两个服务WildFly和Couchbase正在运行。 服务也是Docker 1.12中引入的新概念。 有什么让您拥有“理想状态”,而Docker Engine便为您提供了这种理想状态。

docker ps显示正在运行的容器的列表:

CONTAINER ID        IMAGE                                                                                                 COMMAND                  CREATED             STATUS              PORTS                                                        NAMES
622756277f40        arungupta/oreilly-couchbase@sha256:f150fcb9fca5392075c96f1baffc7f893858ba763f3c05cf0908ef2613cbf34c   "/entrypoint.sh /opt/"   3 seconds ago       Up 1 seconds        8091-8093/tcp, 11207/tcp, 11210-11211/tcp, 18091-18092/tcp   hellojavaee_db.1.19enwdt6i5m853m5675tx3z29
abf8703ed713        arungupta/oreilly-wildfly@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914     "/opt/jboss/wildfly/b"   3 seconds ago       Up 1 seconds        8080/tcp                                                     hellojavaee_web.1.70piloz6j4zt06co8htzisgyl

在Couchbase容器启动并运行之前,WildFly容器启动。 这意味着Java EE应用程序尝试连接到Couchbase服务器并失败。 因此,应用程序永远无法成功启动。

自我修复Docker服务

Docker Service维护应用程序的“期望状态”。 在我们的情况下,期望的状态是确保用于服务的一个(只有一个)容器正在运行。 如果我们删除容器而不是服务,则该服务将自动再次启动容器。

按照以下方式卸下容器:

docker rm -f abf8703ed713

注意,您必须给-f因为容器已经在运行。 Docker 1.12自愈机制启动并自动重启容器。 现在,如果您再次列出容器

CONTAINER ID        IMAGE                                                                                                 COMMAND                  CREATED             STATUS                  PORTS                                                        NAMES
db483ac27e41        arungupta/oreilly-wildfly@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914     "/opt/jboss/wildfly/b"   1 seconds ago       Up Less than a second   8080/tcp                                                     hellojavaee_web.1.ddvwdmojjysf46d4n3x4g8uv4
622756277f40        arungupta/oreilly-couchbase@sha256:f150fcb9fca5392075c96f1baffc7f893858ba763f3c05cf0908ef2613cbf34c   "/entrypoint.sh /opt/"   26 seconds ago      Up 25 seconds           8091-8093/tcp, 11207/tcp, 11210-11211/tcp, 18091-18092/tcp   hellojavaee_db.1.19enwdt6i5m853m5675tx3z29

这表明新的容器已启动。

检查WildFly服务:

docker service inspect hellojavaee_web
[{"ID": "54otfi6dc9bis7z6gc6ubynwc","Version": {"Index": 328},"CreatedAt": "2016-07-02T01:36:35.735767569Z","UpdatedAt": "2016-07-02T01:36:35.739240775Z","Spec": {"Name": "hellojavaee_web","Labels": {"com.docker.stack.namespace": "hellojavaee"},"TaskTemplate": {"ContainerSpec": {"Image": "arungupta/oreilly-wildfly@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914","Env": ["COUCHBASE_URI=db"]}},"Mode": {"Replicated": {"Replicas": 1}},"Networks": [{"Target": "epw57lz7txtfchmbf6u0cimis","Aliases": ["web"]}],"EndpointSpec": {"Mode": "vip","Ports": [{"Protocol": "tcp","TargetPort": 8080}]}},"Endpoint": {"Spec": {},"Ports": [{"Protocol": "tcp","TargetPort": 8080,"PublishedPort": 30004}],"VirtualIPs": [{"NetworkID": "9lpz688ir3pzexubkcb828ikg","Addr": "10.255.0.5/16"},{"NetworkID": "epw57lz7txtfchmbf6u0cimis","Addr": "10.0.0.4/24"}]}}
]

Swarm为服务分配了一个随机端口,或者可以使用docker service update命令手动更新。 在我们的情况下,容器的端口8080映射到主机上的30004端口。

验证申请

检查应用程序是否已成功部署:

curl http://localhost:30004/books/resources/book
[{"books":0}]

向应用程序添加一本新书:

curl -v \
&qt; -H "Content-Type: application/json" \
&qt; -X POST -d '{
&qt;   "isbn": "978-1-4919-1889-0",
&qt;   "name": "Minecraft Modding with Forge",
&qt;   "cost": 29.99
&qt; }' \
&qt; http://localhost:30004/books/resources/book
*   Trying ::1...
* Connected to localhost (::1) port 30004 (#0)
&qt; POST /books/resources/book HTTP/1.1
&qt; Host: localhost:30004
&qt; User-Agent: curl/7.43.0
&qt; Accept: */*
&qt; Content-Type: application/json
&qt; Content-Length: 92
&qt;
* upload completely sent off: 92 out of 92 bytes
<HTTP/1.1 200 OK
<Connection: keep-alive
<X-Powered-By: Undertow/1
<Server: WildFly/10
<Content-Type: application/octet-stream
<Content-Length: 88
<Date: Sat, 02 Jul 2016 01:39:49 GMT
<
* Connection #0 to host localhost left intact
{"name":"Minecraft Mhttp://localhost:30004/books/resources/book-1-4919-1889-0"}

再次验证书籍:

curl http://localhost:30004/books/resources/book
[{"books":{"name":"Minecraft Modding with Forge","cost":29.99,"id":"1","isbn":"978-1-4919-1889-0"}}, {"books":1}]

在github.com/arun-gupta/oreilly-docker-book/tree/master/hello-javaee上了解有关此Java EE应用程序的更多信息。

该博客展示了如何从Docker Compose创建分布式应用程序捆绑包,并在Docker Swarm模式下将其作为Docker Stack部署。

翻译自: https://www.javacodegeeks.com/2016/07/docker-services-stack-distributed-application-bundle.html

Docker服务,堆栈和分布式应用程序捆绑相关推荐

  1. 服务器2012系统用什么更新驱动程序,服务堆栈更新程序适用于 Windows 8 和 Windows Server 2012...

    症状 本文介绍了适用于 Windows 8 和 Windows Server 2012 服务堆栈更新.安装此更新程序后,以下问题得到解决. 问题 1 基于 Windows 8 的或基于 Windows ...

  2. ZooKeeper:分布式应用程序的分布式协调服务

    ZooKeeper--动物园管理员 ZooKeeper:分布式应用程序的分布式协调服务 设计目标 数据模型和分层命名空间 节点和短暂节点 有条件的更新和手表 担保 简单的API 履行 用途 性能 可靠 ...

  3. ZooKeeper分布式应用程序的分布式协调服务:概述,入门,发布版本

    ZooKeeper概述适用于客户端开发人员,管理员和贡献者的技术概述文档 概述 -ZooKeeper的鸟瞰图,包括设计概念和体系结构 入门 -教程风格的指南,供开发人员安装,运行和编程到ZooKeep ...

  4. Zookeeper 教程:Zookeeper作为Hadoop和Hbase的重要组件,为分布式应用程序协调服务

    目录 Zookeeper 教程 适用人群 学习前提 Zookeeper 概述 分布式应用 分布式应用的优点 分布式应用的挑战 什么是Apache ZooKeeper? ZooKeeper的好处 Zoo ...

  5. Zookeeper: 一个分布式应用程序协调服务

    Zookeeper: A Service for Coordinating Processes of Distributed Applications A Scalable,reliable,robu ...

  6. Flowmill :为分布式应用程序世界构建的网络可观察性解决方案

    https://docs.flowmill.com/ 目录 How Flowmill Works Flowmill 收集什么 检测网络可靠性和性能问题 管理网络传输成本 分析应用程序行为 Flowmi ...

  7. bitnami如何使用_使用Bitnami获取完全配置的Apache Airflow Docker开发堆栈

    bitnami如何使用 I've been using it for around 2 years now to build out custom workflow interfaces, like ...

  8. 使用 Docker 让传统 .NET 应用程序现代化

    15 年来,Microsoft .NET Framework 一直都是成功的应用程序平台,在旧版 Framework 和旧版 Windows Server 上运行的业务关键应用程序不计其数.这些传统应 ...

  9. JMS分布式应用程序异步消息解决方案EhCache 高速缓存同步问题

    部分博客中描述的使用拦截器怎么用EJB公布的WebService加入缓存,这样能够提高WebService的响应效率.但是即使是这样做,还是要经历网络的传输的.于是决定在调用WebService的程序 ...

  10. python django部署docker_如何Docker化Python Django应用程序

    Docker是一个开源项目,为开发人员和系统管理员提供了一个开放平台,可以将应用程序构建.打包为一个轻量级容器,并在任何地方运行.Docker 会在软件容器中自动部署应用程序. Django 是一个用 ...

最新文章

  1. 用枚举来处理java自定义异常
  2. 算法提高 邮票面值设计
  3. 配置yum仓库和客户端:
  4. [Android 插件化(一)] DynamicLoadApk的用法
  5. IOS-awakeFromNib和viewDidLoad
  6. 微软Windows Community Toolkit一览
  7. autocad.netQQ群:193522571属性块中属性文字宽度比例自动调整到格子宽度内,比例因子小于标准比例因子的自动设置为标准比例因子...
  8. SQLite数据库浅谈
  9. 数据科学 IPython 笔记本 7.14 处理时间序列
  10. spring事务分类简述
  11. 设计模式(二十三)—— 模板方法
  12. SQL:从入门到“精通”
  13. 2020的另一面:5G的斯普特尼克之年
  14. 国际市场营销知识框架图_留学热门 | 伦敦里士满大学市场营销本科专业
  15. 蓝桥杯大赛(大学B组)—— 数字三角形 (C语言)
  16. eclipse中的图片路径 image
  17. abb机器人指令手册_ABB机器人速度设置
  18. 【软件安装】MySQL8.0安装图文教程及可视化工具Navicat安装
  19. 笔记本连接外接显示器显示“显示信号输入超出范围“解决方案
  20. 鸿蒙开发(2)---Button组件

热门文章

  1. 关于python中矩阵相乘需要注意的事情
  2. 数据分析之 假设检验
  3. 使用maven引用第三方jar包
  4. centos7安装apache
  5. 高通功耗调试17之TLOC DEAMON导致待机/亮屏电流异常问题
  6. Python 之 PyCharm + selenium 163邮箱登录详解
  7. html页面中添加分页符,在生成的HTML中插入分页符.doc
  8. 微信语音识别开放平台
  9. npm install报错10054,Error while executing
  10. Docker官方文档阅读笔记