第一步:有网服务器准备
- 拉取镜像
bash
bash
docker pull mysql:8.0.46
docker pull redis:7.4
docker pull nginx:1.31
- 创建数据目录
bash
bash
mkdir -p /data/docker/mysql/{conf,data,logs}
mkdir -p /data/docker/redis/{conf,data}
mkdir -p /data/docker/nginx/{conf,html,logs}
- 准备 Redis 配置文件
bash
bash
cat > /data/docker/redis/conf/redis.conf << 'EOF'
bind 0.0.0.0
port 6379
daemonize no
appendonly yes
appendfilename "appendonly.aof"
requirepass Hz@2025
EOF
- 创建容器(不启动)
创建 MySQL 容器
bash
docker create --name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=Hz@2025 \
-v /data/docker/mysql/conf:/etc/mysql/conf.d \
-v /data/docker/mysql/data:/var/lib/mysql \
-v /data/docker/mysql/logs:/var/log/mysql \
mysql:8.0.46
创建 Redis 容器
bash
docker create --name redis \
-p 6379:6379 \
-v /data/docker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /data/docker/redis/data:/data \
redis:7.4 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
创建 Nginx 容器
bash
docker create --name nginx \
-p 80:80 \
-p 443:443 \
-v /data/docker/nginx/conf:/etc/nginx/conf.d \
-v /data/docker/nginx/html:/usr/share/nginx/html \
-v /data/docker/nginx/logs:/var/log/nginx \
nginx:1.31
- 验证容器创建成功
bash
bash
docker ps -a | grep -E 'mysql|redis|nginx'
应该看到三个容器状态都是 Created 查看所有容器
bash
docker ps -a
第二步:只打包需要的镜像和数据
方法一:导出镜像为 tar 文件(推荐)
bash
1. 导出三个镜像
bash
docker save -o /tmp/docker-down/mysql.tar mysql:8.0.46
docker save -o /tmp/docker-down/redis.tar redis:7.4
docker save -o /tmp/docker-down/nginx.tar nginx:1.31
2. 导出容器的配置(通过 inspect)
bash
docker inspect mysql > /tmp/docker-down/mysql-config.json
docker inspect redis > /tmp/docker-down/redis-config.json
docker inspect nginx > /tmp/docker-down/nginx-config.json
3. 打包应用数据目录
bash
#tar -czf /tmp/docker-down/app-data.tar.gz /data/
4. 准备 Docker 离线安装包
bash
wget https://download.docker.com/linux/static/stable/x86_64/docker-27.3.1.tgz -O /tmp/docker.tgz
5. 复制 systemd 服务文件
bash
#cp /lib/systemd/system/docker.service /tmp/
#cp /lib/systemd/system/docker.socket /tmp/
6. 创建迁移目录
bash
mkdir -p /tmp/migration
7. 移动所有文件
bash
mv /tmp/jdk1.8.0_371.tar.gz /tmp/migration/
bash
mv /tmp/docker-down/mysql.tar /tmp/migration/
mv /tmp/docker-down/redis.tar /tmp/migration/
mv /tmp/docker-down/nginx.tar /tmp/migration/
mv /tmp/docker-down/mysql-config.json /tmp/migration/
mv /tmp/docker-down/redis-config.json /tmp/migration/
mv /tmp/docker-down/nginx-config.json /tmp/migration/
#mv /tmp/docker-down/app-data.tar.gz /tmp/migration/
mv /tmp/docker.tgz /tmp/migration/
#mv /tmp/docker.service /tmp/migration/
#mv /tmp/docker.socket /tmp/migration/
8. 创建 Docker 安装脚本
bash
cat > /tmp/migration/install-docker.sh << 'EOF'
#!/bin/bash
echo "开始安装 Docker..."
# 解压 Docker 二进制
sudo tar -xvf docker.tgz -C /usr/bin/ --strip-components=1
# 创建 docker 用户组
sudo groupadd docker 2>/dev/null
sudo usermod -aG docker $USER
# 创建 Docker 服务文件
sudo cat > /etc/systemd/system/docker.service << 'DOCKER_SERVICE'
[Unit]Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=alwaysStartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target
DOCKER_SERVICE
# 创建 Docker socket 文件
sudo cat > /etc/systemd/system/docker.socket << 'DOCKER_SOCKET'
[Unit]
Description=Docker Socket for the API
PartOf=docker.service
[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
DOCKER_SOCKET
# 启动 Docker
sudo systemctl daemon-reload
sudo systemctl enable docker
sudo systemctl start docker
echo "Docker 安装完成!"
docker --version
EOF
9. 设置脚本文件权限
bash
chmod +x /tmp/migration/install-docker.sh
10. 创建容器恢复脚本
bash
cat > /tmp/migration/restore-containers.sh << 'EOF'
#!/bin/bash
echo "开始恢复容器..."
# 导入镜像
echo "导入镜像..."
docker load -i mysql.tar
docker load -i redis.tar
docker load -i nginx.tar
# 创建 MySQL 容器
echo "创建 MySQL 容器..."
docker create --name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=Hz@2025 \
-v /data/docker/mysql/conf:/etc/mysql/conf.d \
-v /data/docker/mysql/data:/var/lib/mysql \
-v /data/docker/mysql/logs:/var/log/mysql \
mysql:8.0.46
# 创建 Redis 容器
echo "创建 Redis 容器..."
docker create --name redis \
-p 6379:6379 \
-v /data/docker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /data/docker/redis/data:/data \
redis:7.4 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
# 创建 Nginx 容器
echo "创建 Nginx 容器..."
docker create --name nginx \
-p 80:80 \
-p 443:443 \
-v /data/docker/nginx/conf:/etc/nginx/conf.d \
-v /data/docker/nginx/html:/usr/share/nginx/html \
-v /data/docker/nginx/logs:/var/log/nginx \
nginx:1.31
# 启动容器
echo "启动容器..."
docker start mysql redis nginx
# 设置开机自启
docker update --restart=always mysql
docker update --restart=always redis
docker update --restart=always nginx
echo "所有容器已成功启动!"
docker ps | grep -E 'mysql|redis|nginx'
EOF
bash
chmod +x /tmp/migration/restore-containers.sh
11. 创建一键恢复脚本(按顺序执行所有步骤)
bash
cat > /tmp/migration/setup-all.sh << 'EOF'
#!/bin/bash
set -e
echo "========================================="
echo "开始完整部署 MySQL、Redis、Nginx"
echo "========================================="
# 1. 解压数据
echo "步骤 1/4: 解压数据..."
sudo tar -xzf app-data.tar.gz -C /
# 2. 安装 Docker
echo "步骤 2/4: 安装 Docker..."
./install-docker.sh
# 3. 等待 Docker 启动
sleep 3
# 4. 恢复容器
echo "步骤 3/4: 恢复容器..."
./restore-containers.sh
echo "========================================="
echo "部署完成!"
echo "========================================="
echo "查看状态: docker ps | grep -E 'mysql|redis|nginx'"
echo "测试 MySQL: docker exec -it mysql mysql -uroot -p"
echo "测试 Redis: docker exec -it redis redis-cli -a your_redis_password ping"
echo "测试 Nginx: curl -I http://localhost"
EOF
bash
chmod +x /tmp/migration/setup-all.sh
12. 创建说明文件
bash
cat > /tmp/migration/README.txt << 'EOF'
==================================================
Docker + MySQL + Redis + Nginx 离线部署包
==================================================
文件说明:
1.docker.tgz - Docker 离线安装包
2.mysql.tar - MySQL 8.0.46 镜像
3.redis.tar - Redis 7.4 镜像
4.nginx.tar - Nginx 1.31 镜像
5.app-data.tar.gz - 数据目录(/data/)
6.install-docker.sh - Docker 安装脚本
7.restore-containers.sh - 容器恢复脚本
8.setup-all.sh - 一键部署脚本(推荐)
部署步骤(推荐):
1.将整个 migration 目录拷贝到离线服务器
2.进入目录:cd /tmp/migration
3.执行一键部署:./setup-all.sh
或者手动部署:
1.解压数据:sudo tar -xzf app-data.tar.gz -C /
2.安装 Docker:./install-docker.sh
3.恢复容器:./restore-containers.sh
注意:
- 请修改 restore-containers.sh 中的 MySQL 密码(your_mysql_password)
- 请修改 redis.conf 中的 Redis 密码(your_redis_password)
- 确保端口 3306、6379、80、443 没有被占用
验证命令:
docker ps | grep -E 'mysql|redis|nginx'
docker exec -it mysql mysql -uroot -p
docker exec -it redis redis-cli -a your_redis_password ping
curl -I http://localhost
EOF
13. 查看打包结果
bash
ls -lh /tmp/migration/
第三步:离线服务器恢复
方式一:一键部署(推荐)
1. 将 /tmp/migration 目录拷贝到离线服务器
可以使用 U 盘、scp、rsync 等方式
2. 进入目录
bash
cd /tmp/migration
3. 执行一键部署
bash
./setup-all.sh
方式二:手动部署
bash
cd /tmp/migration
1. 解压数据
bash
sudo tar -xzf app-data.tar.gz -C /
2. 安装 Docker
bash
./install-docker.sh
3. 恢复容器
bash
./restore-containers.sh
最终打包内容
bash
text
/tmp/migration/
├── docker.tgz # Docker 离线安装包
├── mysql.tar # MySQL 镜像
├── redis.tar # Redis 镜像
├── nginx.tar # Nginx 镜像
├── app-data.tar.gz # /data/ 数据目录
├── install-docker.sh # Docker 安装脚本
├── restore-containers.sh # 容器恢复脚本
├── setup-all.sh # 一键部署脚本(推荐)
└── README.txt # 说明文件
验证部署
bash
查看 Docker 版本
bash
docker --version
查看容器状态
bash
docker ps | grep -E 'mysql|redis|nginx'
测试 MySQL
bash
docker exec -it mysql mysql -uroot -p
测试 Redis
bash
docker exec -it redis redis-cli -a your_redis_password ping
测试 Nginx
bash
curl -I http://localhost
查看端口监听
bash
sudo ss -tlnp | grep -E '3306|6379|80|443'