docker部署分布式应用

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

该博客将展示如何从Docker Compose创建分布式应用程序捆绑包,并在Docker Swarm模式下将其部署为Docker Stack。 非常感谢@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"
}

该文件提供了应用程序中包含的服务的完整说明。 我不完全确定“分布式应用程序捆绑包”是否是最合适的名称,请在#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部署分布式应用

docker部署分布式应用_Docker服务,堆栈和分布式应用程序捆绑相关推荐

  1. 基于docker部署的微服务架构(九): 分布式服务追踪 Spring Cloud Sleuth

    为什么80%的码农都做不了架构师?>>>    前言 微服务架构中完成一项功能经常会在多个服务之间远程调用(RPC),形成调用链.每个服务节点可能在不同的机器上甚至是不同的集群上,需 ...

  2. 用Docker部署TensorFlow Serving服务

    文章目录 1. 安装 Docker 2. 使用 Docker 部署 3. 请求服务 3.1 手写数字例子 3.2 猫狗分类例子 参考: https://tf.wiki/zh_hans/deployme ...

  3. Docker学习篇——使用Docker部署账单微服务项目

    Docker概念 Docker 是一个开源的应用容器引擎 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc) Docker 可以让开发者打包他们 ...

  4. docker部署tomcat+mysql服务

    mysql服务 以sql文件clock_in.sql为例 当然也可以选择直接先起一个mysql容器,用数据库管理工具建.这边主要是为了自动部署. clock_in.sql /* Navicat MyS ...

  5. docker 部署 生产_Docker如何简化生产部署

    docker 部署 生产 最重要的是,现代发展的主要重点通常基于三个中心概念: 效率 可靠性 重复性 但是,当现代应用程序体系结构经常同时具有一系列变量而又在多个部署环境中进一步恶化时,您如何实现这三 ...

  6. docker部署zabbix6.0服务

    前言 服务器 ip 规格 相关信息 CentOS7.9 Linux localhost 3.10.0-1160.83.1.el7.x86_64 192.168.56.110 1c2g40GB dock ...

  7. 基于docker部署的微服务架构(四): 配置中心

    原文:http://www.jianshu.com/p/b17d65934b58%20 前言 在微服务架构中,由于服务数量众多,如果使用传统的配置文件管理方式,配置文件分散在各个项目中,不易于集中管理 ...

  8. Docker部署运行微服务

    1.环境准备: 主机: X-shell X-ftp jar包 这里只说下jar包,另外两个到官网下载即可 Idea打包jar包流程 先按这四步走 先点击左下的框框,再点击maven,出现右边的窗口,点 ...

  9. ubuntu用Docker部署kafka消息服务

    ** 为了方便后续的配置,以下部署的时候IP都统一使用同一个IP ** 首先,先下载两个官方images: docker pull wurstmeister/kafka docker pull wur ...

  10. un直连服务器教程,unRAID下使用Docker部署iCloud直连相片备份服务

    作者:高丽肠 鉴于有很多朋友不喜欢看一堆叨逼叨的文字 , 伸手党和时间管理大师们可以直接从 " 部署步骤 " 开始看 . 碎碎念 自从 2018 年左右上车买了一台星际蜗牛之后 , ...

最新文章

  1. JQuery中的事件和选择器
  2. .net 考试系统人一多就断开了_2020年银行从业资格考试成绩查询入口已开放
  3. 企业网站设计方案需先明确网站主题
  4. 反射获取有参数的成员方法并运行
  5. innerText,outerText,innerHTML,outerHTML区别
  6. delphi7aes加密解密与java互转_跨语言(java vs python vs nodejs)的RSA加解密问题探讨
  7. RHEL5实现YUM本地源的配置
  8. php 缩略图不失真,c#生成缩略图不失真的方法实例分享
  9. Android ListView 中文API
  10. java版b2b2c社交电商spring cloud分布式微服务(十)高可用的服务注册中心
  11. Beta冲刺 day4
  12. sqlserver企业版秘钥_SQLSERVER序列号
  13. 整理15款实用javascript富文本编辑器
  14. python学生信息管理系统 实验报告_Python学生信息管理系统的开发
  15. vs2019专业版本 vtk安装
  16. 5G无线关键技术 — 双工技术
  17. 2068个开源的网站模板
  18. linux下解压rpm包,linux下 各种解压文件使用方法
  19. 问题 B: 神棍的纯真愿望
  20. windows下pyqt4

热门文章

  1. 抖音反编译学习(记录草稿)
  2. 基于web的网页问卷调查设计_Python3菜鸟教程丨基于Web模块的轻量级接口设计基础...
  3. Unexpected console statement
  4. 读书笔记:《薛兆丰经济学讲义》
  5. 通信知识宝典1 -- 如何让无线路由网速最快
  6. .mat转.tif 用于arcgis裁剪遥感图像
  7. VMware Workstation 10.0 注册机
  8. 预售┃让苹果CEO库克折服的程序员仅10岁!?
  9. 全球货币市场基础知识系列4
  10. android 8 刷机教程视频教程,教你Android 8.0的刷机教程