如何容器化部署Disconf统一配置服务

一、环境描述

1. 宿主机

  • CPU:双核
  • 内存:4 GB
  • 硬盘:120 GB
  • IP地址:192.168.190.128
  • 操作系统:CentOS 7.4 x86_64 Minimal

2. Docker

3. MySQL

4. Redis

5. Zookeeper

6. Disconf后端

7. Disconf前端

二、拉取镜像

在shell中运行以下命令,拉取Disconf各个组件的Docker镜像:

# 拉取MySQL镜像
docker pull registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-mysql:5.7.21
# 拉取Redis镜像
docker pull registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-redis:4.0.9
# 拉取Zookeeper镜像
docker pull registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-zookeeper:3.4.11
# 拉取Disconf后端镜像
docker pull registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-disconf-backend:latest
# 拉取Disconf前端镜像
docker pull registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-disconf-frontend:latest

三、克隆配置文件

在shell中运行以下命令,从GitHub克隆各个组件的配置文件:

yum install -y git
cd /root/Downloads
git clone https://github.com/ghoulich/docker.git

这些配置文件在启动各个组件的容器时会用到!

四、获取宿主机IP地址

由于各个组件都是在相同的宿主机上运行的,所以在启动Disconf应用时,需要将各个组件的IP地址配置为本机的IP地址。在shell中运行以下命令,获取本机IP地址:

cd /root/Downloads
cat > getip.sh << "EOF"
#! /bin/bash
ifconfig $1 | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | tr -d "addr:"
EOF
chmod 755 getip.sh
host_ip=$(./getip.sh ens33)

五、部署MySQL容器

1. 为MySQL准备配置文件

在shell中运行以下命令,为MySQL容器创建数据、日志和配置目录,然后将配置文件拷贝至相应的目录:

mkdir -p /usr/local/mysql/{data,log,config}
touch /usr/local/mysql/log/mysqld.log
cp /root/Downloads/docker/mysql/my.cnf /usr/local/mysql/config/
chown -R 27:27 /usr/local/mysql

注意,27:27是MySQL容器中的mysql用户的UID和GID,宿主机没有这个用户。

2. 启动MySQL容器

在shell中运行以下命令:

docker run --detach \
    --name mysql \
    --hostname mysql \
    --volume /usr/local/mysql/log/mysqld.log:/var/log/mysqld.log \
    --volume /usr/local/mysql/config/my.cnf:/etc/my.cnf \
    --volume /usr/local/mysql/data:/var/lib/mysql \
    --publish 3306:3306 \
    registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-mysql:5.7.21

有几个选项需要说明:

  • --volume:将MySQL容器的数据、配置和日志目录映射至宿主机的相应目录;
  • --publish:将MySQL容器的3306端口映射至宿主机的3306端口。

3. 修改初始密码

首次启动MySQL容器时,会生成一个初始密码。在shell中运行以下命令,修改初始密码,并且开启远程访问权限:

# 获取初始密码
init_passwd=$(sed -rn 's/^(.*)(root@localhost: )(.*)$/\3/p' /usr/local/mysql/log/mysqld.log)
# 修改初始密码
docker exec -it mysql mysql --user=root --password=${init_passwd} --connect-expired-password --execute="ALTER USER 'root'@'localhost' IDENTIFIED BY '123.Org$%^';"
# 开启远程访问权限
docker exec -it mysql mysql --user=root --password=123.Org$%^ --execute="GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123.Org$%^' WITH GRANT OPTION;"
docker exec -it mysql mysql --user=root --password=123.Org$%^ --execute="FLUSH PRIVILEGES;"

4. 初始化Disconf数据库

在shell中运行以下命令,初始化数据库:

cd /root/Downloads/docker/disconf/
tar xvzf sql.tar.gz
docker exec -i mysql mysql --user=root --password=123.Org$%^ < sql/0-init_table.sql
docker exec -i mysql mysql --user=root --password=123.Org$%^ --database=disconf < sql/1-init_data.sql
docker exec -i mysql mysql --user=root --password=123.Org$%^ --database=disconf < sql/201512/20151225.sql
docker exec -i mysql mysql --user=root --password=123.Org$%^ --database=disconf < sql/20160701/20160701.sql

5. 验证

在shell中运行以下命令,列出disconf数据库的所有表:

docker exec -it mysql mysql --user=root --password=123.Org$%^ --database=disconf -e "show tables;"

若返回信息如下图所示,则MySQL容器部署成功:

查看disconf数据库

六、部署Redis容器

1. 为Redis准备配置文件

在shell中运行以下命令,为Redis容器创建配置和日志目录,然后将配置文件拷贝至相应的目录:

mkdir -p /usr/local/redis/{conf,logs}
cp /root/Downloads/docker/redis/redis.conf /usr/local/redis/conf/
chown -R 499:499 /usr/local/redis

注意,499:499是Redis容器中的redis用户的UID和GID,宿主机没有这个用户。

2. 启动Redis容器

在shell中运行以下命令:

docker run --detach \
    --name redis \
    --hostname redis \
    --volume /usr/local/redis/conf:/etc/redis \
    --volume /usr/local/redis/logs:/var/log/redis \
    --publish 6379:6379 \
    registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-redis:4.0.9

有几个选项需要说明:

  • --volume:将Redis容器的数据、配置和日志目录映射至宿主机的相应目录;
  • --publish:将Redis容器的6379端口映射至宿主机的6379端口。

3. 验证

在shell中运行以下命令,查看服务器信息:

docker exec -it redis redis-cli -h 127.0.0.1 -p 6379 info server

若返回信息如下图所示,则Redis容器部署成功:

检查Redis服务器状态

七、部署Zookeeper容器

1. 为Zookeeper准备配置文件

在shell中运行以下命令,为Zookeeper容器创建数据、配置和日志目录,然后将配置文件拷贝至相应的目录:

mkdir -p /usr/local/zookeeper/{data,conf,logs}
cp /root/Downloads/docker/zookeeper/{zoo.cfg,configuration.xsl,log4j.properties} /usr/local/zookeeper/conf/

2. 启动Zookeeper容器

在shell中运行以下命令:

docker run --detach \
    --name zookeeper \
    --hostname zookeeper \
    --volume /usr/local/zookeeper/data:/var/lib/zookeeper \
    --volume /usr/local/zookeeper/conf:/usr/local/zookeeper/conf \
    --volume /usr/local/zookeeper/logs:/usr/local/zookeeper/logs \
    --publish 2181:2181 \
    registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-zookeeper:3.4.11

有几个选项需要说明:

  • --volume:将Zookeeper容器的数据、配置和日志目录映射至宿主机的相应目录;
  • --publish:将Zookeeper容器的2181端口映射至宿主机的2181端口。

3. 验证

在shell中运行以下命令,通过telnet连接宿主机的2181端口:

yum install -y telnet
telnet localhost 2181

若返回信息如下图所示,则Zookeeper容器部署成功:

通过telnet连接Zookeeper端口

八、部署Disconf后端容器

1. 为Tomcat准备配置文件

Disconf后端服务是由Tomcat运行的。在shell中运行以下命令,为Disconf后端容器创建配置和日志目录,然后修改应用的目录:

yum install -y wget
mkdir -p /usr/local/disconf-backend
cd /root/Downloads
wget http://mirrors.advancedhosters.com/apache/tomcat/tomcat-9/v9.0.6/bin/apache-tomcat-9.0.6.tar.gz
tar xvzf apache-tomcat-9.0.6.tar.gz
cp -r /root/Downloads/apache-tomcat-9.0.6/{conf,logs} /usr/local/disconf-backend/
sed -i '150a\      <Context path="" docBase="/usr/local/tomcat/webapps/disconf-web"></Context>' /usr/local/disconf-backend/conf/server.xml

2. 配置Disconf后端

在shell中运行以下命令,配置Disconf后端服务:

cd /root/Downloads/docker/disconf/
tar xvzf resources.tar.gz
rm -rf resources.tar.gz
cd resources
2.1 修改jdbc-mysql.properties文件

配置Disconf的jdbc连接:

sed -i "3s/127.0.0.1:3306/$host_ip:3306/g" jdbc-mysql.properties
sed -i '5s\123456\123.Org$%^\g' jdbc-mysql.properties
2.2 修改redis-config.properties文件

配置Disconf的redis连接:

sed -i "4s/redis.group1.client1.host=127.0.0.1/redis.group1.client1.host=$host_ip/g" redis-config.properties
sed -i "10s/redis.group1.client2.host=127.0.0.1/redis.group1.client2.host=$host_ip/g" redis-config.properties
sed -i '7s\password=foobared\password=\g' redis-config.properties
sed -i '13s\password=foobared\password=\g' redis-config.properties
sed -i '11s\port=6380\port=6379\g' redis-config.properties
2.3 修改zoo.properties文件

配置Disconf的Zookeeper连接:

sed -i "2s/hosts=127.0.0.1:8581,127.0.0.1:8582,127.0.0.1:8583/hosts=$host_ip:2181/g" zoo.properties
2.4 修改application.properties文件

修改Disconf后端的应用配置:

sed -i "6s/domain=disconf.com/domain=$host_ip/g" application.properties

3. 启动Disconf后端容器

在shell中运行以下命令,启动Disconf后端容器:

docker run --detach \
    --name disconf-backend \
    --hostname disconf-backend \
    --volume /usr/local/disconf-backend/conf:/usr/local/tomcat/conf \
    --volume /usr/local/disconf-backend/logs:/usr/local/tomcat/logs \
    --expose 8080 \
    registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-disconf-backend:latest

需要注意以下几点:

  • 开放容器的8080端口,但不映射至宿主机;
  • 将容器的配置目录和日志目录映射至宿主机的相应目录。

4. 替换配置文件

由于Disconf要根据实际部署情况连接MySQL、Redis和Zookeeper等外围组件,所以应用配置必须可配置。在shell中运行以下命令,替换应用配置文件:

cd /root/Downloads/docker/disconf/resources/
# 替换应用配置
docker cp application.properties disconf-backend:/usr/local/tomcat/webapps/disconf-web/WEB-INF/classes/application.properties
# 替换jdbc配置
docker cp jdbc-mysql.properties disconf-backend:/usr/local/tomcat/webapps/disconf-web/WEB-INF/classes/jdbc-mysql.properties
# 替换redis配置
docker cp redis-config.properties disconf-backend:/usr/local/tomcat/webapps/disconf-web/WEB-INF/classes/redis-config.properties
# 替换zookeeper配置
docker cp zoo.properties disconf-backend:/usr/local/tomcat/webapps/disconf-web/WEB-INF/classes/zoo.properties

5. 重启容器

必须重启容器,才能使得应用配置生效:

docker restart disconf-backend

6. 获取Disconf后端容器的IP地址

部署Disconf前端服务时,nginx需要将后端请求转发至后端容器,所以需要获取Disconf后端容器的IP地址。在shell中运行以下命令:

cd /root/Downloads
cat > gettomcatip.sh << "EOF"
#! /bin/bash
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $1
EOF
chmod 755 gettomcatip.sh
tomcat_ip=$(./gettomcatip.sh disconf-backend)

7. 验证

在shell中运行以下命令,通过telnet连接Disconf后端容器的8080端口:

telnet $tomcat_ip 8080

若返回信息如下图所示,则Disconf后端容器部署成功:

通过telnet连接disconf后端服务端口

九、部署Disconf前端容器

1. 创建Disconf站点配置文件

在shell中运行以下命令,创建站点配置文件:

cd /root/Downloads
cat > disconf.conf << EOF
upstream disconf {
    server ${tomcat_ip}:8080;
}

server {

    listen   8080;
    server_name $host_ip;
    access_log /var/log/nginx/disconf_access.log;
    error_log /var/log/nginx/disconf_error.log;

    location / {
        root /var/lib/nginx/disconf;
        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;
    }
}
EOF

2. 为Nginx准备配置文件

Disconf前端服务是由Nginx运行的。在shell中运行以下命令,为Disconf前端容器创建配置和日志目录,然后将配置文件拷贝至相应的目录:

mkdir -p /usr/local/disconf-frontend/{conf,logs}
mkdir -p /usr/local/disconf-frontend/conf/conf.d
chown -R 499:499 /usr/local/disconf-frontend/logs
cp /root/Downloads/docker/nginx/{nginx.conf,mime.types} /usr/local/disconf-frontend/conf/
cp /root/Downloads/disconf.conf /usr/local/disconf-frontend/conf/conf.d/

3. 启动Disconf前端容器

在shell中运行以下命令:

docker run --detach \
    --name disconf-frontend \
    --hostname disconf-frontend \
    --volume /usr/local/disconf-frontend/conf:/etc/nginx \
    --volume /usr/local/disconf-frontend/logs:/var/log/nginx \
    --publish 8080:8080 \
    registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-disconf-frontend:latest

需要注意以下几点:

  • 将容器的8080端口映射至宿主机的8080端口。
  • 将容器的配置目录和日志目录映射至宿主机的相应目录。

4. 验证

在shell中运行以下命令,通过telnet连接宿主机的8080端口:

telnet $host_ip 8080

若返回信息如下图所示,则Disconf前端容器部署成功:

通过telnet连接disconf前端服务接口

十、验证测试

在浏览器中访问以下URL:

http://192.168.190.128:8080

能够看到Disconf的首页,如下图所示:

disconf首页

登录Disconf系统,默认的用户名和密码都是admin,登录后如下图所示:

登录disconf控制台

Disconf默认有一个名为disconf_demo的示例应用,可以查看它的配置项,如下图所示:

查看disconf_demo项目的配置

至此,Disconf的容器化部署已经全部完成了,后续还可以利用docker-compose编排部署各个组件的容器!