ubuntu系统docker只导出需要的镜像和容器配置安装到离线服务器

第一步:有网服务器准备

  1. 拉取镜像
bash 复制代码
bash
docker pull mysql:8.0.46
docker pull redis:7.4
docker pull nginx:1.31
  1. 创建数据目录
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}
  1. 准备 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
  1. 创建容器(不启动)

创建 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
  1. 验证容器创建成功
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'