分布式配置管理平台Disconf会依赖redis,zookeeper,nginx,tomcat,mysql等服务,所以环境的配置和搭建略为麻烦,如果有现成镜像的话,用docker是个不错的方案
首先把disconf环境依赖的所有server都列出来:
- redis<无需定制,用官方镜像>
- zookeeper<无需定制,用官方镜像>
- mysql<定制,创建库,表,导入初始化数据>
- tomcat<定制,包含业务war包,路径配置>
- nginx<定制,配置动静分离,包含静态web资源>
前一篇文章 Docker-compose一键部署zk集群+dubbo-admin已经解决zk集群部署,本节只配置zk单机。
下载源码
- disconf: https://github.com/knightliao/disconf(管理端)
- demos: https://github.com/knightliao/disconf-demos-java(客户端)
- wiki: https://github.com/knightliao/disconf/wiki(wiki)
定制mysql镜像
disconf的数据库需要初始化数据,所以不能直接使用官方镜像,需要定制。
请参考《让docker中mysql启动自动执行sql》
定制tomcat镜像
先设置环境变量ONLINE_CONFIG_PATH和WAR_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 "%r" %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