大家好我是红衣码剑客最近在私有云容器云服务运维的实战场景中完成了一套完整的 ERP 系统全容器化落地。今天这篇原创教程我会带大家从零开始完成4 个核心业务镜像的定制化构建再通过 Docker Compose 实现一站式编排部署全程基于 CentOS7.9 官方基础镜像完全贴合企业私有云的部署规范每一步都附带完整可运行的代码、逐行注释和原理解析新手也能跟着一步步落地。一、先搞懂为什么要做 ERP 系统全容器化部署传统的 ERP 部署模式需要在服务器上挨个安装配置数据库、Redis、Nginx、JDK 环境不仅部署周期长还极易出现「开发环境能跑生产环境跑不起来」的环境不一致问题后续迁移、扩容、运维的成本都极高。而容器化部署的核心优势就是把每个业务组件都打包成标准化、可移植的 Docker 镜像实现「一次构建到处运行」再通过 Docker Compose 实现多容器的统一编排、一键启停彻底解决环境问题部署效率提升 90% 以上这也是目前企业私有云场景中最主流的应用交付方案。本文适用场景 技术栈适用平台企业私有云、Linux 服务器CentOS7/8、Ubuntu 均可本文实操基于 CentOS7核心技术栈Docker、Docker Compose、MariaDB、Redis、Nginx、Java SpringBoot基础镜像centos:centos7.9.2009企业级最常用的稳定版基础镜像最终目标完成 ERP 系统从镜像构建到线上可访问的全流程落地前置准备一台已经安装好 Docker、Docker Compose 的 Linux 服务器我这里用的是 K8s 集群的 Master 节点只要是装了 Docker 的 Linux 环境都可业务资源包 ERP.tar.gz包含 ERP 后端 jar 包、前端静态资源包、数据库初始化脚本、yum 源相关依赖、CentOS7.9 基础镜像包服务器开放对应端口8888、3306、6379、9999步骤 1资源包下载与解压首先我们把资源包下载到服务器并解压查看目录结构# 下载资源包离线环境可直接上传到服务器 curl -O http://172.18.10.24/kubernetes/ERP.tar.gz # 解压资源包 tar -zxvf ERP.tar.gz # 进入解压后的目录后续所有操作都在这个目录下执行 cd ERP/ # 查看目录结构确认核心文件齐全 ls解压后的核心目录结构ERP/ ├── app.jar # ERP后端SpringBoot服务包 ├── jsh_erp.sql # ERP业务数据库初始化脚本 ├── nginx/ │ ├── app.tar.gz # ERP前端静态资源压缩包 │ └── nginx.conf # Nginx自定义配置文件 ├── yum/ # 离线yum源rpm依赖包 ├── ftp.repo # 自定义yum源配置文件 └── CentOS_7.9.2009.tar # CentOS7.9基础镜像包步骤 2加载基础镜像因为私有云环境大多是离线场景无法直接从 Docker Hub 拉取镜像所以我们先把本地的 CentOS7.9 基础镜像加载到 Docker 中# 加载CentOS7.9基础镜像 docker load -i CentOS_7.9.2009.tar # 验证镜像是否加载成功 docker images | grep centos输出示例REPOSITORY TAG IMAGE ID CREATED SIZE centos centos7.9.2009 eeb6ee3f44bd 2 years ago 204MB二、实战环节 1容器化部署 MariaDB构建 erp-mysql:v1.0 镜像先搞懂MariaDB 是什么MariaDB 是 MySQL 的开源分支100% 兼容 MySQL 语法和协议由开源社区维护完全免费是企业级业务系统最常用的关系型数据库之一。这里我们不直接使用 Docker Hub 的官方 MariaDB 镜像而是基于 CentOS7.9 基础镜像完全定制化构建实现数据库安装、root 密码设置、业务库创建、初始化脚本自动导入、服务开机自启全流程内置适配私有云的定制化需求。步骤 1配置自定义 yum 源CentOS7 官方源已经在 2024 年 6 月正式停服所以我们需要先配置可用的自定义 yum 源否则 yum 安装会失败。在当前 ERP 目录下创建ftp.repo文件文件内容如下[ftp] nameCentOS7.9 baseurlftp://172.18.10.24/centos7.9 enabled1 gpgcheck0配置说明baseurl是 yum 源的地址enabled1启用该源gpgcheck0关闭校验适配离线私有云环境。步骤 2编写数据库初始化脚本我们需要一个初始化脚本实现数据库启动、root 密码设置、远程访问授权、业务库创建、sql 脚本自动导入创建mysql_init.sh文件#!/bin/bash # 使用 root 用户初始化 MariaDB 数据库 mysql_install_db --userroot # 后台启动 MariaDB 服务安全模式 mysqld_safe --userroot # 等待 8 秒确保服务完全启动 sleep 8 # 设置 root 用户密码为 tshoperp mysqladmin -u root password tshoperp # 授予 root 用户远程访问权限并刷新权限 mysql -uroot -ptshoperp -e grant all on *.* to root% identified by tshoperp; flush privileges; # 创建数据库 jsh_erp 并导入 SQL 文件 mysql -uroot -ptshoperp -e create database jsh_erp; use jsh_erp; source /opt/jsh_erp.sql;给脚本添加可执行权限chmod x mysql_init.sh步骤 3编写 MariaDB 的 Dockerfile创建Dockerfile-mariadb文件这是构建镜像的核心文件每一行都附带详细注释# 使用 CentOS 7.9.2009 作为基础镜像 FROM centos:centos7.9.2009 # 维护者信息推荐使用 LABEL 替代已弃用的 MAINTAINER LABEL maintainertroml1788 # 删除系统自带的 yum 源配置文件 RUN rm -rf /etc/yum.repos.d/* # 复制自定义的 yum 源配置文件到容器中 COPY ftp.repo /etc/yum.repos.d/ # 设置语言环境变量避免中文乱码问题 ENV LC_ALL en_US.UTF-8 # 使用 yum 安装 MariaDB 服务端 RUN yum install -y mariadb-server # 将数据库初始化脚本复制到 /opt 目录 COPY mysql_init.sh /opt/ # 将数据库 SQL 文件复制到 /opt 目录 COPY jsh_erp.sql /opt/ # 执行初始化脚本在构建阶段运行而非容器启动时 RUN bash /opt/mysql_init.sh # 声明容器运行时监听的端口 EXPOSE 3306 # 容器启动时执行的命令以前台方式运行 MariaDB 服务 CMD [mysqld_safe, --userroot]关键指令解释指令作用FROM指定基础镜像所有后续操作都基于此镜像RUN在镜像构建过程中执行命令常用于安装软件包COPY将宿主机文件复制到镜像内的指定路径ENV设置环境变量EXPOSE声明容器运行时提供的端口仅起文档作用实际映射需在运行时指定CMD容器启动时默认执行的命令一个 Dockerfile 只能有一条有效的 CMD步骤 4构建 MariaDB 镜像执行 docker build 命令构建镜像命令逐段解析在注释里# 构建镜像打标签为erp-mysql:v1.0 # -t指定镜像名称和版本标签 # -f指定Dockerfile文件因为我们的文件名不是默认的Dockerfile所以需要手动指定 # 最后的.指定构建上下文为当前目录必须加否则会找不到COPY的文件 docker build -t erp-mysql:v1.0 -f Dockerfile-mariadb .步骤 5验证镜像构建结果# 查看构建好的镜像 docker images | grep erp-mysql erp-mysql v1.0 084056d24845 1 minute ago 826MB三、实战环节 2容器化部署 Redis构建 erp-redis:v1.0 镜像先搞懂Redis 是什么Redis 是开源的高性能内存型键值数据库读写性能极强常用作业务缓存、会话存储、分布式锁是 ERP 这类业务系统必不可少的核心组件。这里我们基于 CentOS7.9 基础镜像定制构建实现 Redis 安装、配置文件修改、允许外部访问、关闭保护模式、服务开机自启。步骤 1编写 Redis 的 Dockerfile创建Dockerfile-redis文件完整内容 逐行注释# 基础镜像 FROM centos:centos7.9.2009 # 维护者信息 LABEL maintainertroml1788 # 清理默认 yum 源使用自定义源 RUN rm -rf /etc/yum.repos.d/* COPY ftp.repo /etc/yum.repos.d/ # 安装 Redis RUN yum install -y redis # 修改 Redis 配置文件允许任意 IP 访问 RUN sed -i s/127.0.0.1/0.0.0.0/g /etc/redis.conf # 关闭 Redis 保护模式生产环境请谨慎使用 RUN sed -i s/protected-mode yes/protected-mode no/g /etc/redis.conf # 暴露 Redis 默认端口 EXPOSE 6379 # 启动 Redis 服务使用修改后的配置文件 CMD [/usr/bin/redis-server, /etc/redis.conf]配置文件修改说明bind 127.0.0.1→bind 0.0.0.0允许任何 IP 连接 Redisprotected-mode yes→protected-mode no关闭保护模式否则外部无法访问步骤 2构建 Redis 镜像# 构建镜像打标签erp-redis:v1.0 docker build -t erp-redis:v1.0 -f Dockerfile-redis .步骤 3验证镜像构建结果docker images | grep erp-redis erp-redis v1.0 cf734e5460 1 minute ago 231MB四、实战环节 3容器化部署 Nginx构建 erp-nginx:v1.0 镜像先搞懂Nginx 是什么Nginx 是开源的高性能 HTTP 和反向代理服务器并发能力极强这里我们主要用它托管 ERP 系统的前端静态资源同时做后端接口的反向代理。步骤 1编写 Nginx 的 Dockerfile创建Dockerfile-nginx文件完整内容 逐行注释# 基础镜像 FROM centos:centos7.9.2009 LABEL maintainertroml # 配置 yum 源 RUN rm -rf /etc/yum.repos.d/* COPY ftp.repo /etc/yum.repos.d/ # 安装 Nginx RUN yum install -y nginx # 创建 Nginx 配置目录 RUN mkdir -p /etc/nginx/ # 使用自定义的 nginx.conf 覆盖默认配置 COPY nginx/nginx.conf /etc/nginx/nginx.conf # 将前端应用压缩包复制到容器 COPY nginx/app.tar.gz /opt/ # 解压应用到根目录后续编排时会用到 RUN tar -zxvf /opt/app.tar.gz -C / # 暴露 HTTP 端口 EXPOSE 80 # 以前台模式启动 NginxDocker 容器需要前台进程 CMD [nginx, -g, daemon off;]补充COPY 和 ADD 的区别很多新手会混淆这两个命令这里给大家讲清楚命令核心功能自动解压缩适用场景COPY复制本地文件 / 目录到容器内不支持普通文件复制推荐优先使用ADD复制本地文件 / 目录到容器内支持 tar.gz 等压缩包自动解压需要自动解压缩、复制远程文件时使用步骤 2构建 Nginx 镜像# 构建镜像打标签erp-nginx:v1.0 docker build -t erp-nginx:v1.0 -f Dockerfile-nginx .步骤 3验证镜像构建结果docker images | grep erp-nginx erp-nginx v1.0 56372b4ac355 1 minute ago 278MB五、实战环节 4容器化部署 ERP 后端服务构建 erp-server:v1.0 镜像先搞懂ERP 后端服务是什么我们的 ERP 系统后端是基于 Java 开发的 SpringBoot 可执行 jar 包所以需要基于 CentOS7.9 镜像安装 JDK 环境把 jar 包内置到镜像中实现容器启动后自动运行后端服务。步骤 1编写 ERP 后端的 Dockerfile创建Dockerfile-erp文件完整内容 逐行注释# 基础镜像 FROM centos:centos7.9.2009 LABEL maintainertroml # 配置 yum 源 RUN rm -rf /etc/yum.repos.d/* COPY ftp.repo /etc/yum.repos.d/ # 安装 OpenJDK 8JRE 开发工具包 RUN yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel # 将 Spring Boot Jar 包复制到 /opt 目录 COPY app.jar /opt/ # 暴露应用端口 EXPOSE 9999 # 启动 Java 应用 CMD [java, -jar, /opt/app.jar]步骤 2构建 ERP 后端镜像# 构建镜像打标签erp-server:v1.0 docker build -t erp-server:v1.0 -f Dockerfile-erp .步骤 3验证镜像构建结果docker images | grep erp-server erp-server v1.0 f4a16156ba85 1 minute ago 511MB六、实战环节 5Docker Compose 一站式编排部署整套 ERP 系统先搞懂Docker Compose 是什么Docker Compose 是 Docker 官方推出的容器编排工具专门用来定义和运行多容器的 Docker 应用。我们只需要一个 yaml 文件就能定义整套系统的所有服务、端口、依赖、启动规则然后用一条命令一键启动 / 停止 / 更新所有容器完美解决多容器应用的管理难题。步骤 1编写 docker-compose.yaml 编排文件创建docker-compose.yaml文件完整内容 逐行注释严格符合题目要求version: 3 # Compose 文件格式版本 services: # MariaDB 数据库服务 mysql: container_name: erp-mysql # 容器名称 image: erp-mysql:v1.0 # 使用我们构建的镜像 ports: - 3306:3306 # 端口映射宿主机:容器 restart: always # 容器异常退出时自动重启 environment: - MYSQL_DATABASEjsh_erp # 环境变量指定默认数据库 # Redis 缓存服务 redis: container_name: erp-redis image: erp-redis:v1.0 ports: - 6379:6379 restart: always command: redis-server --port 6379 --requirepass tshoperp --appendonly yes # 启动命令设置端口、密码、开启 AOF 持久化 # ERP 后端服务 erp: container_name: erp-server image: erp-server:v1.0 ports: - 9999:9999 restart: always # Nginx 前端服务 nginx: container_name: erp-nginx image: erp-nginx:v1.0 ports: - 8888:80 # 将宿主机的 8888 端口映射到容器的 80 端口 restart: always关键字段说明字段说明versionCompose 文件格式版本3是目前最常用的版本services定义所有需要启动的容器服务image指定容器使用的镜像ports端口映射格式为宿主机端口:容器端口restart重启策略always表示容器退出时总是自动重启environment设置环境变量常用于向容器传递配置参数command覆盖镜像默认的启动命令步骤 2启动整个应用栈# 检查所有镜像是否准备就绪 docker images | grep erp # 使用 docker-compose 以后台模式启动所有服务 docker-compose up -d # 查看服务运行状态 docker-compose ps如果一切正常你会看到类似如下的输出七、最终验证浏览器访问 ERP 系统打开浏览器访问http://服务器IP:8888即可看到 ERP 系统的登录界面。默认登录凭证用户名admin密码123456登录成功后说明整个容器化部署流程已经圆满完成八、踩坑总结与生产环境优化建议新手必避的 80% 踩坑点容器启动后立刻退出90% 的原因是服务没有前台运行容器内 PID1 进程必须前台运行不能用service xxx start这种后台启动的方式比如 Nginx 必须加daemon offMariaDB 用 mysqld_safe 前台运行。Docker 构建报错找不到文件大概率是构建上下文的问题docker build最后的.不能丢所有 COPY 的文件必须在当前构建上下文目录内。yum 安装失败CentOS7 官方源停服必须配置可用的国内源或私有云内部 yum 源否则会报错找不到安装包。数据库初始化失败必须在启动数据库后加 sleep 等待确保服务完全启动后再执行改密码、导入 sql 的操作否则会报连接拒绝。生产环境优化建议安全加固数据库、Redis 不要用 root 用户运行容器关闭不必要的端口映射Redis 必须设置强密码数据库只允许内网访问。数据持久化给 mysql、redis、nginx 配置数据卷 volume把容器内的数据挂载到宿主机避免容器删除后数据丢失。镜像优化把 Dockerfile 里的多个 RUN 命令合并减少镜像层数使用多阶段构建减小镜像体积。健康检查在 docker-compose.yaml 里给每个服务添加 healthcheck 健康检查自动重启异常服务。日志管理配置容器日志轮转避免日志文件占满磁盘空间。结尾今天这篇教程我们完整实现了从 4 个核心组件的 Docker 镜像定制化构建到 Docker Compose 一站式编排部署 ERP 系统的全流程所有代码都是我在私有云环境中实操跑通的完全贴合企业级容器云服务运维的真实需求。后续我会继续更新 K8s、KubeVirt、DevOps、云原生监控相关的实战教程都是一线落地的干货内容欢迎大家关注我的博客有任何问题都可以在评论区留言我会一一回复