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 数据同步实现快速迁移部署。


Read more

患者 AI 消息预警平台 — 技术方案

· v1.0 · 2026-06-30 把「采集库里的患者体征 → 丢给 AI 研判 → 把风险预警实时推给医护」这条链路,做成一个独立、可靠、可追溯的后台平台。支持多条产品线,一期接入**重症(ICU)和麻醉(ANES)**两条产品线。 文中关键参数(查库周期、AI 并发/超时、容量等)附默认值和测算过程。 一、为什么单独建一个项目 体征数据已经由采集系统写进了数据库。我们要做的是中间这段:定时取数 → 调 AI → 拿结果 → 推送前端,并保证全程不丢、可查、可统计。 平台不做两件事:不做体征采集入库(采集系统已有),不做 AI 模型(AI 团队提供 HTTP 接口)。 采集库由其他部门维护,

By 周天浩

患者 AI 消息预警平台 — 技术方案

· v1.0 · 2026-06-30 把「采集库里的患者体征 → 丢给 AI 研判 → 把风险预警实时推给医护」这条链路,做成一个独立、可靠、可追溯的后台平台。支持多条产品线,一期接入**重症(ICU)和麻醉(ANES)**两条产品线。 文中关键参数(查库周期、AI 并发/超时、容量等)附默认值和测算过程。 一、为什么单独建一个项目 体征数据已经由采集系统写进了数据库。我们要做的是中间这段:定时取数 → 调 AI → 拿结果 → 推送前端,并保证全程不丢、可查、可统计。 平台不做两件事:不做体征采集入库(采集系统已有),不做 AI 模型(AI 团队提供 HTTP 接口)。 采集库由其他部门维护,

By 周天浩