Docker搭建disconf环境三部曲之三细说搭建过程

26次阅读

共计 8933 个字符,预计需要花费 23 分钟才能阅读完成。

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<<font color=”red”> 定制 </font>,创建库,表,导入初始化数据 >
  4. tomcat<<font color=”red”> 定制 </font>,包含业务 war 包,路径配置 >
  5. nginx<<font color=”red”> 定制 </font>,配置动静分离,包含静态 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. 创建两个文件夹,分别设置到 <font color=”red”>ONLINE_CONFIG_PATH</font> 和 <font color=”red”>WAR_ROOT_PATH</font> 这两个环境变量中,环境变量的设置方式在不同的操作系统下各不相同,我用的是 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

<font color=”red”>/Users/zq2599/temp/201705/03/005/online-resources</font> 和 <font color=”red”>/Users/zq2599/temp/201705/03/005/war</font> 都是刚刚新建的文件夹;

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

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

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

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

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

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

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

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

sh deploy/deploy.sh

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

新建一个名叫 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. 在环境变量 <font color=”red”>WAR_ROOT_PATH</font> 对应的目录下,有个 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 系统的使用吧,体验一下动态配置给业务带来的便利。

欢迎关注我的公众号

正文完
 0