Nginx在胖容器中的部署

胖容器(Fat Container)是一种容器技术的形态,它在传统的轻量级容器基础上进行了扩展和增强。胖容器不仅包含了应用程序及其依赖项,还集成了大量的管理和调度组件,从而提供了更丰富的功能和更强大的性能。

Nginx是一款高性能的HTTP和反向代理web服务器

开发注意

制作一个完整的胖容器需要多人参与,每个人都得负责好自身编写的Dockerfile和Shell,经过环境测试后再合并进大的流程中。配置的读取应用、服务的启动顺序、依赖之间的关系都得把控,更重要的是关键日志的打印。

Nginx部分的编写,也是要先用FROM nginx:latest作为基础镜像测试完这部分业务流程后再合并进主Dockerfile,争取一遍过负责流程。

Nginx容器

编写Dockerfile制作Nginx镜像

js 复制代码
# 使用官方的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)
js 复制代码
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脚本中处理。

js 复制代码
# 新建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服务

js 复制代码
#!/bin/bash

RESET='\033[0m'

WARN='\033[33m'

ERROR='\033[31m'

SUCCESS='\033[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

最终制作出的镜像启动的胖容器会将所有服务拉起来,整个系统搭建完成。

相关推荐
运维小白。。38 分钟前
Nginx 反向代理
运维·服务器·nginx·http
Jiaberrr1 小时前
前端实战:使用JS和Canvas实现运算图形验证码(uniapp、微信小程序同样可用)
前端·javascript·vue.js·微信小程序·uni-app
everyStudy2 小时前
JS中判断字符串中是否包含指定字符
开发语言·前端·javascript
城南云小白2 小时前
web基础+http协议+httpd详细配置
前端·网络协议·http
前端小趴菜、2 小时前
Web Worker 简单使用
前端
web_learning_3212 小时前
信息收集常用指令
前端·搜索引擎
tabzzz2 小时前
Webpack 概念速通:从入门到掌握构建工具的精髓
前端·webpack
200不是二百2 小时前
Vuex详解
前端·javascript·vue.js
滔滔不绝tao2 小时前
自动化测试常用函数
前端·css·html5
码爸3 小时前
flink doris批量sink
java·前端·flink