制作Disconf后端的Docker镜像详解

一、环境描述

1. 宿主机

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

2. Docker

3. 基础镜像

二、构建镜像

1. 安装Git和Wget

在shell中运行以下命令:

yum install -y git wget

2. 克隆Disconf的打包文件

从GitHub克隆编译得到的Disconf打包文件,可参考《编译和打包Disconf详解》。在shell中运行以下命令:

cd /root/Downloads
git clone https://github.com/ghoulich/docker.git
cd docker/disconf

3. 创建Dockerfile文件

在shell中运行以下命令:

cat > Dockerfile << "EOF"
# 使用自建的CentOS 6.9基础镜像
FROM registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos:6.9

# 镜像维护者
MAINTAINER ghoulich@aliyun.com

# 安装依赖包
RUN rpm --rebuilddb && yum install -y epel-release
RUN rpm --rebuilddb && yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel gcc autoconf wget supervisor tar

# 下载安装Tomcat
RUN wget http://mirrors.advancedhosters.com/apache/tomcat/tomcat-9/v9.0.6/bin/apache-tomcat-9.0.6.tar.gz
RUN tar xvzf apache-tomcat-9.0.6.tar.gz
RUN rm -rf apache-tomcat-9.0.6.tar.gz
RUN mv apache-tomcat-9.0.6 /usr/local/tomcat

# 配置环境变量
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-3.b14.el6_9.x86_64
ENV CATALINA_HOME /usr/local/tomcat

# 编译安装jsvc
RUN cd /usr/local/tomcat/bin && tar xvfz commons-daemon-native.tar.gz
RUN cd /usr/local/tomcat/bin/commons-daemon-1.1.0-native-src/unix/ && ./configure && make
RUN cp /usr/local/tomcat/bin/commons-daemon-1.1.0-native-src/unix/jsvc /usr/local/tomcat/bin/
COPY supervisord.conf /etc/supervisord.conf

## 安装disconf后端
COPY disconf-web.tar.gz* /
RUN cat disconf-web.tar.gz* | tar -xzf - && mv disconf-web.war /usr/local/tomcat/webapps && rm -rf disconf-web.tar.gz*

# 清理系统
RUN yum clean all

# 开放端口
EXPOSE 8080

# 挂载配置和日志目录
VOLUME ["/usr/local/tomcat/conf", "/usr/local/tomcat/logs"]

# 自动启动Tomcat
CMD ["/usr/bin/supervisord"]
EOF

有以下几点需要注意:

  • 基于自建的CentOS 6.9基础镜像。
  • 开放8080端口,这是Tomcat的默认服务端口。
  • 将Tomcat的配置目录和日志目录设置为挂载点。

4. 创建supervisor配置文件

supervisor是一种Linux的进程管理工具,Disconf后端容器会用其管理自身的后台服务。在shell中运行以下命令,创建supervisord.conf文件:

cat > supervisord.conf << "EOF"
[supervisord]
nodaemon=true

[program:tomcat]
command=/usr/local/tomcat/bin/jsvc -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -outfile /usr/local/tomcat/logs/catalina.out -errfile /usr/local/tomcat/logs/catalina.err -Dcatalina.home=/usr/local/tomcat -Dcatalina.base=/usr/local/tomcat -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties org.apache.catalina.startup.Bootstrap
EOF

5. 制作镜像

在shell中运行以下命令:

docker build -t disconf-backend:latest .

6. 上传镜像

在shell中运行以下命令,登录阿里云的镜像库,然后为新建镜像创建标签,最后推送至镜像库:

# 登录阿里云镜像库
docker login --username=ghoulich@aliyun.com registry.cn-hangzhou.aliyuncs.com
# 创建镜像标签
docker tag disconf-backend:latest registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-disconf-backend:latest
# 推送镜像
docker push registry.cn-hangzhou.aliyuncs.com/ghoulich-centos/centos-6.9-disconf-backend:latest

三、使用方法

1. 配置Tomcat服务

在shell中运行以下命令,为Tomcat服务新建配置目录和日志目录,并且修改服务器的应用目录:

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文件

假设MySQL和Disconf在相同的宿主机中运行:

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

假设Redis和Disconf在相同的宿主机中运行:

sed -i '4s\redis.group1.client1.host=127.0.0.1\redis.group1.client1.host=192.168.190.128\g' redis-config.properties
sed -i '10s\redis.group1.client2.host=127.0.0.1\redis.group1.client2.host=192.168.190.128\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文件

假设Zookeeper和Disconf在相同的宿主机中运行:

sed -i '2s\hosts=127.0.0.1:8581,127.0.0.1:8582,127.0.0.1:8583\hosts=192.168.190.128:2181\g' zoo.properties
2.4 修改application.properties文件

使用宿主机的IP地址作为Disconf的域名:

sed -i '6s\domain=disconf.com\domain=192.168.190.128\g' application.properties

3. 启动容器

在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中运行以下命令,替换应用配置文件:

# 替换应用配置
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. 重启容器

重新启动Disconf后端容器,使得各项配置生效:

docker restart disconf-backend