背景介绍
胖容器(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='\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
最终制作出的镜像启动的胖容器会将所有服务拉起来,整个系统搭建完成。
到此这篇关于nginx在胖容器中的部署流程的文章就介绍到这了,更多相关nginx胖容器部署内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论