Docker下的disconf实战全文链接

  1. 《Docker搭建disconf环境,三部曲之一:极速搭建disconf》
  2. 《Docker搭建disconf环境,三部曲之二:本地快速构建disconf镜像》
  3. 《Docker搭建disconf环境,三部曲之三:细说搭建过程》
  4. 《Docker下使用disconf:极速体验》
  5. 《Docker下使用disconf:细说demo开发》

细说搭建过程

在前两章中,我们利用远程或本地的镜像,快速体验了本地启动disconf的过程,本章我们一起来分析和梳理整个定制和搭建过程,了解这些后,我们就能根据自己的需要来定制本地的disconf环境了。

以下两点请注意

  1. 本机环境已经安装了maven,并且把maven的bin目录配置到环境变量PATH下;
  2. 编译编译disconf源码时,要用到官方shell脚本,所以本次实践的操作系统建议用linux或mac,如果用windows,有三种方法:一个是把shell改成bat脚本,一个是用虚拟机的linux,还有一种是用在docker上搭建一个maven容器,把disconf源码放在这个容器下编译;

先分析再实战

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

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

下一步,是理清各个server之间的依赖关系(例如tomcat上的业务要连接mysql数据库),依赖关系如下,搞清楚了这个就知道link参数怎么写了:

server的关系已经理清了,接下来就要开始定制mysql,tomcat,nginx这些镜像了,首先是准备材料,disconf是个开源的应用,我们可以在git上下载最新的源码,执行命令:

git clone git@github.com:knightliao/disconf.git

下载完毕,打开文件夹,内容如下图:

接下来我们开始实战把,实战一共五个步骤,依次是: 定制mysql镜像 -> 定制tomcat镜像 -> 定制nginx镜像 -> 编写docker-compose脚本 -> docker-compose启动

定制mysql镜像###

mysql定制:目的是让容器在创建时自动执行sql脚本,创建库和表,并导入初始化数据,在docker上实现数据库脚本自动执行的方法可以参照《让docker中的mysql启动时自动执行sql》一文,这里简单说一下步骤:

  1. 打开disconf源码文件夹,在disconf/disconf-web/sql目录下找到以下四个文件:

0-init_table.sql

1-init_data.sql

201512/20151225.sql

20160701/20160701.sql

  1. 新建一个目录mysql,把上面提到的四个sql文件复制到这个目录下,再新建一个名为install_data.sh的脚本,内容如下:
#!/bin/bash
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
source $WORK_PATH/$FILE_0;
source $WORK_PATH/$FILE_1;
source $WORK_PATH/$FILE_2;
source $WORK_PATH/$FILE_3;

内容很简单,就是自动登录mysql,密码是docker启动的时候传入的环境变量,然后执行四个sql脚本文件

  1. 在mysql目录下新建Dockerfile文件,内容如下:
# Docker image of disconf mysql
# VERSION 0.0.1
# Author: bolingcavalry #基础镜像使用daocloud.io/library/mysql:8
FROM daocloud.io/library/mysql:8 #作者
MAINTAINER BolingCavalry <zq2599@gmail.com> #定义工作目录
ENV WORK_PATH /usr/local/work #定义会被容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d #定义sql文件名
ENV FILE_0 0-init_table.sql
ENV FILE_1 1-init_data.sql
ENV FILE_2 20151225.sql
ENV FILE_3 20160701.sql #定义shell文件名
ENV INSTALL_DATA_SHELL install_data.sh #创建文件夹
RUN mkdir -p $WORK_PATH #把数据库初始化数据的文件复制到工作目录下
COPY ./$FILE_0 $WORK_PATH/
COPY ./$FILE_1 $WORK_PATH/
COPY ./$FILE_2 $WORK_PATH/
COPY ./$FILE_3 $WORK_PATH/ #把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell
COPY ./$INSTALL_DATA_SHELL $AUTO_RUN_DIR/ #给执行文件增加可执行权限
RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DATA_SHELL
  1. 打开终端在mysql目录下执行以下命令,构建msql镜像:
docker build -t conf_mysql:0.0.1 .

msql镜像构建成功

定制tomcat镜像###

构建tomcat镜像时最重要的就是war包的生成,步骤如下:

  1. 创建两个文件夹,分别设置到ONLINE_CONFIG_PATH和WAR_ROOT_PATH这两个环境变量中,环境变量的设置方式在不同的操作系统下各不相同,我用的是mac,配置方式是在~/.bash_profile文件中加入以下内容(写完记得执行source ~/.bash_profile使环境变量在当前命令行窗口生效):
ONLINE_CONFIG_PATH=/Users/zq2599/temp/201705/03/005/online-resources
WAR_ROOT_PATH=/Users/zq2599/temp/201705/03/005/war
export ONLINE_CONFIG_PATH
export WAR_ROOT_PATH

/Users/zq2599/temp/201705/03/005/online-resources和/Users/zq2599/temp/201705/03/005/war都是刚刚新建的文件夹;

  1. 打开disconf的源文件的子目录disconf-web/profile/rd,里面的文件如下图:

把这些文件全部复制到ONLINE_CONFIG_PATH变量对应的目录下,在这个目录下依次修改jdbc-mysql.properties,redis-config.properties,zoo.properties这三个文件:

jdbc-mysql.properties的改动如下图,主要是数据url改成一个固定的名字mysqlhost,这个在docker run的时候要和link参数中的别名一致,还有就是数据库的用户名密码:

redis-config.properties的改动如下图,主要是host参数,也要和docker run时候的link参数的别名对齐,注意,这里要配置两个redis

zoo.properties的配置如下图,主要是host参数,也要和docker run时候的link参数的别名对齐:

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

好了,修改参数的事情就算做完了,有了这些和link参数一致的host配置,tomcat在运行的时候就能连接上对应的容器了。

现在我们用maven来编译和打包disconf的源码,用终端进入disconf源码的disconf-web子目录,执行以下命令开始编译和打包:

sh deploy/deploy.sh

执行完毕后,在环境变量WAR_ROOT_PATH对应的目录下,可以看到编译和打包的结果,如下图:

新建一个名叫tomcat的文件夹,把上图中的disconf-web.war复制到这个文件夹下,再在这里新增一个server.xml文件,内容如下,用来指定tomcat服务的根路径对应的应用:

<?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>

这个配置信息和官方tomcat中的server.xml文件相比,其实只增加了下面这一个节点的内容:

<Context path="" docBase="/usr/local/tomcat/webapps/disconf-web" debug="0" reloadable="true" crossContext="true"/>

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

# Docker image of disconf tomcat
# VERSION 0.0.1
# Author: bolingcavalry #基础镜像使用tomcat:7.0.77-jre8
FROM tomcat:7.0.77-jre8 #作者
MAINTAINER BolingCavalry <zq2599@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 -t conf_tomcat:0.0.1 .

tomcat镜像构建成功!

构建nginx镜像###

  1. 新建一个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;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://disconf;
}
} }

主要的配置有三点:

将默认的/etc/nginx/conf.d/*.conf配置注释掉;

增加tomcat的host信息,“tomcathost”和后面docker run的link参数的别名保持一致;

动静分离的配置,请求url中如果带有api和export,nginx就把请求转发到tomcathost:8080,其他的请求直接访问nginx服务器的/usr/local/work/html文件夹;

  1. 在环境变量WAR_ROOT_PATH对应的目录下,有个html文件夹如下图红框位置,这是web工程全部静态文件,把这个文件夹复制到刚才新建的nginx目录下:

  1. 在nginx文件夹下新增Dockerfile文件,内容如下:
# Docker image of disconf nginx
# VERSION 0.0.1
# Author: bolingcavalry #基础镜像使用nginx:stable
FROM nginx:stable #作者
MAINTAINER BolingCavalry <zq2599@gmail.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
  1. 现在打开终端在nginx目录下执行以下命令,构建nginx镜像:
docker build -t conf_nginx:0.0.1 .

nginx镜像构建成功!

编写docker-compose脚本###

新增一个docker-compose.yml文件(位置无所谓),内容如下:

version: '2'
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.3.6
restart: always
disconf_mysql:
image: conf_mysql:0.0.1
environment:
MYSQL_ROOT_PASSWORD: 123456
restart: always
disconf_tomcat:
image: conf_tomcat:0.0.1
links:
- disconf_redis_1:redishost001
- disconf_redis_2:redishost002
- disconf_zookeeper:zkhost
- disconf_mysql:mysqlhost
restart: always
disconf_nginx:
image: conf_nginx:0.0.1
links:
- disconf_tomcat:tomcathost
ports:
- "80:80"
restart: always

按照我们最初梳理的依赖关系,启动两个redis官方镜像,一个zookeeper官方镜像,再启动定制的msyql镜像,然后tomcat启动并通过link关联redis,zookeeper,mysql等容器,最后是定制的nginx启动,link关联tomcat,并且nginx容器的80端口映射到当前电脑的80端口;

启动所有容器###

在docker-compose.yml文件所在的目录下,执行命令:

docker-compose up -d

终端会显示正在启动各个容器,如下图,每个容器的名称会被docker-compose加上前缀和后缀:

tomcat的应用启动需要一点时间,我们可以通过docker logs -f disconf_disconf_tomcat_1命令来查看tomcat启动日志,disconf_disconf_tomcat_1是容器名称,如上图中的红框所示。

启动完毕后,在浏览器上输入localhost,可以看见熟悉的disconf登录页面,用户名admin,密码admin,登录进去试试吧:

至此,disconf环境搭建三部曲已经结束,从体验到亲手一步一步配置都经历了,我们可以按照自己的要求为自己定制一个disconf环境了。

后面的文章中,我们一起来实战一下disconf系统的使用吧,体验一下动态配置给业务带来的便利。

欢迎关注我的公众号

Docker搭建disconf环境,三部曲之三:细说搭建过程的更多相关文章

  1. Docker搭建disconf环境,三部曲之一:极速搭建disconf

    Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...

  2. Docker搭建disconf环境,三部曲之二:本地快速构建disconf镜像

    Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...

  3. Docker下实战zabbix三部曲之三:自定义监控项

    通过上一章<Docker下实战zabbix三部曲之二:监控其他机器>的实战,我们了解了对机器的监控是通过在机器上安装zabbix agent来完成的,zabbix agent连接上zabb ...

  4. 在ubuntu上搭建开发环境4---ubuntu简单的搭建LAMP环境和配置

    最近重新安装了Ubuntu,但是之前的LAMP环境自然也就没有了,实在是不想再去编译搭建LAMP环境(这种方法实在是太费时间,而且太容易遇到各种不知道为什么的错误),所以,就去查查有没有什么简单的搭建 ...

  5. Docker下dubbo开发三部曲之三:java开发

    在前两章<Docker下dubbo开发,三部曲之一:极速体验>和<Docker下dubbo开发,三部曲之二:本地环境搭建>中,我们体验了dubbo环境搭建以及服务的发布和消费, ...

  6. deepin/ubuntu下搭建Jekyll环境

    title: deepin/ubuntu下搭建Jekyll环境 最近用github搭建了个博客,正好也学习一下markdown语法,由于markdown写完后不是立即可见,所以每次写完文章都要经过在线 ...

  7. LVS+keepalived快速搭建测试环境

    #LVS+keepalived快速搭建测试环境 #LVS+keepalived快速搭建测试环境 #centos6 X64 # LVS 负载均衡模式:DR(直接路由) 192.168.18.31 mas ...

  8. •搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机

    本节所讲内容: 实战:搭建LAMP环境及快速部署双网站并实现基于域名的虚拟主机 LAMP架构:??? Linux+Apache+Mysql+PHP Linux+Apache+Mysql/MariaDB ...

  9. linux下搭建oh-my-zsh环境

    目标:因为用习惯了zsh的shell环境,所以习惯在服务器上也搭建zsh环境,但是每次搭建都需要Google每一步骤,感觉很麻烦,所以决定记录一下,免得一次次查 1. 安装zsh zsh是一款shel ...

随机推荐

  1. Go包管理工具dep

    dep是一个golang依赖管理工具,需要在Go 1.7及更高的版本中使用. 1. 安装 安装dep工具的方式有很多种,如果是mac电脑的话,只需要如下命令: brew install dep 对于L ...

  2. C++这么难,为什么还要学习C++呢?如何学?

    在大多数开发或者准开发人员的认识中,C/C++ 是一门非常难的编程语言,很多人知道它的强大,但因为认为“难”造成的恐惧让很多人放弃. 这个世界本来就是残酷的,所以你不能怪C++向你展示了世界的本质 大 ...

  3. EXP查询合集提权后渗透必备

    0x00 整理的一些后渗透提权需要用到的一些漏洞,后渗透提权的时候可以看一下目标机那些补丁没打,再进行下一步渗透提权. 0x01 CVE-2019-0803 [An elevation of priv ...

  4. 一文看懂ConstraintLayout的用法

    ConstraintLayout 相对于 RelativeLayout来说性能更好,布局上也更加灵活.在最新的Google Android开发文档中是推荐使用 ConstraintLayout的,下面 ...

  5. 如何用Python实现敏感词的过滤

    题目要求如下: 从文件解析敏感词,从终端获取用户输入.根据敏感词对用户输入进行过滤.这里过滤需要考虑不止一个过滤词:即将读取的所有过滤词,放进一个列表,用屏蔽词检索用户输入,如果有屏蔽词,则将其替换为 ...

  6. es6 个人笔记

           1.package.json==>npm init node_modules==>npm install webpack -D webpack.config.js==> ...

  7. SpringBoot电商项目实战 — Redis实现分布式锁

    最近有小伙伴发消息说,在Springboot系列文第二篇,zookeeper是不是漏掉了?关于这个问题,其实我在写第二篇的时候已经考虑过,但基于本次系列文章是实战练习,在项目里你能看到Zookeepe ...

  8. springboot中springAOP的使用

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...

  9. Python学习 之 计算机基础

    第一章 计算机基础 1.1 硬件 计算机基本的硬件由:CPU / 内存 / 主板 / 硬盘 / 网卡 / 显卡 等组成,只有硬件但硬件之间无法进行交流和通信 1.2 操作系统 操作系统用于协同或控制硬 ...

  10. Shell总结2

    1.---------->>sed命令用来取指定范围行. 2.--------------->>>>“$?“返回值的用法 (1)判断命令.脚本或函数等程序是否执行成 ...