首页 文章 精选 留言 我的

精选列表

搜索[docker-compose],共896篇文章
优秀的个人博客,低调大师

运维之我的docker-compose快速创建zookeeper集群

很多时候大家不同的容器想要不用启动参数这个时候不妨使用脚本封装来实现,官方也很推荐这个做法,这里介绍下如何使用脚本传参快速启动一个zookeeper集群。 zookeeper集群大家知道有部分通用配置,和一些动态配置如果用一个简单的zookeeper实例无法正常启动集群,所以我们的节点列表和节点ID是需要动态传入的所以下面的脚本的${ZK_ID}和${ZK_LIST}是需要你使用compose的配置传入的。 zookeeper启动脚本 https://code.aliyun.com/nginxs/docker/blob/master/pkg/zookeeper/docker-entrypoint.sh [root@test-nodepkg]#catzookeeper/docker-entrypoint.sh #!/bin/bash ####################################################### #author:baishaohua# #mail:nginxs@126.com # #blog:new.nginxs.net # #msg:startupzookeeperclusterfordocker# ####################################################### #ShellBaseEnv ZK_HOME="/usr/local/zookeeper" ZK_CONF="${ZK_HOME}/conf/zoo.cfg" ZK_DATA="/var/lib/zookeeper" ZK_CONF_TXT="tickTime=2000\ninitLimit=10\nsyncLimit=5\ndataDir=${ZK_DATA}\nclientPort=2181" echo"zookeeperisstart" #initconfig echo-e${ZK_CONF_TXT}>${ZK_CONF} #ZK_NODE_LISTfromdockerargv foriin${ZK_NODE_LIST} do echo"$i">>${ZK_CONF} done echo"${ZK_ID}">${ZK_DATA}/myid #thisshellmainfunction ${ZK_HOME}/bin/zkServer.shstart-foreground Dockerfile文件配置 [root@test-node3pkg]#catzookeeper/Dockerfile FROMregistry.cn-hangzhou.aliyuncs.com/forker/centos7:last MAINTAINERbaishaohua<nginxs@126.com> #startupconfigure下面自动把zookeeper安装包安装到/usr/local/zookeeper目录 ADDzookeeper-3.5.1-alpha.tar.gz/usr/local/ RUNmv/usr/local/zookeeper-3.5.1-alpha/usr/local/zookeeper&&mkdir-p/var/lib/zookeeper/ RUNyum-yinstallmakegcclibgccgcc-c++glibc-develjava-1.8.0-openjdk COPYdocker-entrypoint.sh/usr/bin/ #ENVandCMD配置容器默认启动脚本和开放2181端口 CMD["/usr/bin/docker-entrypoint.sh"] EXPOSE2181 重点来了我们要从docker-compose.yml传参到启动脚本 下面通过environment定义环境变量把参数传递到容器的启动脚本,完成自定义部分内容 https://code.aliyun.com/nginxs/docker/blob/master/pkg/zk_cluster/docker-compose.yml [root@test-nodepkg]#catzk_cluster/docker-compose.yml version:'3' services: zk1: p_w_picpath:registry.cn-hangzhou.aliyuncs.com/forker/zookeeper restart:always container_name:zk1 ports: -"2181:2181" environment: ZK_ID:1 ZK_NODE_LIST:server.1=zk1:3181:4181server.2=zk2:3181:4181server.3=zk3:3181:4181 zk2: p_w_picpath:registry.cn-hangzhou.aliyuncs.com/forker/zookeeper restart:always container_name:zk2 ports: -"2182:2181" environment: ZK_ID:2 ZK_NODE_LIST:server.1=zk1:3181:4181server.2=zk2:3181:4181server.3=zk3:3181:4181 zk3: p_w_picpath:registry.cn-hangzhou.aliyuncs.com/forker/zookeeper restart:always container_name:zk3 ports: -"2183:2181" environment: ZK_ID:3 ZK_NODE_LIST:server.1=zk1:3181:4181server.2=zk2:3181:4181server.3=zk3:3181:4181 启动我的compose服务 这里可以看到其实zk1,zk2,zk3每个都是一个service,而且compose会为这个应用创建一个默认的桥接网络 [root@test-node3zk_cluster]#docker-composeup-d WARNING:TheDockerEngineyou'reusingisrunninginswarmmode. Composedoesnotuseswarmmodetodeployservicestomultiplenodesinaswarm.Allcontainerswillbescheduledonthecurrentnode. Todeployyourapplicationacrosstheswarm,use`dockerstackdeploy`. Creatingnetwork"zkcluster_default"withthedefaultdriver Creatingzk3 Creatingzk1 Creatingzk2 测试zookeeper集群 [root@test-nodezk_cluster]#echo"conf"|nclocalhost2181 clientPort=2181 secureClientPort=-1 dataDir=/var/lib/zookeeper/version-2 dataDirSize=67109393 dataLogDir=/var/lib/zookeeper/version-2 dataLogSize=67109393 tickTime=2000 maxClientCnxns=60 minSessionTimeout=4000 maxSessionTimeout=40000 serverId=1 initLimit=10 syncLimit=5 electionAlg=3 electionPort=4181 quorumPort=3181 peerType=0 membership: server.1=zk1:3181:4181:participant server.2=zk2:3181:4181:participant server.3=zk3:3181:4181:participant version=100000000 下面是一些我写的其它帮助文档: 0.docker安装 阿里云加速你的docker 运行你第一个镜像实例-docker容器 docker命令参数 docker仓库使用和镜像提交 docker镜像构建构建及参数详解 docker镜像的导入导出 docker的网络 docker网络的测试示例 docker数据卷 docker的api和python sdk 单机多容器的编排-compose docker-swarm集群的管理-swarm docker-swarm集群管理详解 docker-swarm集群中删除节点和服务 docker自建仓库Registry 使用技巧和推荐 docker集群web页面管理工具 不要再给你的docker安装ssh server compose快速创建zookeeper集群

优秀的个人博客,低调大师

如何使用Docker、Docker-Compose和Rancher搭建部署Pipeline(四)

在这篇文章中,我们将讨论如何用Rancher实现consul的服务发现。 如果你还没有准备好,推荐你阅读本系列中先前的文章: 第一篇:CI /CD和Docker入门 第二篇:使部署逻辑向使用Docker Compose更进一步 第三篇:借力Rancher完成容器编排 在这构建部署流水线系列的最后一篇文章中,我们将探讨在转换到Rancher进行集群调度时面临的一些挑战。在之前的文章中,我们通过使用Rancher执行调度,让运维人员无须再负责选择每一次容器运行的位置。要使用这个新方案,我们必须让环境的其他部分知道调度程序放置这些服务的位置,以及如何访问它们。我们还将讨论如何使用标签来操作调度程序,以调整容器放置位置,并避免端口绑定冲突。最后,我们将通过利用Rancher的回滚功能优化我们的升级过程。 在引入Rancher之前,我们的环境是一个相当静态的环境。我们总是将容器部署到相同的主机上,而部署到不同的主机则意味着我们需要更新一些配置文件以反映新位置。例如,如果我们要添加'java-service-1'应用程序的一个附加实例,我们还需要更新load balancer以指向附加实例的IP。使用调度器让我们无法预测容器部署的位置,并且我们需要动态配置环境,使其能自动适应变化。为此,我们需要使用服务注册和服务发现。 服务注册表为我们提供了应用程序在环境中的位置的单一来源。和硬编码服务位置不同,我们的应用程序可以通过API查询服务注册表,并在我们的环境发生变化时自动重新配置。Rancher使用Rancher的DNS和元数据服务提供了开箱即用的服务发现。然而,混合使用Docker和非Docker应用程序时,我们不能完全依赖Rancher来处理服务发现。我们需要一个独立的工具来跟踪我们所有服务的位置,consul就符合这个要求。 我们不会详细说明如何在您的环境中设置Consul,但是,我们将简要描述我们在ABC公司使用Consul的方式。在每个环境中,我们都有一个部署为容器的Consul集群。我们在环境中的每个主机上都部署一个Consul代理,如果主机正在运行Docker,我们还会部署一个注册器容器。注册器监视每个守护进程的Docker事件API,并在生命周期事件期间自动更新Consul。例如,在新容器被部署后,注册器会自动在Consul中注册该服务。当容器被删除时,注册器撤销它的注册。 Consul服务列表 在Consul中注册所有服务后,我们可以在负载均衡器中运行consul-template,根据Consul中存储的服务数据动态填充上游列表。对于我们的NGINX负载均衡器,我们可以创建一个模板来填充’java-service-1’应用程序的后端: 1 2 3 4 5 6 #upstreams.conf upstreamjava-service- 1 { {{range_,$element:=service "java-service-1" }} server``.`Address`:``.`Port`; ` else ` server 127.0 . 0.1 : 65535 ;#forcea 502 `end`} 此模板在Consul中查找注册为“java-service-1”的服务的列表。然后它将循环该列表,添加具有该特定应用程序实例的IP地址和端口的服务线。如果在Consul中没有注册任何“java-service-1”应用程序,我们默认抛出502以避免NGINX中的错误。 我们可以在守护进程模式下运行consul-template,使其监控Consul的更改,在发生更改时重新渲染模板,然后重新加载NGINX以应用新配置。 1 2 3 4 TEMPLATE_FILE=/etc/nginx/upstreams.conf.tmpl RELOAD_CMD=/usr/sbin/nginx-sreload consul-template-consulconsul.stage.abc.net: 8500 \ -template "${TEMPLATE_FILE}:${TEMPLATE_FILE//.tmpl/}:${RELOAD_CMD}" 通过使用我们的负载均衡器设置来动态地改变其余的环境变化,我们可以完全依赖Rancher调度器来做出我们的服务应该在哪里运行的复杂的决定。但是,我们的“java-service-1”应用程序在Docker主机上绑定TCP端口8080,如果在同一主机上调度了多个应用程序容器,则会导致端口绑定冲突并最终失败。为了避免这种情况,我们可以通过调度规则来操作调度器。 通过在docker-compose.yml文件中使用容器标签来提出条件,是Rancher给我们的一种操作调度器的方法。条件可以包括亲和规则、否定、至“软”强制(意味着尽可能地避免)。在我们使用'java-service-1'应用程序的情况下,我们知道在给定时间只有一个容器可以在主机上运行,因此我们可以基于容器名称设置反关联性规则。这将使调度程序查找一个未运行名称为“java-service-1”的容器的Docker主机。我们的docker-compose.yml文件看起来像下面这样: 1 2 3 4 5 6 7 java-service- 1 : image:registry.abc.net/java-service- 1 :${VERSION} container_name:java-service- 1 ports: - 8080 : 8080 labels: io.rancher.scheduler.affinity:container_label_ne:io.rancher.stack_service.name=java-service- 1 注意“标签”键的引入。所有调度规则都作为标签被添加。标签可以被添加到Docker主机和容器。当我们在Rancher注册我们的主机时,我们可以将它们与标签关联,以后就可以切断调度部署。例如,如果我们有一组使用SSD驱动器进行存储优化的Docker主机,我们可以添加主机标签storage=ssd。 Rancher主机标签 需要利用优化存储主机的容器可以添加标签来强制调度程序仅在匹配的主机上部署它们。我们将更新我们的“java-service-1”应用程序,以便只部署在存储优化的主机上: 1 2 3 4 5 6 7 8 java-service- 1 : image:registry.abc.net/java-service- 1 :${VERSION} container_name:java-service- 1 ports: - 8080 : 8080 labels: io.rancher.scheduler.affinity:container_label_ne:io.rancher.stack_service.name=java-service- 1 io.rancher.scheduler.affinity:host_label:storage=ssd 通过使用标签,我们可以根据所需的容量,而不是个别主机运行特定的容器集,来精细地调整我们的应用程序部署。切换到Rancher进行集群调度,即使您仍然有必须在特定主机上运行的应用程序。 最后,我们可以利用Rancher的回滚功能优化我们的服务升级。在我们的部署工作流中,通过调用rancher-compose来指示Rancher在该服务堆栈上执行升级以部署服务。升级过程大致如下: 通过拉取一个新的镜像来启动升级 逐一地,现有容器被停止并且新容器被启动 部署程序登录到UI并选择“完成升级”时,升级完成, 已停止的旧服务容器被删除 Rancher升级 当给定服务的部署非常少时,此工作流就好了。但是,当某个服务处于“升级”状态(在部署者选择“完成升级”之前)时,在执行“完成升级”或是“回滚”操作之前,你都不能对它进行任何新的升级”。rancher-compose实用程序让我们可以选择以编程方式选择要执行的操作,以部署程序者的身份执行操作。例如,如果您对服务进行自动测试,则可以在rancher-compose升级返回后调用此类测试。根据这些测试的状态,rancher-compose可以被再次调用,这次我们告诉堆栈“完成升级”或“回滚”。我们部署Jenkins作业的一个原始示例可能如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # for thefulljob,seepart 3 of this series /usr/local/bin/rancher-compose--verbose\ -f${docker_dir}/docker-compose.yml\ -r${docker_dir}/rancher-compose.yml\ up-d--upgrade JAVA_SERVICE_1_URL=http: //java-service-1.stage.abc.net:8080/api/v1/status if curl-s${JAVA_SERVICE_1_URL}|grep-q "OK" ;then #looksgood,confirmor "finish" theupgrade /usr/local/bin/rancher-compose--verbose\ -f${docker_dir}/docker-compose.yml\ -r${docker_dir}/rancher-compose.yml\ up--confirm-upgrade else #lookslikethere'sanerror,rollbackthecontainers #tothepreviouslydeployedversion /usr/local/bin/rancher-compose--verbose\ -f${docker_dir}/docker-compose.yml\ -r${docker_dir}/rancher-compose.yml\ up--rollback fi 这个逻辑将调用我们的应用程序端点来执行简单的状态检查。如果输出显示的是‘OK’,那么我们完成升级,否则我们需要回滚到以前部署的版本。如果您没有自动测试,另一个选择是简单地总是完成或“确认”升级。 1 2 3 4 5 # for thefulljob,seepart 3 of this series /usr/local/bin/rancher-compose--verbose\ -f${docker_dir}/docker-compose.yml\ -r${docker_dir}/rancher-compose.yml\ up-d--upgrade--confirm-upgrade 如果不久以后,您确定需要回滚,就使用相同的部署作业简单地重新部署以前的版本。这确实不像Rancher的升级和回滚功能那么友好,但它通过使堆栈不处于“升级”的状态来解锁将来的升级。 当服务在Rancher中回滚时,容器将被重新部署到以前的版本。当使用通用标记如“latest”或“master”部署服务时,可能会出现意外的后果。例如,让我们假设'java-service-1'应用程序以前被部署了标签'latest'。对图像进行更改,推送到注册表,Docker标签“latest”被更新为指向此新映像我们使用标签“latest”继续升级,在测试后决定应用程序需要回滚。使用Rancher滚动堆栈仍然会重新部署最新的映像,因为标签“latest”尚未被更新为指向上一个映像。回滚可以在纯技术术语中实现,但是部署最近的工作副本的预期效果完全无法实现。在ABC公司,我们通过始终使用与应用程序版本相关的特定标记来避免这种情况。因此,不要使用标记latest”部署我们的“java-service-1”应用程序,我们可以使用版本标签“1.0.1-22-7e56158”。这保证回滚将始终指向我们的应用程序在环境中的最新工作部署。 我们希望我们分享的经验对你们有所帮助。这有助于我们有条不紊地采用Docker,稳步改进我们的流程,并让我们的团队能熟悉这些概念。对更自动化的部署工作流进行增量更改,使组织能够更快地实现自动化的优势,部署团队可以更加务实地决定他们在流水线中需要什么。我们的经历证明Rancher在可行性、自动化、甚至团队协作方面都是成功的。我们希望分享这些我们在Docker应用过程中获得的经验教训将有助于您自己的应用过程。 欢迎关注Rancher官方微信公众号(RancherLabs),获取第一手技术干货推送;欢迎添加客服微信(RancherLabsChina)为好友,加入Rancher官方技术交流群,获取免费技术支持,与数千Docker/Rancher使用者互动。 原文来源:Rancher Labs 9月27日,北京海航万豪酒店,容器技术大会Container Day 2017即将举行。 CloudStack之父、海航科技技术总监、华为PaaS部门部长、恒丰银行科技部总经理、阿里云PaaS工程总监、民生保险CIO······均已加入豪华讲师套餐! 11家已容器落地企业,15位真·云计算大咖,13场纯·技术演讲,结合实战场景,聚焦落地经验。免费参会+超高规格,详细议程及注册链接请戳 本文转自 RancherLabs 51CTO博客,原文链接:http://blog.51cto.com/12462495/1961896

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册