国产化环境统信UOS系统离线部署
下载/安装docker/docker-compose
docker-compose-linux-aarch64
注意:一定要选文件名带
linux-aarch64的版本。https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-aarch64
shell# 1. 把它移动到系统命令目录(需要 sudo 权限) sudo cp docker-compose-linux-aarch64 /usr/bin/docker-compose # 2. 赋予它“可执行”的权力(这一步最关键,否则系统会把它当普通文件) sudo chmod +x /usr/bin/docker-compose # 3. 验证一下 docker-compose --versiondocker-26.1.4.tgz
https://download.docker.com/linux/static/stable/aarch64/
shell#1. 解压 tar -zxvf docker-26.1.4.tgz #2. 复制二进制文件 sudo cp docker/* /usr/bin/ #3. 赋予执行权限 sudo chmod +x /usr/bin/docker* sudo chmod +x /usr/bin/containerd* sudo chmod +x /usr/bin/runc sudo chmod +x /usr/bin/ctr docker version #创建必要的目录(仅第一次需要) sudo mkdir -p /var/lib/docker sudo mkdir -p /etc/docker #后台启动守护进程 sudo dockerd > /tmp/docker.log 2>&1 & #验证是否成功 docker ps #如果有问题 #将你的用户加入 docker 组 sudo groupadd docker sudo usermod -aG docker $USER newgrp docker ## 尝试启动 #!/bin/bash # 启动 Docker 守护进程 sudo dockerd > /dev/null 2>&1 & sleep 3 echo "Docker 已启动!" # 顺便检查一下镜像状态 docker images #如果报错 running modprobe bridge br)netfilter failed with message: modprobe: ERROR ../libkmod.c 。。。。 #在启动 dockerd 时,加上两个关键参数:--bridge=none(禁用默认网桥)或更常用的 --iptables=false。 #请尝试执行以下命令: #--iptables=false: 告诉 Docker 不要去动系统的防火墙规则,这样它就不会去调用报错的 br_netfilter。 #--ip-masq=false: 禁用 IP 伪装。 sudo dockerd --iptables=false --ip-masq=false > /dev/null 2>&1 &封装一下一键启动
创建文件
~/up.shshell#!/bin/bash # 启动 Docker 守护进程 sudo dockerd > /dev/null 2>&1 & sleep 3 echo "Docker 已启动!" # 顺便检查一下镜像状态 docker images给权限
shellchmod +x ~/up.sh #以后每次开机,你只需要在终端输入 ./up.sh 就能一键进入开发状态了。
下载/安装java
OpenJDK8U-jdk_aarch64_linux_hotspot_8u482b08.tar.gzshell#1. 解压 tar -zxvf OpenJDK8U-jdk_aarch64_linux_hotspot_8u422b05.tar.gz #2. 移动到 /opt 目录 sudo mv jdk8u482-b08 /opt/jdk8 #3. 配置环境变量 nano ~/.bashrc #文件末尾添加 export JAVA_HOME=/opt/jdk8 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar #按 Ctrl + O(保存),然后按 回车 确认。 #按 Ctrl + X(退出编辑器)。 #让配置立即生效 source ~/.bashrc java -version
拉取 ARM64 版镜像
(Redis/Nginx/MySQL)
拉不动就多拉几次或者上魔法
shell
# 拉取 Redis 6.2 ARM 镜像
docker pull --platform linux/arm64 redis:6.2
# 拉取 Nginx ARM 镜像
docker pull --platform linux/arm64 arm64v8/nginx:stable
# 拉取 MySQL 8 ARM 镜像
docker pull --platform linux/arm64 arm64v8/mysql:8.0
# 备选方案:如果 MySQL 8 跑不起来,用这个
docker pull --platform linux/arm64 mariadb:10.6
# 2. 检查一下镜像 ID,确认架构是否正确
# 看到 Architecture: arm64 就对了
docker inspect redis:6.2 | findstr /i "Architecture"
docker inspect arm64v8/nginx:stable | findstr /i "Architecture"
docker inspect arm64v8/mysql:8.0 | findstr /i "Architecture"
docker inspect mariadb:10.6 | findstr /i "Architecture"
# 3. 将镜像导出为 tar 包(存到你的 光盘 里)
#docker save -o redis_arm64.tar redis:6.2 ## 我这里报错 使用下面的export导出
docker save -o nginx_arm64.tar arm64v8/nginx:stable
docker save -o mysql8_arm64.tar arm64v8/mysql:8.0
# MySQL备选方案
#docker save -o mariadb_arm64.tar mariadb:10.6 ## 我这里报错 使用下面的export导出如果导出报错
shell
## redis
# 1. 创建一个名为 temp_redis 的临时容器(指定平台为 arm64,不要启动)
docker create --name temp_redis --platform linux/arm64 redis:6.2
# 2. 将容器的文件系统导出为 tar 包
docker export -o redis_arm64.tar temp_redis
# 3. 删除临时容器
docker rm temp_redis
## nginx 上面已经成功了 这里不需要导了
## 1. 创建一个名为 temp_nginx 的临时容器(指定平台为 arm64,不要启动)
#docker create --name temp_nginx --platform linux/arm64 arm64v8/nginx:stable
## 2. 将容器的文件系统导出为 tar 包
#docker export -o nginx_arm64.tar temp_nginx
## 3. 删除临时容器
#docker rm temp_nginx
# 1. 创建一个名为 temp-db 的临时容器(不启动)
docker create --name temp-db --platform linux/arm64 mariadb:10.6
# 2. 尝试再次 save
docker save -o mariadb_arm64.tar mariadb:10.6
# 3. 如果成功了,删掉临时容器
docker rm temp-db
###4. (如果 save 彻底失效)上面还是失败,使用 docker export
docker create --name temp-db --platform linux/arm64 mariadb:10.6
docker export -o mariadb_arm64_export.tar temp-db
docker rm temp-db
########################
#更新 `docker-compose.yml`
version: '3.8'
services:
redis:
image: redis:6.2
container_name: redis_service
restart: always
network_mode: host
# 手动指定启动命令,因为 import 进来的镜像没有默认命令
entrypoint: ["redis-server"]
command: ["--requirepass", "你的密码", "--appendonly", "yes"]
volumes:
- ./redis_data:/data
# 3. Redis (由 docker export 导出,必须手动指定运行命令)
redis:
image: redis:6.2
container_name: redis
restart: always
network_mode: host
# 关键:因为是 export 导入的,必须手动补上启动命令
entrypoint: ["redis-server"]
command: ["--requirepass", "your_redis_password", "--appendonly", "yes"]
volumes:
- ./redis_data:/data离线统信系统导入
shell
# 对于 save 导出的镜像 (Nginx, MySQL)
sudo docker load -i nginx_arm64.tar
sudo docker load -i mysql8_arm64.tar
# 找回名字 (假设 ID 还是 89defed21146) 我这里实际没有这样操作
#docker tag 89defed21146 nginx:stable
#docker tag 17f8c1d33450 mysql:8.0
# 对于 export 导出的镜像 (Redis)
cat redis_arm64.tar | sudo docker import - redis:6.2
# 使用 import 导入,并贴上标签
#cat redis_arm64.tar | docker import - redis:6.2
# 对于 export 导出的镜像 如果 不是save导出的
# 导入 Nginx
#cat nginx_arm64.tar | docker import - nginx:stable
# 导入 MariaDB
#cat mariadb_arm64.tar | docker import - mariadb:10.6为什么 docker save 总报错?
这是因为 Docker Desktop 的新版存储引擎(containerd integration)在处理非本地架构镜像的索引时存在同步问题。
export 相当于直接“剥皮取肉”,虽然丢掉了镜像的历史层信息,但对于你离线部署运行程序来说完全足够了。
nginx捞出默认配置
shell
# 1. 停止当前的 Compose(防止占用)
sudo docker-compose down
# 2. 临时启动一个纯净的 Nginx 容器(不要挂载,直接跑)
sudo docker run -d --name temp_n nginx:stable
# 3. 将容器里原本的 html 文件拷贝到你的宿主机目录下
sudo docker cp temp_n:/usr/share/nginx/html/. ./html/
# 4. 将容器里的默认配置也捞出来(如果你也挂载了 conf.d)
sudo docker cp temp_n:/etc/nginx/conf.d/. ./conf.d/
# 5. 删掉临时容器
sudo docker rm -f temp_n
# 6. 重新启动你的 Compose
sudo docker-compose up -d
# 给 html 目录读权限,给 logs 目录写权限
sudo chmod -R 755 ./html
sudo chmod -R 755 ./conf.d
sudo chmod -R 777 ./logs启动容器
yaml
nginx