zoukankan      html  css  js  c++  java
  • Docker学习笔记之在开发环境中使用服务发现

    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: '3'
    
    services:
    
      zk1:
        image: zookeeper:3.4
        restart: always
        hostname: zk1
        environment:
          ZOO_MY_ID: 1
          ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888
        ports:
          - 2181:2181
    
      zk2:
        image: zookeeper:3.4
        restart: always
        hostname: zk2
        environment:
          ZOO_MY_ID: 2
          ZOO_SERVERS: server.1=zk1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zk3:2888:3888
        ports:
          - 2182:2181
    
      zk3:
        image: zookeeper:3.4
        restart: always
        hostname: zk3
        environment:
          ZOO_MY_ID: 3
          ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=0.0.0.0:2888:3888
        ports:
          - 2183:2181

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

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

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

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

    server.1=0.0.0.0:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888

    我们可以在 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
  • 相关阅读:
    算法竞赛入门经典训练指南
    git保护--git分支创建
    解决多个iframe嵌套而造成的多个滚动条问题
    css如何让div元素铺满整个屏幕
    第一个用python3写的爬虫小例子
    用JS获取当前页面的URL以及截取其中的字段
    css处理超出文本截断问题的两种情况(多行或者单行)
    约数的个数
    成绩排序
    八进制
  • 原文地址:https://www.cnblogs.com/JetpropelledSnake/p/10405382.html
Copyright © 2011-2022 走看看