背景
公司多套基础环境需要进行部署,服务需要容器化,需要给开发人员提供基础镜像,后续将所有服务改造为容器化,方便资源管理、快捷部署、快速扩容等
Docker镜像制作
基础镜像制作
因为公司使用的均为Centos操作系统,故基础镜像选为最小化安装的Centos,需要为其他团队Base镜像,让其他团队进行其他的拓展
基础Centos镜像制作
目标:提供一个基础镜像(最小化安装),参考开源的Centos镜像即可(建议删除不用的配置),安装sshd服务,方便后续开发人员进行问题排查
Dockerfile
FROM system/base/centos7:v2023031302
MAINTAINER xxx xxx@xxx.com
USER root
#
ADD supervisord.conf /etc/supervisord.conf
ADD sshd.ini /etc/supervisord.d/sshd.ini
#
EXPOSE 2022
#
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
sshd.ini
[program:sshd]
command=/usr/sbin/sshd -D ; the program (relative uses PATH, can take args)
process_name=%(program_name)s ; process_name expr (default %(program_name)s)
numprocs=1 ; number of processes copies to start (def 1)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; retstart at unexpected quit (default: true)
Nginx镜像制作
FROM system/base/centos7:v2023031303
MAINTAINER xxx xxx@xxx.com
# 定义服务启动用户
USER root
# YUM 安装依赖
RUN yum -y install psmisc gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel bash-completion automake libxml2 libxml2-devel libxslt libxslt-devel perl perl-ExtUtils-Embed && yum clean all
# 安装服务
ADD packages/nginx-src /usr/local/nginx-src
WORKDIR /usr/local/nginx-src
RUN useradd nginx && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module && make && make install && mkdir -p /usr/local/nginx/conf/conf.d && mkdir -p /var/log/nginx/
# 添加服务配置文件
ADD nginx.conf /usr/local/nginx/conf/nginx.conf
#添加区域配置文件
ADD ops-project.conf /usr/local/nginx/conf/conf.d/ops-project.conf
# 添加服务启动文件
# ADD supervisord.conf /etc/supervisord.conf
ADD nginx.ini /etc/supervisord.d/nginx.ini
# 工作目录
WORKDIR /usr/local/nginx
# 添加暴露端口
EXPOSE 80
# 容器前台进程
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
JDK镜像制作
FROM system/base/centos7:v2023031303
MAINTAINER xxx xxx@xxx.com
# 定义服务启动用户
USER root
# 安装服务
ADD packages/jdk /usr/local/jdk
WORKDIR /root/
#添加区域配置文件
RUN echo "export JAVA_HOME=/usr/local/jdk" >> /etc/profile && echo "export PATH=\$JAVA_HOME/bin:$PATH" >> /etc/profile && echo "export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar" >> /etc/profile
RUN source /etc/profile && ln -s /usr/local/jdk/bin/java /usr/bin/
# 容器前台进程
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
zookeeper镜像制作
FROM system/base/jdk1.8:v2023031301
MAINTAINER xxx xxx@xxx.com
# 定义服务启动用户
USER root
# YUM 安装依赖
# NULL
# 安装服务
ADD packages/zookeeper /usr/local/zookeeper
# 添加服务启动文件
ADD start.sh /usr/local/zookeeper/bin/start.sh
ADD zookeeper.ini /etc/supervisord.d/zookeeper.ini
RUN chmod a+x /usr/local/zookeeper/bin/start.sh
# 工作目录
WORKDIR /usr/local/zookeeper
# 添加暴露端口
EXPOSE 2181
EXPOSE 2888
EXPOSE 3888
# 容器前台进程
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
/usr/local/zookeeper/bin/start.sh #配置初始化脚本,脚本内容如下,此为容器部署,k8s部署需要进行脚本内容修改
#!/usr/bin/env bash
ZK_LOG_LEVEL=${ZK_LOG_LEVEL:-"INFO"} #定义日志级别,在 log4j.properties
ZK_DATA_DIR=${ZK_DATA_DIR:-"/tmp/data_dir"} #数据路径
ZK_DATA_LOG_DIR=${ZK_DATA_LOG_DIR:-"/tmp/log_dir"} #日志路径
ZK_LOG_DIR=${ZK_LOG_DIR:-"/tmp/logs"} #服务日志路径
ZK_CONF_DIR=${ZK_CONF_DIR:-"/usr/local/zookeeper/conf"} # 配置文件路径
ZK_BIN_DIR=${ZK_BIN_DIR:-"/usr/local/zookeeper/bin"} # 配置文件路径
ZK_CLIENT_PORT=${ZK_CLIENT_PORT:-2181} #Client Port
ZK_SERVER_PORT=${ZK_SERVER_PORT:-2888} #Server Port
ZK_ELECTION_PORT=${ZK_ELECTION_PORT:-3888} # ELECTION_PORT
ZK_TICK_TIME=${ZK_TICK_TIME:-2000}
ZK_INIT_LIMIT=${ZK_INIT_LIMIT:-10}
ZK_SYNC_LIMIT=${ZK_SYNC_LIMIT:-5}
ZK_HEAP_SIZE=${ZK_HEAP_SIZE:-2G}
ZK_MAX_CLIENT_CNXNS=${ZK_MAX_CLIENT_CNXNS:-1000} #change
ZK_MIN_SESSION_TIMEOUT=${ZK_MIN_SESSION_TIMEOUT:- $((ZK_TICK_TIME*2))}
ZK_MAX_SESSION_TIMEOUT=${ZK_MAX_SESSION_TIMEOUT:- $((ZK_TICK_TIME*20))}
ZK_SNAP_RETAIN_COUNT=${ZK_SNAP_RETAIN_COUNT:-3}
ZK_PURGE_INTERVAL=${ZK_PURGE_INTERVAL:-0}
ID_FILE="$ZK_DATA_DIR/myid"
ZK_CONFIG_FILE="$ZK_CONF_DIR/zoo.cfg"
LOGGER_PROPS_FILE="$ZK_CONF_DIR/log4j.properties"
MY_ID=${MY_ID:-1} #单容器必须配置
ZK_REPLICAS=${ZK_REPLICAS:-3} #默认是三个
##定义zk host
ZK_SERVER1=${ZK_SERVER1:-"zookeeper-zookeeper-1"}
ZK_SERVER2=${ZK_SERVER2:-"zookeeper-zookeeper-2"}
ZK_SERVER3=${ZK_SERVER3:-"zookeeper-zookeeper-3"}
SERVER_TYPE=
# JAVA_ENV_FILE="$ZK_CONF_DIR/java.env"
HOST=`hostname -s`
DOMAIN=`hostname -d`
## k8s 里面添加短域名
function print_servers() {
for (( i=1; i<=$ZK_REPLICAS; i++ ))
do
## k8s 变量
# echo "server.$i=$NAME-$((i-1)).$DOMAIN:$ZK_SERVER_PORT:$ZK_ELECTION_PORT"
echo "server.$i=zookeeper-zookeeper-$i:$ZK_SERVER_PORT:$ZK_ELECTION_PORT"
done
}
function validate_env() {
echo "Validating environment"
if [ -z $ZK_REPLICAS ]; then
echo "ZK_REPLICAS is a mandatory environment variable"
exit 1
fi
# if [[ $HOST =~ (.*)-([0-9]+)$ ]]; then
# NAME=${BASH_REMATCH[1]}
# ORD=${BASH_REMATCH[3]}
# else
# echo "Failed to extract ordinal from hostname $HOST"
# exit 1
# fi
# MY_ID=$((ORD+1))
MY_ID=$MY_ID
echo "ZK_REPLICAS=$ZK_REPLICAS"
echo "MY_ID=$MY_ID"
echo "ZK_LOG_LEVEL=$ZK_LOG_LEVEL"
echo "ZK_DATA_DIR=$ZK_DATA_DIR"
echo "ZK_DATA_LOG_DIR=$ZK_DATA_LOG_DIR"
echo "ZK_LOG_DIR=$ZK_LOG_DIR"
echo "ZK_CLIENT_PORT=$ZK_CLIENT_PORT"
echo "ZK_SERVER_PORT=$ZK_SERVER_PORT"
echo "ZK_ELECTION_PORT=$ZK_ELECTION_PORT"
echo "ZK_TICK_TIME=$ZK_TICK_TIME"
echo "ZK_INIT_LIMIT=$ZK_INIT_LIMIT"
echo "ZK_SYNC_LIMIT=$ZK_SYNC_LIMIT"
echo "ZK_MAX_CLIENT_CNXNS=$ZK_MAX_CLIENT_CNXNS"
echo "ZK_MIN_SESSION_TIMEOUT=$ZK_MIN_SESSION_TIMEOUT"
echo "ZK_MAX_SESSION_TIMEOUT=$ZK_MAX_SESSION_TIMEOUT"
echo "ZK_HEAP_SIZE=$ZK_HEAP_SIZE"
echo "ZK_SNAP_RETAIN_COUNT=$ZK_SNAP_RETAIN_COUNT"
echo "ZK_PURGE_INTERVAL=$ZK_PURGE_INTERVAL"
# echo "ENSEMBLE"
print_servers
echo "Environment validation successful"
}
function create_config() {
rm -f $ZK_CONFIG_FILE
echo "Creating ZooKeeper configuration"
echo "#This file was autogenerated by k8szk DO NOT EDIT" >> $ZK_CONFIG_FILE
echo "clientPort=$ZK_CLIENT_PORT" >> $ZK_CONFIG_FILE
echo "dataDir=$ZK_DATA_DIR" >> $ZK_CONFIG_FILE
echo "dataLogDir=$ZK_DATA_LOG_DIR" >> $ZK_CONFIG_FILE
echo "tickTime=$ZK_TICK_TIME" >> $ZK_CONFIG_FILE
echo "initLimit=$ZK_INIT_LIMIT" >> $ZK_CONFIG_FILE
echo "syncLimit=$ZK_SYNC_LIMIT" >> $ZK_CONFIG_FILE
echo "maxClientCnxns=$ZK_MAX_CLIENT_CNXNS" >> $ZK_CONFIG_FILE
echo "minSessionTimeout=$ZK_MIN_SESSION_TIMEOUT" >> $ZK_CONFIG_FILE
echo "maxSessionTimeout=$ZK_MAX_SESSION_TIMEOUT" >> $ZK_CONFIG_FILE
echo "autopurge.snapRetainCount=$ZK_SNAP_RETAIN_COUNT" >> $ZK_CONFIG_FILE
echo "autopurge.purgeInterval=$ZK_PURGE_INTERVAL" >> $ZK_CONFIG_FILE
echo "4lw.commands.whitelist=*" >> $ZK_CONFIG_FILE
echo "quorumListenOnAllIPs=true" >> $ZK_CONFIG_FILE
if [ $ZK_REPLICAS -gt 1 ]; then
print_servers >> $ZK_CONFIG_FILE
fi
echo "Wrote ZooKeeper configuration file to $ZK_CONFIG_FILE"
}
function create_data_dirs() {
echo "Creating ZooKeeper data directories and setting permissions"
if [ ! -d $ZK_DATA_DIR ]; then
mkdir -p $ZK_DATA_DIR
# chown -R $ZK_USER:$ZK_USER $ZK_DATA_DIR
fi
if [ ! -d $ZK_DATA_LOG_DIR ]; then
mkdir -p $ZK_DATA_LOG_DIR
# chown -R $ZK_USER:$ZK_USER $ZK_DATA_LOG_DIR
fi
if [ ! -d $ZK_LOG_DIR ]; then
mkdir -p $ZK_LOG_DIR
# chown -R $ZK_USER:$ZK_USER $ZK_LOG_DIR
fi
if [ ! -f $ID_FILE ]; then
echo $MY_ID >> $ID_FILE
fi
echo "Created ZooKeeper data directories"
}
function create_log_props () {
rm -f $LOGGER_PROPS_FILE
echo "Creating ZooKeeper log4j configuration"
echo "zookeeper.root.logger=CONSOLE" >> $LOGGER_PROPS_FILE
echo "zookeeper.console.threshold="$ZK_LOG_LEVEL >> $LOGGER_PROPS_FILE
echo "log4j.rootLogger=\${zookeeper.root.logger}" >> $LOGGER_PROPS_FILE
echo "log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender" >> $LOGGER_PROPS_FILE
echo "log4j.appender.CONSOLE.Threshold=\${zookeeper.console.threshold}" >> $LOGGER_PROPS_FILE
echo "log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout" >> $LOGGER_PROPS_FILE
echo "log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n" >> $LOGGER_PROPS_FILE
echo "Wrote log4j configuration to $LOGGER_PROPS_FILE"
}
function start_zk_server () {
bash $ZK_BIN_DIR/zkServer.sh start
}
validate_env && create_config && create_log_props && create_data_dirs && start_zk_server
镜像构建命令
docker build -t system/base/zookeeper-3.4.8-ondocker:v2023031301 .
k8s环境部署
- k8s环境部署
- nginx、mysql、zk、tomcat、mq、nacos、apollo 、redis部署
- ci、cd对接
- 监控对接