跨机器Docker可移植部署:VPS迁移LAMP服务实操咨询
嘿,这个需求我刚好折腾过好几次,用Docker来做确实是迁移最省心的方案,尤其是针对LAMP这种经典组合。下面给你拆解最简便的实现步骤,从新服务器安装到后续迁移全给你捋清楚:
最核心的思路:Docker Compose + 数据持久化
单独跑Docker容器虽然也能行,但用Docker Compose来管理整个LAMP栈会更清晰,迁移的时候只需要复制几个关键文件和数据备份,就能在新机器一键恢复,完全不用重新编译安装组件。
第一步:在新VPS上搭好Docker基础环境
假设你用的是Debian/Ubuntu系的服务器(目前VPS最常用的),执行以下命令安装Docker和Docker Compose:
- 先更新系统包:
sudo apt update && sudo apt upgrade -y - 安装Docker依赖工具:
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y - 添加Docker官方源的GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg - 配置Docker软件源:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - 安装Docker引擎:
sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io -y - 安装Docker Compose(直接拉取最新稳定版):
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose - 验证安装成功:运行
docker --version和docker-compose --version,能看到版本号就没问题。
第二步:用Docker Compose定义你的LAMP环境
创建一个专门的项目目录来管理所有配置和数据,比如:
mkdir ~/lamp-stack && cd ~/lamp-stack
然后在这个目录下创建docker-compose.yml文件,内容如下(我给你配了最常用的PHP 8.2 + MySQL 8.0组合,你可以根据需要改版本):
version: '3.8' services: # Apache服务 apache: image: httpd:latest ports: - "80:80" # 映射主机80端口到容器80 - "443:443" # 可选:如果需要HTTPS就打开 volumes: - ./www:/usr/local/apache2/htdocs/ # 把主机的www目录挂载到Apache的网页根目录 - ./apache-conf:/usr/local/apache2/conf/ # 可选:挂载自定义Apache配置(比如虚拟主机) depends_on: - php - mysql # PHP服务(带Apache模块的镜像,省得自己配置PHP-FPM) php: image: php:8.2-apache volumes: - ./www:/var/www/html/ # 和Apache共享代码目录,保证PHP能读取到应用文件 - ./php-conf:/usr/local/etc/php/ # 可选:挂载自定义PHP.ini配置 depends_on: - mysql # MySQL服务 mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: your_root_pwd # 替换成你的MySQL root密码 MYSQL_DATABASE: your_app_db # 预先创建你应用需要的数据库 MYSQL_USER: app_user # 应用专用的数据库用户 MYSQL_PASSWORD: app_user_pwd # 应用用户的密码 volumes: - mysql-data:/var/lib/mysql # 用Docker命名卷持久化MySQL数据,避免容器销毁丢失数据 # 定义命名卷,Docker会自动管理存储位置 volumes: mysql-data:
重点说明:
- 命名卷
mysql-data:这是最关键的部分,它会把MySQL的数据存在Docker管理的安全目录里,比直接挂载主机目录更稳定,迁移的时候只需要备份这个卷就行。 www目录:你的PHP应用代码直接放在这个目录里,不管是本地修改还是迁移,直接拷贝整个目录就搞定。- 如果你需要其他PHP扩展(比如mysqli、pdo_mysql),可以自己构建PHP镜像,或者用现成的带扩展的镜像(比如
php:8.2-apache默认已经带了常用扩展,不够的话可以进容器安装)。
第三步:启动并测试你的LAMP环境
- 后台启动所有服务:
docker-compose up -d - 检查容器状态:
看到所有服务的状态都是docker-compose psUp就说明正常运行了。 - 测试应用:把你的PHP代码放到
~/lamp-stack/www目录里,访问VPS的公网IP,就能看到你的应用了。 - 测试MySQL连接:可以进PHP容器测试连接是否正常:
输入你设置的docker-compose exec php mysql -h mysql -u app_user -papp_user_pwd,能进入MySQL命令行就说明连接没问题。
第四步:迁移到新机器的最简步骤
等你需要迁移的时候,只需要做这几步:
- 在新机器上重复第一步,安装好Docker和Docker Compose。
- 从旧机器复制以下内容到新机器的相同目录(比如
~/lamp-stack):docker-compose.yml文件:直接用scp或者网盘拷贝就行。www目录:里面是你的所有PHP应用代码,同样用scp -r拷贝。- 备份并恢复MySQL数据卷:因为是命名卷,不能直接拷贝目录,用Docker的备份命令:
- 在旧机器上备份:
这会在当前目录生成cd ~/lamp-stack docker run --rm -v mysql-data:/data -v $(pwd):/backup busybox tar cvzf /backup/mysql-backup.tar.gz /datamysql-backup.tar.gz备份文件。 - 把备份文件传到新机器,然后恢复:
cd ~/lamp-stack docker run --rm -v mysql-data:/data -v $(pwd):/backup busybox tar xvzf /backup/mysql-backup.tar.gz -C / --strip-components=1
- 在旧机器上备份:
- 在新机器的
~/lamp-stack目录下运行:
等容器启动完成,你的整个LAMP环境就和旧机器完全一致了,连数据都分毫不差!docker-compose up -d
额外的小建议
- 把敏感信息(比如MySQL密码)放到
.env文件里,这样不用写在docker-compose.yml里,更安全。比如创建.env文件:
然后MYSQL_ROOT_PASSWORD=your_secure_pwd MYSQL_DATABASE=app_db MYSQL_USER=app_user MYSQL_PASSWORD=app_user_pwddocker-compose.yml里的环境变量改成${MYSQL_ROOT_PASSWORD}这种形式,Compose会自动读取.env里的值。 - 如果需要HTTPS,可以在Apache容器里配置SSL证书,或者再加一个Nginx反向代理容器,不过基础场景用上面的配置足够。
- 定期备份
www目录和mysql-backup.tar.gz,避免意外数据丢失。
内容的提问来源于stack exchange,提问作者charles vlug




