文档说明
-
整合全部会话内容:Docker资源清理、Linux磁盘爆满处理、Java8+Tomcat9+Nginx1.26+Redis7.4容器完整部署、Tomcat部署Vue排错、常用命令及日常维护。
-
已修复所有语法错误(如Dockerfile FROM指令、脚本命令笔误),所有命令可直接复制运行,无冗余、无冲突。
-
基础镜像固定为
debian:10(解决源失效问题),放弃ubuntu24.04适配,与原有部署流程完全兼容。 -
核心特性:Tomcat conf目录映射(宿主机直接修改配置)、服务启停脚本自动化、容器开机自启、全路径无变量。
-
/home/yhfx/RailwayEnvAna/java_project是测试服务器规定放置的路径,可根据实际情况调整。
一、Docker 镜像&资源清理(解决镜像冗余、磁盘占用)
1. 删除 悬空镜像
bash
# 交互式删除(需确认)
docker image prune
# 无需确认,强制删除
docker image prune -f
# 精准删除指定ID的悬空镜像(替换镜像ID即可)
docker rmi be634fe64fb2
2. 彻底清理Docker所有无用资源(释放大量磁盘空间)
bash
docker system prune -a -f
清理范围:未使用镜像、停止的容器、无用网络、构建缓存、悬空镜像
二、Linux 磁盘空间不足 / apt 报错解决
针对apt安装依赖报错、磁盘爆满问题,执行以下命令:
bash
# 清理apt缓存(释放缓存占用)
sudo apt clean
# 清理系统日志,限制日志大小为100M
sudo journalctl --vacuum-size=100M
# 查看磁盘占用情况,定位爆满目录
df -h
三、容器部署前置操作(必执行,避免冲突)
1. 清理旧环境(旧容器、旧镜像)
部署前彻底删除历史容器和镜像,避免配置冲突:
bash
# 删除所有相关旧容器(v1/v2/v3版本)
docker rm -f java8_tomcat9_nginx126_redis74_v1
docker rm -f java8_tomcat9_nginx126_redis74_v2
docker rm -f java8_tomcat9_nginx126_redis74_v3
# 删除所有相关旧镜像(v1/v2/v3版本)
docker rmi -f java8_tomcat9_nginx126_redis74:v1
docker rmi -f java8_tomcat9_nginx126_redis74:v2
docker rmi -f java8_tomcat9_nginx126_redis74:v3
# 验证清理结果(无相关镜像/容器即为成功)
docker images
docker ps -a
2. 创建宿主机挂载目录并授权
创建所有需要挂载的目录(含Tomcat conf配置目录),赋予777权限避免挂载失败:
bash
# 创建基础目录及各组件挂载目录
mkdir -p /home/yhfx/RailwayEnvAna/java_project
mkdir -p /home/yhfx/RailwayEnvAna/java_project/tomcat_folder/webapps
mkdir -p /home/yhfx/RailwayEnvAna/java_project/tomcat_folder/logs
mkdir -p /home/yhfx/RailwayEnvAna/java_project/tomcat_folder/log
mkdir -p /home/yhfx/RailwayEnvAna/java_project/tomcat_folder/conf # Tomcat配置目录(新增)
mkdir -p /home/yhfx/RailwayEnvAna/java_project/nginx_folder/conf
mkdir -p /home/yhfx/RailwayEnvAna/java_project/nginx_folder/logs
mkdir -p /home/yhfx/RailwayEnvAna/java_project/redis_folder/conf
mkdir -p /home/yhfx/RailwayEnvAna/java_project/redis_folder/logs
mkdir -p /home/uos/gongwu/yhfx
# 赋予目录777权限,避免挂载权限不足
chmod -R 777 /home/yhfx/RailwayEnvAna/java_project
chmod -R 777 /home/uos/gongwu/yhfx
四、创建服务启停统一脚本(create_all_scripts.sh)
通过cat命令直接创建统一脚本,执行后自动生成所有服务(Redis/Nginx/Tomcat)的启停小脚本,无需手动逐个创建:
bash
cd /home/yhfx/RailwayEnvAna/java_project
# 外部创建统一脚本(包含所有服务启停小脚本的创建命令)
cat > create_all_scripts.sh <<'EOF'
#!/bin/bash
# 统一创建所有服务启停小脚本,执行后自动生成所有所需sh脚本
cd /
# 1. 创建Redis启停脚本(已修正,避免容器退出)
cat > start_redis.sh <<'EOF1'
#!/bin/bash
# 启动Redis(自动检查配置文件,输出启动结果,完整可执行)
# 关键修复:daemonize no,禁止Redis后台运行,防止容器退出
if [ ! -f "/usr/local/redis/conf/redis.conf" ]; then
echo "Redis配置文件不存在,创建默认配置文件"
echo "daemonize no" > /usr/local/redis/conf/redis.conf
echo "logfile /var/log/redis/redis.log" >> /usr/local/redis/conf/redis.conf
echo "dir /data" >> /usr/local/redis/conf/redis.conf
fi
# 停止原有Redis进程,避免多实例冲突
pkill redis-server
# 启动Redis并指定配置文件,前台运行
redis-server /usr/local/redis/conf/redis.conf &
sleep 1
# 验证启动结果
if pgrep redis-server >/dev/null; then
echo "Redis启动成功"
else
echo "Redis启动失败,请查看日志:cat /var/log/redis/redis.log"
fi
EOF1
cat > stop_redis.sh <<'EOF1'
#!/bin/bash
# 停止Redis(输出停止结果,失败可强制停止,完整可执行)
pkill redis-server
sleep 1
if ! pgrep redis-server >/dev/null; then
echo "Redis停止成功"
else
echo "Redis停止失败,强制停止:pkill -9 redis-server"
pkill -9 redis-server
fi
EOF1
cat > restart_redis.sh <<'EOF1'
#!/bin/bash
# 重启Redis(整合停止+启动+验证,解决重启后仍未运行问题,完整可执行)
echo "正在重启Redis..."
pkill redis-server
sleep 1
# 关键修复:daemonize no,禁止Redis后台运行,防止容器退出
if [ ! -f "/usr/local/redis/conf/redis.conf" ]; then
echo "Redis配置文件不存在,创建默认配置文件"
echo "daemonize no" > /usr/local/redis/conf/redis.conf
echo "logfile /var/log/redis/redis.log" >> /usr/local/redis/conf/redis.conf
echo "dir /data" >> /usr/local/redis/conf/redis.conf
fi
# 启动Redis,前台运行
redis-server /usr/local/redis/conf/redis.conf &
sleep 1
# 验证重启结果
if pgrep redis-server >/dev/null; then
echo "Redis重启成功"
else
echo "Redis重启失败,请查看日志:cat /var/log/redis/redis.log"
fi
EOF1
# 2. 创建Nginx启停脚本
cat > start_nginx.sh <<'EOF1'
#!/bin/bash
# 启动Nginx(带启动验证,完整可执行)
/usr/local/nginx126/sbin/nginx
sleep 1
if pgrep nginx >/dev/null; then
echo "Nginx启动成功"
else
echo "Nginx启动失败,请检查配置文件:/usr/local/nginx126/conf/nginx.conf"
fi
EOF1
cat > stop_nginx.sh <<'EOF1'
#!/bin/bash
# 停止Nginx(带停止验证,失败可强制停止,完整可执行)
/usr/local/nginx126/sbin/nginx -s stop
sleep 1
if ! pgrep nginx >/dev/null; then
echo "Nginx停止成功"
else
echo "Nginx停止失败,强制停止"
pkill -9 nginx
fi
EOF1
cat > restart_nginx.sh <<'EOF1'
#!/bin/bash
# 重启Nginx(配置修改后生效,带重启验证,完整可执行)
/usr/local/nginx126/sbin/nginx -s reload
sleep 1
if pgrep nginx >/dev/null; then
echo "Nginx重启成功"
else
echo "Nginx重启失败,尝试重新启动..."
/usr/local/nginx126/sbin/nginx
fi
EOF1
# 3. 创建Tomcat启停脚本
cat > start_tomcat.sh <<'EOF1'
#!/bin/bash
# 启动Tomcat(带启动验证,完整可执行)
pkill java
sleep 1
/usr/local/tomcat9/bin/catalina.sh start
sleep 2
if pgrep java >/dev/null; then
echo "Tomcat启动成功"
else
echo "Tomcat启动失败,请查看日志:/usr/local/tomcat9/logs/catalina.out"
fi
EOF1
cat > stop_tomcat.sh <<'EOF1'
#!/bin/bash
# 停止Tomcat(带停止验证,失败可强制停止,完整可执行)
pkill java
sleep 1
if ! pgrep java >/dev/null; then
echo "Tomcat停止成功"
else
echo "Tomcat停止失败,强制停止"
pkill -9 java
fi
EOF1
cat > restart_tomcat.sh <<'EOF1'
#!/bin/bash
# 重启Tomcat(带重启验证,完整可执行)
echo "正在重启Tomcat..."
pkill java
sleep 1
/usr/local/tomcat9/bin/catalina.sh start
sleep 2
if pgrep java >/dev/null; then
echo "Tomcat重启成功"
else
echo "Tomcat重启失败,请查看日志:/usr/local/tomcat9/logs/catalina.out"
fi
EOF1
# 4. 创建所有服务统一启停脚本
cat > all_start.sh <<'EOF1'
#!/bin/bash
# 启动所有服务(完整可执行,带启动顺序控制)
echo "开始启动所有服务..."
/start_redis.sh
sleep 1
/start_nginx.sh
sleep 1
# 取消调用/start_tomcat.sh,避免与container_start.sh中前台启动重复
echo "所有服务启动完成,可执行验证命令查看状态"
EOF1
cat > all_stop.sh <<'EOF1'
#!/bin/bash
# 停止所有服务(完整可执行,带停止顺序控制)
echo "开始停止所有服务..."
/stop_tomcat.sh
sleep 1
/stop_nginx.sh
sleep 1
/stop_redis.sh
echo "所有服务停止完成"
EOF1
cat > all_restart.sh <<'EOF1'
#!/bin/bash
# 重启所有服务(完整可执行,整合停止+启动)
echo "开始重启所有服务..."
/all_stop.sh
sleep 2
/all_start.sh
echo "所有服务重启完成"
EOF1
# 5. 创建容器启动脚本(维持容器存活)
cat > container_start.sh <<'EOF1'
#!/bin/bash
set -e
# 启动所有服务
/all_start.sh
# 前台运行Tomcat,维持容器存活
exec /usr/local/tomcat9/bin/catalina.sh run
EOF1
# 给所有生成的脚本赋予可执行权限,确保可直接运行
chmod +x ./*.sh
echo "所有服务启停脚本创建完成!"
EOF
五、创建Dockerfile(debian:10,无语法错误)
采用cat命令直接创建Dockerfile,基础镜像为debian:10(解决源失效),已删除Nginx UTF-8配置,集成所有组件安装逻辑:
bash
cd /home/yhfx/RailwayEnvAna/java_project
cat > Dockerfile <<'EOF'
FROM debian:10
# 配置软件源,解决debian10源失效问题(参考archive.debian.org官方源)
RUN echo "deb http://archive.debian.org/debian buster main contrib non-free" > /etc/apt/sources.list && \
echo "deb http://archive.debian.org/debian-security buster/updates main contrib non-free" >> /etc/apt/sources.list && \
echo "Acquire::Check-Valid-Until false;" > /etc/apt/apt.conf.d/10no-check
# 配置时区(北京时间),安装依赖、dmidecode工具及sudo命令
ENV TZ=Asia/Shanghai
RUN apt-get update && apt-get install -y tzdata \
gcc make libpcre3-dev zlib1g-dev tar curl procps net-tools iproute2 vim \
dmidecode sudo locales pkg-config && \
# 确认时区配置,避免时区偏差
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 创建Redis必需目录并授权,避免启动报错
RUN mkdir -p /usr/local/redis/conf /var/log/redis /data && chmod 777 /var/log/redis /data
# 安装JDK8
COPY jdk-8u101-linux-x64.tar.gz /jdk.tar.gz
RUN tar zxf /jdk.tar.gz -C /usr/local && \
mv /usr/local/jdk1.8.0_101 /usr/local/jdk8 && rm -f /jdk.tar.gz
ENV JAVA_HOME=/usr/local/jdk8
ENV PATH=$JAVA_HOME/bin:$PATH
# 安装Tomcat9
COPY apache-tomcat-9.0.95.tar.gz /tomcat.tar.gz
RUN tar zxf /tomcat.tar.gz -C /usr/local && \
mv /usr/local/apache-tomcat-9.0.95 /usr/local/tomcat9 && rm -f /tomcat.tar.gz
ENV CATALINA_HOME=/usr/local/tomcat9
ENV PATH=$CATALINA_HOME/bin:$PATH
# 安装Nginx1.26.2(已删除UTF-8配置行,符合需求)
COPY nginx-1.26.2.tar.gz /nginx.tar.gz
RUN tar zxf /nginx.tar.gz && cd nginx-1.26.2 && \
./configure --prefix=/usr/local/nginx126 && make -j4 && make install && cd .. && rm -rf *nginx*
# 安装Redis7.4.1
COPY redis-7.4.1.tar.gz /redis.tar.gz
RUN tar zxf /redis.tar.gz && cd redis-7.4.1 && make -j4 && make install && cd .. && rm -rf *redis*
# 复制宿主机外部创建的统一脚本,复制到容器内并执行,自动生成所有小脚本
COPY create_all_scripts.sh /create_all_scripts.sh
# 赋予统一脚本可执行权限,并执行脚本,生成所有服务启停小脚本
RUN chmod +x /create_all_scripts.sh && /create_all_scripts.sh
# 给所有生成的小脚本赋予可执行权限(双重保障,确保可正常运行)
RUN chmod +x /*.sh
# 容器启动命令(执行启动脚本,维持容器存活)
CMD ["/container_start.sh"]
EOF
六、构建镜像&复制配置文件
1. 构建v3版本镜像
bash
cd /home/yhfx/RailwayEnvAna/java_project
docker build -t java8_tomcat9_nginx126_redis74:v3 .
构建成功后,执行 docker images 可看到对应镜像;若构建失败,先执行 docker rmi -f java8_tomcat9_nginx126_redis74:v3 删除失败镜像,再重新构建。
2. 复制容器内默认配置到宿主机(必执行)
创建复制脚本,自动完成容器内配置文件复制、临时容器管理及目录授权:
bash
cat > /home/yhfx/RailwayEnvAna/java_project/copy_configs.sh <<'EOF'
#!/bin/bash
cd /home/yhfx/RailwayEnvAna/java_project
echo "==================== 开始复制容器内默认文件 ====================="
# 启动临时容器(后台运行60秒,确保复制完成)
docker run -d --rm --name temp_container java8_tomcat9_nginx126_redis74:v3 sleep 60
# 复制 Nginx 配置文件
docker cp temp_container:/usr/local/nginx126/conf/. nginx_folder/conf/
# 复制 Tomcat 配置、日志、项目目录(含conf目录)
docker cp temp_container:/usr/local/tomcat9/webapps/. tomcat_folder/webapps/
docker cp temp_container:/usr/local/tomcat9/logs/. tomcat_folder/logs/
docker cp temp_container:/usr/local/tomcat9/log/. tomcat_folder/log/
docker cp temp_container:/usr/local/tomcat9/conf/. tomcat_folder/conf/ # 复制Tomcat配置
# 复制 Redis 配置、日志目录
docker cp temp_container:/usr/local/redis/conf/. redis_folder/conf/
docker cp temp_container:/var/log/redis/. redis_folder/logs/
# 停止临时容器,自动清理
docker stop temp_container
# 授权(含Tomcat conf目录),避免挂载权限不足
chmod -R 777 /home/yhfx/RailwayEnvAna/java_project
echo "==================== 全部复制完成! ====================="
EOF
执行复制命令:
bash
bash /home/yhfx/RailwayEnvAna/java_project/copy_configs.sh
七、容器启动&状态验证
1. 容器启动命令(最终版,无语法错误)
bash
# 报错排查:若出现「Unable to find image 'xxx:v3' locally」,先重新构建镜像
#cd /home/yhfx/RailwayEnvAna/java_project
#docker build -t java8_tomcat9_nginx126_redis74:v3 .
# 启动前删除同名容器(避免冲突)
#docker rm -f java8_tomcat9_nginx126_redis74_v3
# 启动容器(开机自启、完整挂载,含Tomcat conf映射)
docker run -d \
--restart=always \
--privileged \
--name java8_tomcat9_nginx126_redis74_v3 \
-p 80:80 \
-p 8080:8080 \
-p 6379:6379 \
-v /etc/localtime:/etc/localtime \
-v /dev/mem:/dev/mem \
-v /home/yhfx/RailwayEnvAna/java_project/tomcat_folder/webapps:/usr/local/tomcat9/webapps \
-v /home/yhfx/RailwayEnvAna/java_project/tomcat_folder/logs:/usr/local/tomcat9/logs \
-v /home/yhfx/RailwayEnvAna/java_project/tomcat_folder/log:/usr/local/tomcat9/log \
-v /home/yhfx/RailwayEnvAna/java_project/tomcat_folder/conf:/usr/local/tomcat9/conf \
-v /home/yhfx/RailwayEnvAna/java_project/nginx_folder/conf:/usr/local/nginx126/conf \
-v /home/yhfx/RailwayEnvAna/java_project/nginx_folder/logs:/usr/local/nginx126/logs \
-v /home/yhfx/RailwayEnvAna/java_project/redis_folder/conf:/usr/local/redis/conf \
-v /home/yhfx/RailwayEnvAna/java_project/redis_folder/logs:/var/log/redis \
-v /home/uos/gongwu/yhfx:/home/uos/gongwu/yhfx \
java8_tomcat9_nginx126_redis74:v3
2. 容器进入&服务验证
bash
# 进入容器(启动后等待5秒,确保服务启动完成)
docker exec -it java8_tomcat9_nginx126_redis74_v3 bash
# 验证dmidecode、sudo及核心服务
dmidecode # 验证工具可用
sudo -l # 验证sudo可用(debian10默认无密码,回车即可)
# 验证Redis、Nginx、Tomcat运行状态
echo -n "Redis: " && pgrep redis-server >/dev/null && echo "✅ 运行" || echo "❌ 未运行"
echo -n "Nginx: " && pgrep nginx >/dev/null && echo "✅ 运行" || echo "❌ 未运行"
echo -n "Tomcat: " && pgrep java >/dev/null && echo "✅ 运行" || echo "❌ 未运行"
# 服务未运行时,快速启动(容器内执行)
# 启动Redis:/start_redis.sh
# 启动Nginx:/start_nginx.sh
# 启动Tomcat:/start_tomcat.sh
# 一键启动所有服务:/all_start.sh
八、常见报错排错(核心重点)
1. Tomcat 部署 Vue 报错(MIME 类型异常)
报错信息:
Plain
Failed to load module script: Expected a JavaScript-or-Wasm module script but the server responded with a MIME type of ""
解决方案(通过Tomcat conf映射修改,无需进入容器):
bash
# 1. 宿主机直接编辑Tomcat配置文件
vim /home/yhfx/RailwayEnvAna/java_project/tomcat_folder/conf/web.xml
# 2. 在 </web-app> 之前添加以下MIME映射(复制完整添加)
<mime-mapping>
<extension>js</extension>
<mime-type>application/javascript</mime-type>
</mime-mapping>
<mime-mapping>
<extension>css</extension>
<mime-type>text/css</mime-type>
</mime-mapping>
<mime-mapping>
<extension>html</extension>
<mime-type>text/html</mime-type>
</mime-mapping>
# 3. 重启容器生效
docker restart java8_tomcat9_nginx126_redis74_v3
2. Dockerfile 报错(FROM requires either one or three arguments)
报错原因:FROM指令与注释同列,导致语法解析失败
解决方案:确保FROM指令单独一行,无多余注释(本文档中Dockerfile已修复此问题)。
3. Redis 启动失败(容器退出)
核心原因:Redis配置中daemonize=yes(后台运行),导致容器退出
解决方案:本文档中Redis启停脚本已自动将daemonize设为no,无需手动修改;若仍失败,查看日志排查:
bash
# 查看Redis启动日志
docker exec -it java8_tomcat9_nginx126_redis74_v3 cat /var/log/redis/redis.log
# 强制重启Redis
docker exec -it java8_tomcat9_nginx126_redis74_v3 /restart_redis.sh
九、常用命令汇总(日常维护必备)
1. Docker 基础命令
bash
# 查看所有镜像
docker images
# 查看运行中的容器
docker ps
# 查看所有容器(含停止的)
docker ps -a
# 进入容器
docker exec -it java8_tomcat9_nginx126_redis74_v3 /bin/bash
# 停止容器
docker stop java8_tomcat9_nginx126_redis74_v3
# 启动容器
docker start java8_tomcat9_nginx126_redis74_v3
# 重启容器
docker restart java8_tomcat9_nginx126_redis74_v3
# 删除容器
docker rm -f java8_tomcat9_nginx126_redis74_v3
# 删除镜像
docker rmi -f java8_tomcat9_nginx126_redis74:v3
# 查看容器实时日志
docker logs -f java8_tomcat9_nginx126_redis74_v3
2. 容器内服务维护命令
bash
# Redis维护
/start_redis.sh # 启动
/stop_redis.sh # 停止
/restart_redis.sh # 重启
# Nginx维护
/start_nginx.sh # 启动
/stop_nginx.sh # 停止
/restart_nginx.sh # 重启
nginx -s reload # 重载配置(容器内)
# Tomcat维护
/start_tomcat.sh # 启动
/stop_tomcat.sh # 停止
/restart_tomcat.sh # 重启
# 统一维护
/all_start.sh # 一键启动所有服务
/all_stop.sh # 一键停止所有服务
/all_restart.sh # 一键重启所有服务
3. 宿主机常用维护命令
bash
# 查看端口占用(80、8080、6379)
ss -tlnp | grep -E "80|8080|6379"
# 宿主机直接重启Tomcat(无需进入容器)
docker exec -it java8_tomcat9_nginx126_redis74_v3 /restart_tomcat.sh
# 修改统一脚本后,重新构建镜像
cd /home/yhfx/RailwayEnvAna/java_project
docker build -t java8_tomcat9_nginx126_redis74:v3 .
十、注意事项
-
所有命令均需在宿主机执行(除容器内维护命令外),且默认路径为
/home/yhfx/RailwayEnvAna/java_project,请勿随意修改路径。 -
宿主机目录权限必须为777,否则会出现挂载失败、日志无法写入等问题,配置文件复制后会自动授权。
-
配置文件复制步骤(第六步)必须在构建镜像后、启动容器前执行,否则宿主机空目录会覆盖容器内默认配置。
-
镜像和容器版本号统一为v3,因Dockerfile有修改,必须重新构建镜像,否则配置不生效。
-
修改宿主机映射目录下的配置文件(Nginx/Redis/Tomcat conf)后,需重启对应服务或容器,配置才能生效。
-
容器开机自启依赖
--restart=always参数,服务器重启后,容器会自动启动,无需手动操作。 -
已删除Nginx的UTF-8配置,若出现Nginx中文乱码,可手动在宿主机
nginx_folder/conf/nginx.conf中添加配置。 -
Tomcat conf目录映射后,可直接在宿主机修改配置,无需进入容器,修改后重启Tomcat即可生效。