Docker 下的 disconf 实战全文链接
《Docker 搭建 disconf 环境, 三部曲之一: 极速搭建 disconf》;
《Docker 搭建 disconf 环境, 三部曲之二: 本地快速构建 disconf 镜像》;
《Docker 搭建 disconf 环境, 三部曲之三: 细说搭建过程》;
《Docker 下使用 disconf: 极速体验》;
《Docker 下使用 disconf: 细说 demo 开发》;
细说搭建过程
在前两章中, 我们利用远程或本地的镜像, 快速体验了本地启动 disconf 的过程, 本章我们一起来分析和梳理整个定制和搭建过程, 了解这些后, 我们就能根据自己的需要来定制本地的 disconf 环境了.
以下两点请注意
本机环境已经安装了 maven, 并且把 maven 的 bin 目录配置到环境变量 PATH 下;
编译编译 disconf 源码时, 要用到官方 shell 脚本, 所以本次实践的操作系统建议用 Linux 或 Mac, 如果用 Windows, 有三种方法: 一个是把 shell 改成 bat 脚本, 一个是用虚拟机的 Linux, 还有一种是用在 docker 上搭建一个 maven 容器, 把 disconf 源码放在这个容器下编译;
先分析再实战
首先把 disconf 环境依赖的所有 server 都列出来:
Redis < 无需定制, 用官方镜像 >
zookeeper < 无需定制, 用官方镜像 >
MySQL < 定制, 创建库, 表, 导入初始化数据 >
tomcat < 定制, 包含业务 war 包, 路径配置 >
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》一文, 这里简单说一下步骤:
打开 disconf 源码文件夹, 在 disconf/disconf-Web/sql 目录下找到以下四个文件:
- 0-init_table.sql
- 1-init_data.sql
- 201512/20151225.sql
- 20160701/20160701.sql
新建一个目录 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 脚本文件
在 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
打开终端在 MySQL 目录下执行以下命令, 构建 msql 镜像:
docker build -t conf_mysql:0.0.1 .
msql 镜像构建成功
定制 tomcat 镜像
构建 tomcat 镜像时最重要的就是 war 包的生成, 步骤如下:
创建两个文件夹, 分别设置到 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 都是刚刚新建的文件夹;
打开 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 "%r" %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 镜像
新建一个 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 文件夹;
在环境变量 WAR_ROOT_PATH 对应的目录下, 有个 HTML 文件夹如下图红框位置, 这是 Web 工程全部静态文件, 把这个文件夹复制到刚才新建的 nginx 目录下:
在 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
现在打开终端在 nginx 目录下执行以下命令, 构建 nginx 镜像:
docker build -t conf_nginx:0.0.1 .
nginx 镜像构建成功!
编写 docker-compose 脚本
新增一个 docker-compose.YAML 文件 (位置无所谓), 内容如下:
- 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.YAML 文件所在的目录下, 执行命令:
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 系统的使用吧, 体验一下动态配置给业务带来的便利.
来源: https://www.cnblogs.com/bolingcavalry/p/11510255.html