0x00 概述

服务发现应用是很多服务化系统的组成部分,所以在开发、测试环境中也就有必要配备一套服务发现体系来配合我们的开发、测试工作。在这一小节里,我们就来谈谈如何在 Docker 环境下部署服务发现应用。

0x01 使用 Docker Compose 模拟 Zookeeper 集群

实现服务发现的方法有很多种,其中较为常见的一种是利用分布式注册中心,解决服务之间协调的问题。

在众多注册中心应用中,Zookeeper 是较为常见和常用的一款程序,这里我们就以 Zookeeper 为例,介绍如何使用 Docker 搭建 Zookeeper 的运行环境。

1.1 设计目录结构

由于 Zookeeper 的运行并不需要太多的关注配置和调整,这里我们就以最基础的形式来设计 Docker Compose 项目的结构。

└─ project
├─ bin
│ └─ compose.sh
└─ compose
└─ docker-compose.yml

为了方便日常操作,我们依然编写了 compose.sh 这个脚本来辅助我们控制 Docker Compose 项目。

1.2 编写 docker-compose.yml

很多读者会问到一个问题,怎么样才能通过 Docker 的虚拟化技术实现在一个机器上模拟出多台机器的效果。或者说一个我们这里会涉及的具体问题,如何只用一个 Docker 来模拟一个高可用的 Zookeeper 集群。

我们知道,要实现 Zookeeper 的高可用,至少需要三个 Zookeeper 节点进行协作,所以这里我们用三个单独的 Docker Compose 服务定义来分别定义这三个节点。

version: ''

services:

  zk1:
image: zookeeper:3.4
restart: always
hostname: zk1
environment:
ZOO_MY_ID:
ZOO_SERVERS: server.=0.0.0.0:: server.=zk2:: server.=zk3::
ports:
- : zk2:
image: zookeeper:3.4
restart: always
hostname: zk2
environment:
ZOO_MY_ID:
ZOO_SERVERS: server.=zk1:: server.=0.0.0.0:: server.=zk3::
ports:
- : zk3:
image: zookeeper:3.4
restart: always
hostname: zk3
environment:
ZOO_MY_ID:
ZOO_SERVERS: server.=zk1:: server.=zk2:: server.=0.0.0.0::
ports:
- :

在这个 Docker Compose 项目中,我们定义的三个 Zookeeper 服务都直接使用了官方制作的 zookeeper 镜像。

在这个镜像里,我们可以留意定制 ZOO_MY_ID 和 ZOO_SERVERS 这两个环境变量。这两个变量主要是用来识别 Zookeeper 集群中不同 Zookeeper 程序的。

其中 ZOO_MY_ID 是 Zookeeper 在集群中的编号,而 ZOO_SERVERS 用来定义集群中的所有 Zookeeper 及它们的连接方式。

我们以 zk1 这个服务为例来解释一下 ZOO_SERVERS 的定义方法。

server.=0.0.0.0:: server.=zk2:: server.=zk3::

我们可以在 ZOO_SERVERS 中定义所有处于 Zookeeper 集群中的程序,通过空格来间隔它们。而每个服务的的定义形式为 server.[id]=[host]:[port]:[port],所以就有了上面例子中我们看到的样子。

在这个例子里,我们描述了三个 Zookeeper 程序的连接地址。

由于每个容器都有独立的端口表,所以即使这些程序都运行在一个主机里,我们依然不需要担心,它们会造成端口的冲突。所以这里我们直接使用默认的 2888 和 3888 来进行服务间的相互通信即可。

而在进行容器互联的过程中,我们可以通过 Docker 的解析机制,直接填入对应服务的名称替代它们的 IP 地址,也就是这个例子里的 zk2 和 zk3。

1.3 重启机制

在项目定义中,我们还注意到了 restart: always 这个配置,这个配置主要是用来控制容器的重启策略的。

这里的 always 指的是不论任何情况,容器出现问题后都会自动重启,也包括 Docker 服务本身在启动后容器也会自动启动。

另外,restart 还支持几种配置:

在实际使用中,我们可以根据需要选择不同的重启策略。

而这个项目里,我们希望 Zookeeper 能够一直健壮的运行,所以使用了 always 这个重启策略。

0x03 启动项目

一切就绪,我们就可以直接通过 Docker Compose 的命令来启动开发环境了

# ./bin/compose.sh up -d

Docker学习笔记之在开发环境中使用服务发现的更多相关文章

  1. Hadoop学习笔记(4) ——搭建开发环境及编写Hello World

    Hadoop学习笔记(4) ——搭建开发环境及编写Hello World 整个Hadoop是基于Java开发的,所以要开发Hadoop相应的程序就得用JAVA.在linux下开发JAVA还数eclip ...

  2. NLP自然语言处理学习笔记三(集成开发环境)

    前言: 我们在做自然语言学习的过程中使用Python进行编程.是用解析器的方式确实有些麻烦.在这里给大家推荐一款集成开发环境IDE可以很方便的对Python进行项目管理,代码自动提示,运行调试等. 简 ...

  3. go语言学习笔记1 Go开发环境

    什么是Go?Go是一门并发支持.垃圾回收的编译型系统编程语言,旨在创造一门具有在静态编译语言的高性能和动态语言的高效开发之间拥有良好平衡的一门编程语言. Go的主要特点有哪些?* 类型安全 和 内存安 ...

  4. 【EJB学习笔记】——EJB开发环境搭建(Eclipse集成JBoss)

    之前一直用的EJB开发环境是他们搭建好的,直接拿来用,不过还是感觉老吃别人嚼好的不太好吃,所以自己动手来玩一玩. EJB开发依赖的最基本的环境:JDK.Eclipse.JBoss,这里简单介绍一下最基 ...

  5. Vue学习笔记(五)——配置开发环境及初建项目

    前言 在上一篇中,我们通过初步的认识,简单了解 Vue 生命周期的八个阶段,以及可以应用在之后的开发中,针对不同的阶段的钩子采取不同的操作,更好的实现我们的业务代码,处理更加复杂的业务逻辑. 而在这一 ...

  6. Cocos2d-x学习笔记之Cocos2d-x开发环境搭建

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Cocos2d-x源码包下载地址: http://cocos2d-x.org/projects/cocos2d-x/ ...

  7. C#学习笔记一:C#开发环境的设置

    C#是.NET Framework的一部分,用于编写.NET应用程序. C#集成开发环境(IDE) 微软提供了以下C#编程开发工具: Visual Studio 2010 (VS) Visual C# ...

  8. Egret学习笔记.2 (Egret开发环境)

    配置Egret的开发环境是很简单的,去https://www.egret.com/products/engine.html下载 然后基本就是下一步下一步,安装好了就好了,装好了选择Wing组件,然后下 ...

  9. php 学习笔记之搭建开发环境(mac版)

    Mac 系统默认集成了很多开发工具,其中就包括 php 所需要的一些软件工具. 下面我们将搭建最简单的 php 开发环境,每一步都会验证上一步的操作结构,请一步一步跟我一起搭建吧! web 服务器之 ...

随机推荐

  1. Python 全栈开发四 python基础 函数

    一.函数的基本语法和特性 函数的定义 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的.函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数 ...

  2. jsp内置对象学习记录

    1.session,是一个会话保留在服务器端的对象(默认保留时间为30分钟),所以我们可以在session里面放用户信息以便后续的访问便利(缺点:cookie劫持,导致用户数据泄露).案例:(1)同个 ...

  3. [LeetCode] 840. Magic Squares In Grid_Easy

    A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, co ...

  4. [LeetCode] 603. Consecutive Available Seats_Easy tag: SQL

    Several friends at a cinema ticket office would like to reserve consecutive available seats.Can you ...

  5. 【转360】KB4041678 Windows 仅安全更新(2017.10) 补丁更新后执行SQL出错! http://bbs.360.cn/thread-15201531-1-1.html

    把EXCEL20003表数据导入到MDB数据库中sql命令语句\"SELECT * INTO 表 FROM [Excel 8.0;DATABASE=C:\\1.xls].[Sheet1$]\ ...

  6. 5.用JQuery实现选中select里面的option显示对应的div

    用JQuery实现选中select里面的option显示对应的div HTML: <select name=""  onchange="select(this)&q ...

  7. webpack打包二进制文件报错

    错误示例,如下图所示: 修改webpack的module部分的rules,在其中添加一下代码: { test: /\.woff[0-9]{0,}$/, loader: "url-loader ...

  8. ES6class

    类的方法都定义在prototype对象上面,所以类的新方法可以添加在prototype对象上面.Object.assign方法可以很方便地一次向类添加多个方法. 类的内部所有定义的方法,都是不可枚举的 ...

  9. Python全栈-day15-day16-常用模块

    1.time模块 1)时间戳 import time# 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量 # 偏移量的是float类型 start_time = tim ...

  10. css解决无论页面长短footer永远置底

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...