Docker-compose一键部署disconf配置中心

分布式配置管理平台Disconf会依赖redis,zookeeper,nginx,tomcat,mysql等服务,所以环境的配置和搭建略为麻烦,如果有现成镜像的话,用docker是个不错的方案

首先把disconf环境依赖的所有server都列出来:

  1. redis<无需定制,用官方镜像>
  2. zookeeper<无需定制,用官方镜像>
  3. mysql<定制,创建库,表,导入初始化数据>
  4. tomcat<定制,包含业务war包,路径配置>
  5. nginx<定制,配置动静分离,包含静态web资源>

前一篇文章 Docker-compose一键部署zk集群+dubbo-admin已经解决zk集群部署,本节只配置zk单机。

下载源码

定制mysql镜像
disconf的数据库需要初始化数据,所以不能直接使用官方镜像,需要定制。
请参考《让docker中mysql启动自动执行sql

定制tomcat镜像
先设置环境变量ONLINE_CONFIG_PATHWAR_ROOT_PATH,如下:

vim /etc/profile
export ONLINE_CONFIG_PATH=/home/mapbar/disconf/resource
export WAR_ROOT_PATH=/home/mapbar/disconf/war
source /etc/profile

resource和war都是在disconf下创建的目录,resource用于存放disconf/disconf-web/profile/rd中的配置文件,war用于存放打包生成的文件。
使用source使变量生效,可以使用env查看变量。

复制并修改配置文件
将disconf/disconf-web/profile/rd的配置文件复制到disconf/resource

cp disconf/disconf-web/profile/rd .

依次修改jdbc-mysql.properties,redis-config.properties,zoo.properties这三个文件

  • jdbc-mysql.properties
jdbc.db_0.url=jdbc:mysql://mysqlhost:3306/disconf?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=false
jdbc.db_0.username=root
jdbc.db_0.password=root

这里主要修改2点,一是ip变为容器名,二是password。

  • redis-config.properties
...
redis.group1.client1.name=BeidouRedis1
redis.group1.client1.host=redishost01
redis.group1.client1.port=6379
redis.group1.client1.timeout=5000
redis.group1.client1.password=foobared

redis.group1.client2.name=BeidouRedis2
redis.group1.client2.host=redishost02
redis.group1.client2.port=6380
redis.group1.client2.timeout=5000
redis.group1.client2.password=foobared
...

这里也是将ip改为容器。

  • zoo.properties
hosts=zkhost:2181

# zookeeper\u7684\u524D\u7F00\u8DEF\u5F84\u540D
zookeeper_url_prefix=/disconf

这里也是将ip改为容器。
Disconf客户端需要访问zookeeper,会使用zoo.properties中的配置。
为了统一配置,客户端需要修改hosts文件,将主机名zkhost映射到Docker服务器IP。

最后把application-demo.properties文件改名为application.properties

打包war

cd disconf/disconf-web/
sh deploy/deploy.sh

在disconf目录下创建tomcat目录,如/home/docker/disconf/tomcat,将war文件复制到当前目录,同时在当前目录创建server.xml文件,如下:

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
        <Context path="" docBase="/usr/local/tomcat/webapps/disconf-web" debug="0" reloadable="true" crossContext="true"/>        
      </Host>
    </Engine>
  </Service>
</Server>

其实也就是加了一个<context>用于配置工程目录。

在tomcat文件夹下新增Dockerfile文件,内容如下:

# Docker image of disconf tomcat
# VERSION 1.0
# Author: yxx

#基础镜像使用tomcat:8.5.34-jre8
FROM tomcat:8.5.34-jre8

#作者
MAINTAINER weistar <weistar103@gmail.com>

#定义工作目录
ENV TOMCAT_BASE /usr/local/tomcat

#复制配置文件
COPY ./server.xml $TOMCAT_BASE/conf/

#复制war包
COPY ./disconf-web.war $TOMCAT_BASE/webapps/

#给配置文件增加读权限
RUN chmod a+xr $TOMCAT_BASE/conf/server.xml

#删除默认的ROOT文件件
RUN rm -rf $TOMCAT_BASE/webapps/ROOT

看的出Dockerfile做的事情并不多,就是复制war包,复制server.xml,删除默认的ROOT应用文件夹这些事情;

现在打开终端在tomcat目录下执行以下命令,构建tomcat镜像:

docker build --rm -t conf_tomcat:1.0 .

构建nginx镜像
在disconf目录下新建一个nginx目录,在里面新增一个nginx.conf文件,内容如下:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;

    upstream disconf {  
        server tomcathost:8080;  #容器服务名
    }  

    server {  
        listen   80;  
        server_name localhost;  
        access_log logs/disconf_access.log;  
        error_log logs/disconf_error.log;  

        location / {  
            root /usr/local/work/html;  
            if ($query_string) {  
                expires max;  
            }  
        }  
        # “~”表示区分大小写的正则匹配, "^"表示开始位置
        location ~ ^/(api|export) {  
            proxy_pass_header Server;  
            proxy_set_header Host $http_host;  
            proxy_redirect off;  #修改301或者302转发过程中的Location
            proxy_set_header X-Real-IP $remote_addr;  
            proxy_set_header X-Scheme $scheme;  
            proxy_pass http://disconf;   #代理服务器,转发请求
        }  
    }  

}

接着将war下的html目录下所有静态文件复制到当前目录中。
在nginx文件夹下新增Dockerfile文件,内容如下:

# Docker image of disconf nginx
# VERSION 1.0
# Author: yxx

#基础镜像使用nginx:stable
FROM nginx:stable

#作者
MAINTAINER weistar <weistar103@163.com>

#定义工作目录
ENV WORK_PATH /usr/local/work/html

#定义nginx配置文件所在目录
ENV NGINX_CONF_DIR /etc/nginx

#定义nginx配置文件名称
ENV NGINX_CONF_FILE_NAME nginx.conf

#创建工作文件夹
RUN mkdir -p $WORK_PATH

#创建nginx日志文件夹
RUN mkdir -p /etc/nginx/logs/

#复制nginx配置文件
COPY ./$NGINX_CONF_FILE_NAME $NGINX_CONF_DIR/

#复制网页的静态资源文件
COPY ./html $WORK_PATH/

#给配置文件增加读权限
RUN chmod a+xr $NGINX_CONF_DIR/$NGINX_CONF_FILE_NAME

在nginx目录下执行以下命令,构建nginx镜像:

docker build --rm -t conf_nginx:1.0 .

编写docker-compose脚本

version: '3'
services:
  disconf_redis_1: 
    image: daocloud.io/library/redis
    restart: always
  disconf_redis_2: 
    image: daocloud.io/library/redis
    restart: always
  disconf_zookeeper: 
    image: zookeeper:3.4
    restart: always
  disconf_mysql: 
    image: disconf_mysql:1.0
    environment:
      MYSQL_ROOT_PASSWORD: root
    restart: always
  disconf_tomcat: 
    image: conf_tomcat:1.0
    depends_on:
      - disconf_redis_1
      - disconf_redis_2
      - disconf_zookeeper
      - disconf_mysql
    links: 
      - disconf_redis_1:redishost001 
      - disconf_redis_2:redishost002
      - disconf_zookeeper:zkhost
      - disconf_mysql:mysqlhost
    restart: always
  disconf_nginx: 
    image: conf_nginx:1.0
    depends_on:
      - disconf_tomcat
    links: 
      - disconf_tomcat:tomcathost 
    ports: 
      - "8099:80" #将主机8099绑定到容器80端口
    restart: always

注意,这里一定要设定depends_on
关于depends_on,请查看https://docs.docker.com/compose/compose-file/compose-file-v2/#depends_on

启动服务

命令窗口
docker-compose up
启动单个
docker-compose up xxx
进程模式
docker-compose up -d
docker-compose stop
docker-compose start
docker-compose rm

使用docker-compose up将停止并移除旧容器,重建新容器。

docker pull image加速
目前,Docker拥有中国的官方镜像,具体内容可访问https://www.docker-cn.com/registry-mirror

在使用时,Docker 中国官方镜像加速可通过 registry.docker-cn.com 访问。该镜像库只包含流行的公有镜像。私有镜像仍需要从美国镜像库中拉取。

您可以使用以下命令直接从该镜像加速地址进行拉取,如下:
$ docker pull registry.docker-cn.com/myname/myrepo:mytag

$ docker pull registry.docker-cn.com/library/ubuntu:16.04

为了永久性保留更改,您可以修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。

{
  "registry-mirrors": ["https://mhdffum4.mirror.aliyuncs.com","https://docker.mirrors.aliyuncs.com","https://registry.docker-cn.com","https://mirror.ccs.tencentyun.com"]
}

修改保存后重启 Docker 以使配置生效 service docker restart
学习交流群:64691032

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351