linux arm cpu服务器java容器安装部署教程
Docker 部署 Java + MySQL + Redis + Nginx 一体环境
本文记录如何通过 Docker 构建一个包含 Java / MySQL / Redis / Nginx 的运行环境镜像,并迁移已有服务器数据,实现快速部署。
一、更新系统
sudo apt update && sudo apt upgrade -y
二、编写 Dockerfile
创建文件:
Dockerfile2
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
# 使用阿里云镜像源(国内推荐)
RUN sed -i 's@archive.ubuntu.com@mirrors.aliyun.com@g' /etc/apt/sources.list && \
sed -i 's@security.ubuntu.com@mirrors.aliyun.com@g' /etc/apt/sources.list
# 安装基础软件
RUN apt-get update && \
apt-get install -y \
tzdata \
openjdk-17-jdk \
mysql-server \
redis-server \
nginx \
curl \
wget \
gnupg \
lsb-release \
ca-certificates \
software-properties-common \
&& apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# 修复 mysql 用户 home 目录
RUN usermod -d /var/lib/mysql mysql && \
mkdir -p /var/run/mysqld /var/lib/mysql && \
chown mysql:mysql /var/run/mysqld /var/lib/mysql -R
# 设置时区
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone
# 创建应用目录
RUN mkdir -p \
/app \
/data/mysql \
/data/redis \
/data/nginx
# 暴露端口
EXPOSE 80 3306 6379 8081 28760 8086 8083 8082
# 复制启动脚本
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=5 \
CMD mysqladmin ping -h localhost --silent || exit 1
CMD ["/entrypoint.sh"]
三、编写容器启动脚本
创建文件:
entrypoint.sh
#!/bin/bash
set -euo pipefail
echo "========== Container starting at $(date) =========="
# ===============================
# 1. MySQL 初始化
# ===============================
echo ">>> Preparing MySQL..."
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld
if [ ! -d "/var/lib/mysql/mysql" ] || [ -z "$(ls -A /var/lib/mysql)" ]; then
echo ">>> MySQL data directory is empty → initializing..."
mysqld --initialize-insecure --user=mysql
fi
echo ">>> Starting MySQL..."
/usr/sbin/mysqld --user=mysql --bind-address=0.0.0.0 --daemonize
echo ">>> Waiting for MySQL (max 60s)..."
for i in {1..60}; do
if mysqladmin ping --silent -h localhost; then
echo "MySQL is ready!"
break
fi
sleep 1
done
if ! mysqladmin ping --silent -h localhost; then
echo "ERROR: MySQL failed to start!"
cat /var/log/mysql/error.log
exit 1
fi
# ===============================
# 2. Redis
# ===============================
echo ">>> Starting Redis..."
redis-server --daemonize yes --bind 0.0.0.0
# ===============================
# 3. Nginx
# ===============================
echo ">>> Starting Nginx..."
nginx -g 'daemon off;' &
# ===============================
# 4. Java 服务
# ===============================
if [ -f /app/xxl-job/xxl-job-admin-*.jar ]; then
echo ">>> Starting XXL-JOB..."
nohup java ${JAVA_OPTS:-} \
-jar /app/xxl-job/xxl-job-admin-*.jar \
--server.port=8081 \
> /var/log/xxl-job.log 2>&1 &
fi
if [ -f /app/ai-anes/ai-anes.jar ]; then
echo ">>> Starting ai-anes..."
nohup java ${JAVA_OPTS:-} \
-jar /app/ai-anes/ai-anes.jar \
--spring.profiles.active=prod \
--server.port=28760 \
> /var/log/ai-anes.log 2>&1 &
fi
echo "========== All services launched =========="
exec tail -f \
/dev/null \
/var/log/mysql/error.log \
/var/log/nginx/error.log \
/var/log/xxl-job.log \
/var/log/ai-anes.log 2>/dev/null
四、构建 Docker 镜像
docker build -t anes-image:v2 -f Dockerfile2 .
五、导出镜像备份
docker save -o anes-image-v2.tar anes-image:v2
六、迁移服务器数据
从旧服务器复制数据:
sudo rsync -avz --progress --no-owner --no-group --delete \
--rsync-path="sudo rsync" \
/data/ ubuntu@192.168.0.249:/data/
sudo rsync -avz --progress --no-owner --no-group --delete \
--rsync-path="sudo rsync" \
/home/ubuntu/botsoftware/ ubuntu@192.168.0.249:/home/ubuntu/botsoftware/
恢复目录权限:
sudo chown -R ubuntu:ubuntu /data
sudo chown -R ubuntu:ubuntu /home/ubuntu/botsoftware
七、启动容器
docker run -d \
--name java-env \
-p 8080:80 \
-p 8086:8086 \
-p 8083:8083 \
-p 8082:8082 \
-p 8081:8081 \
-p 28760:28760 \
-p 3306:3306 \
-p 6379:6379 \
-e LANG=C.UTF-8 \
-e LC_ALL=C.UTF-8 \
-e TZ=Asia/Shanghai \
-e JAVA_OPTS="-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai" \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro \
-v /usr/share/zoneinfo:/usr/share/zoneinfo:ro \
-v /etc/timezone:/etc/timezone:ro \
-v /data/mysql/data:/var/lib/mysql \
-v /etc/alternatives/my.cnf:/etc/mysql/conf.d/my.cnf:ro \
-v /data/redis/data:/data \
-v /data/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /data/nginx-docker/conf.d:/etc/nginx/conf.d \
-v /data/nginx-docker/empty-sites-enabled:/etc/nginx/sites-enabled \
-v /home/ubuntu/botsoftware/manageplatform/ui:/usr/share/nginx/html \
-v /home/ubuntu/botsoftware/serverside/ai-anes:/app/ai-anes \
-v /home/ubuntu/botsoftware/serverside/xxl-job:/app/xxl-job \
-v /home/ubuntu/botsoftware/serverside/license:/home/ubuntu/botsoftware/serverside/license \
-v /home/ubuntu/botsoftware/botdownload:/botdownload \
--restart unless-stopped \
anes-image:v2
八、确认数据库
确认 MySQL 正常启动并且数据库存在。
mysql -uroot -p
检查数据库:
SHOW DATABASES;
九、配置 JPom
修改配置文件:
/home/ubuntu/botsoftware/serverside/jpom/server/conf/application.yml
调整为当前服务器 IP。
然后:
1️⃣ 启动 JPom
2️⃣ 后台执行 一键初始化
3️⃣ 修改运维节点 IP 为当前服务器
十、部署完成
至此,一个包含以下组件的 Docker 环境已经部署完成:
- Java 运行环境(OpenJDK 17)
- MySQL
- Redis
- Nginx
- XXL-JOB
- AI 服务
- JPom 运维管理
整个环境可以通过 Docker 镜像 + rsync 数据同步实现快速迁移部署。