背景介绍
胖容器(Fat Container)是一种容器技术的形态,它在传统的轻量级容器基础上进行了扩展和增强。胖容器不仅包含了应用程序及其依赖项,还集成了大量的管理和调度组件,从而提供了更丰富的功能和更强大的性能。
Nginx是一款高性能的HTTP和反向代理web服务器
开发注意
制作一个完整的胖容器需要多人参与,每个人都得负责好自身编写的Dockerfile和Shell,经过环境测试后再合并进大的流程中。配置的读取应用、服务的启动顺序、依赖之间的关系都得把控,更重要的是关键日志的打印。
Nginx部分的编写,也是要先用FROM nginx:latest作为基础镜像测试完这部分业务流程后再合并进主Dockerfile,争取一遍过负责流程。
Nginx容器
编写Dockerfile制作Nginx镜像
# 使用官方的Nginx作为父镜像 FROM nginx:latest # 将业务dist复制进容器/usr/share/nginx/html/ COPY /opt/portal/dist /usr/share/nginx/html/ # 如果需要自定义Nginx配置,可以将配置文件复制到容器中 # COPY /opt/portal/nginx.conf /etc/nginx/nginx.conf # 如果需要暴露Nginx的端口到宿主机,可以使用EXPOSE指令 # EXPOSE 80 # 自定义命令,在容器启动时执行 # CMD [“nginx”, “-g”, “daemon off;”]根据Dockerfile构建Nginx镜像docker build -t portal-nginx-image .
启动容器
宿主机和容器中做8080:80端口映射宿主机业务代码和容器中业务代码做卷映射(/dist) docker run –name portal-nginx-image -d -p 8080:80 -v /opt/portal/dist:/usr/share/nginx/html/dist业务胖容器
业务胖容器的基础镜像为centos-x86_64:centos7,最原始的操作系统镜像。意味着要进行大量的工具包、依赖包安装,配置集成。Nginx作为整个业务层的最上层,Dockerfile编写流程放到最后面,CMD命令只会执行最后一个。多个服务的动态配置启动流程放在shell脚本中处理。
# 新建portal目录 RUN mkdir /opt/portal # 安装nginx.tar.gz COPY app/portal-packages/nginx.tar.gz /opt/portal RUN tar -xvf /opt/portal/nginx.tar.gz -C /opt/portal/ RUN rm -f /opt/portal/nginx.tar.gz # 安装业务包dist.tag.gz RUN rm -rf /opt/portal/nginx/html/dist COPY app/portal-packages/dist.tar.gz /opt/portal/nginx/html/ RUN tar -xvf /opt/portal/nginx/html/dist.tar.gz -C /opt/portal/nginx/html/ RUN rm -f /opt/portal/nginx/html/dist.tar.gz # 应用定制nginx.conf RUN rm -f /opt/portal/nginx/conf/nginx.conf COPY app/portal-packages/nginx.conf /opt/portal/nginx/conf/ # 开放运行权限 RUN chmod 777 /opt/portal/nginx/sbin/nginx CMD [“/usr/bin/app_start”]在/usr/bin/app_start中执行/usr/bin/web_start,将启动流程串起来
Shell脚本
Web的Shell脚本中主要用于获取配置的端口,替换进nginx.conf中启动Nginx服务
#!/bin/bash RESET= 33[0m WARN= 33[33m ERROR= 33[31m SUCCESS= 33[32m # 配置文件路径 CONF_FILE=”/var/lib/fitos/config_files/transfer.conf” # 配置参数名 CONFIG_PARAM=”nginx_port” # 使用grep查找配置行,并使用awk提取等号后面的值 CONFIG_PORT=$(grep -E “^${CONFIG_PARAM} =” “${CONF_FILE}” | awk -F= {print $2}) # 去除配置值两边的空白字符(如果有的话) CONFIG_PORT=$(echo “${CONFIG_PORT}” | sed s/^[ t]*//;s/[ t]*$//) # Nginx配置文件路径 NGINX_CONF_PATH=/opt/portal/nginx/conf/nginx.conf # 使用sed命令替换nginx.conf中的监听端口 if [ -n “$CONFIG_PORT” ]; then sed -i “s/listen [0-9]+ default_server;/listen ${CONFIG_PORT} default_server;/g” ${NGINX_CONF_PATH} else echo -e “${WARN}未配置$CONF_FILE中nginx_port,将按照默认port:80启动服务${RESET}” fi # 检查Nginx配置文件语法是否正确 /opt/portal/nginx/sbin/nginx -t if [ $? -ne 0 ]; then echo -e “${ERROR}Nginx配置文件语法错误,请检查nginx.conf文件内容${RESET}” exit 1 fi # 重新加载Nginx配置 /opt/portal/nginx/sbin/nginx -s reload if [ $? -ne 0 ]; then echo “Nginx重启失败,尝试启动Nginx…” # 如果重新加载失败,尝试直接启动Nginx /opt/portal/nginx/sbin/nginx if [ $? -ne 0 ]; then echo -e “${ERROR}Nginx启动失败,请检查错误日志${RESET}” exit 1 else echo -e “${SUCCESS}Nginx服务启动成功${RESET}” fi else echo -e “${SUCCESS}Nginx服务重启成功${RESET}” fi最终制作出的镜像启动的胖容器会将所有服务拉起来,整个系统搭建完成。
暂无评论内容