You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

跨机器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 --versiondocker-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 ps
    
    看到所有服务的状态都是Up就说明正常运行了。
  • 测试应用:把你的PHP代码放到~/lamp-stack/www目录里,访问VPS的公网IP,就能看到你的应用了。
  • 测试MySQL连接:可以进PHP容器测试连接是否正常:
    docker-compose exec php mysql -h mysql -u app_user -p
    
    输入你设置的app_user_pwd,能进入MySQL命令行就说明连接没问题。

第四步:迁移到新机器的最简步骤

等你需要迁移的时候,只需要做这几步:

  1. 在新机器上重复第一步,安装好Docker和Docker Compose。
  2. 从旧机器复制以下内容到新机器的相同目录(比如~/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 /data
        
        这会在当前目录生成mysql-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
        
  3. 在新机器的~/lamp-stack目录下运行:
    docker-compose up -d
    
    等容器启动完成,你的整个LAMP环境就和旧机器完全一致了,连数据都分毫不差!

额外的小建议

  • 把敏感信息(比如MySQL密码)放到.env文件里,这样不用写在docker-compose.yml里,更安全。比如创建.env文件:
    MYSQL_ROOT_PASSWORD=your_secure_pwd
    MYSQL_DATABASE=app_db
    MYSQL_USER=app_user
    MYSQL_PASSWORD=app_user_pwd
    
    然后docker-compose.yml里的环境变量改成${MYSQL_ROOT_PASSWORD}这种形式,Compose会自动读取.env里的值。
  • 如果需要HTTPS,可以在Apache容器里配置SSL证书,或者再加一个Nginx反向代理容器,不过基础场景用上面的配置足够。
  • 定期备份www目录和mysql-backup.tar.gz,避免意外数据丢失。

内容的提问来源于stack exchange,提问作者charles vlug

火山引擎 最新活动