如何将Laravel Sail的Docker化应用迁移至另一台计算机?
当然可以实现,核心是把Laravel应用代码、MySQL镜像、MySQL数据这三部分打包迁移,新机器上按步骤恢复即可。以下是具体操作:
一、打包Laravel应用文件
直接把你的Laravel项目根目录打包,建议排除不需要的依赖目录来缩小体积:
tar -czf laravel-app.tar.gz /path/to/your/laravel-project \ --exclude='vendor' \ --exclude='node_modules' \ --exclude='storage/logs'
- 解释:
vendor和node_modules可以在新机器上重新安装,日志文件没必要迁移。如果嫌后续安装麻烦,也可以不排除这些目录,直接打包整个项目。
二、处理MySQL的镜像与数据
1. 导出MySQL数据库数据
先找到你的MySQL容器名(用docker ps查看,一般是{你的项目名}-mysql-1),然后进入容器:
sail exec mysql bash
导出数据库(假设你的Laravel数据库名为laravel):
mysqldump -u root -p laravel > /var/lib/mysql/laravel-db.sql
输入MySQL密码(默认是password,改了就用你的自定义密码),然后输入exit退出容器。
把导出的SQL文件复制到本地项目目录:
docker cp {你的容器名}:/var/lib/mysql/laravel-db.sql ./
2. 导出MySQL镜像为本地文件
查看当前使用的MySQL镜像版本:
docker images | grep mysql
比如Laravel Sail常用的是mysql:8.0,然后导出镜像:
docker save -o mysql-sail-image.tar mysql:8.0
三、新机器上恢复并启动
1. 传输文件
把laravel-app.tar.gz、laravel-db.sql、mysql-sail-image.tar这三个文件传到新机器(用scp、U盘或其他方式都行)。
2. 导入MySQL镜像
在新机器上加载镜像:
docker load -i mysql-sail-image.tar
3. 解压并配置Laravel应用
# 解压应用文件到目标目录 tar -xzf laravel-app.tar.gz -C /path/to/your/new/project cd /path/to/your/new/project # 复制.env配置文件,确保数据库参数和原机器一致 cp .env.example .env # 这里可以编辑.env,确认DB_DATABASE、DB_USERNAME、DB_PASSWORD和之前的配置匹配 # 安装Composer依赖(如果之前排除了vendor目录) composer install # 启动Sail容器 ./vendor/bin/sail up -d
4. 导入MySQL数据
先把SQL文件复制到MySQL容器内:
./vendor/bin/sail cp ./laravel-db.sql mysql:/var/lib/mysql/
然后进入容器导入数据:
./vendor/bin/sail exec mysql bash # 创建数据库(如果Sail启动时没自动创建的话) mysql -u root -p -e "CREATE DATABASE laravel;" # 导入数据 mysql -u root -p laravel < /var/lib/mysql/laravel-db.sql
完成后输入exit退出容器即可。
可选:直接迁移整个MySQL容器(快捷但灵活度低)
如果不想分开处理镜像和数据,也可以直接打包整个运行中的MySQL容器:
docker export {你的容器名} > mysql-container.tar
新机器上导入并创建镜像:
docker import mysql-container.tar mysql-sail-custom
然后在docker-compose.yml里修改MySQL镜像为mysql-sail-custom,启动即可。不过这种方式可能会携带原机器的容器配置,不如分开镜像和数据的方式稳定。
为什么不直接迁移整个容器?
Docker的核心价值是镜像的可复用性,容器是镜像的运行实例,依赖原机器的存储、网络等环境,直接迁移容器容易出现兼容性问题。而迁移镜像+应用代码+数据的方式,既能保证环境一致,又能在新机器上灵活调整配置,是更稳妥的方案。
内容的提问来源于stack exchange,提问作者Tamás László

