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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。