docker迁移记录

Wen 发布于 2025-01-16 4371 次阅读


背景

阿里云最近开了个200M(最高带宽)的轻量,感觉不错,比我原来的35M的好多了,价格也贵不了多少,就是配置不一样,不过我对配置的要求不是很高。同时看到阿里云国际有半折券,所以就觉得把原来一台国内阿里云账号买的香港轻量换了(也快过期了),这里多谢某位帮我支付的大佬,才能在半折券过期前用上

概括

旧的阿里云轻量上面有这些服务,wordpress,alist,xray,除了xray其余均是docker挂载的,xray就不必做迁移了,新机器用别的协议,下面就是大体的迁移步骤
1. 使用docker save指令备份docker容器
2. 使用临时docker容器打包数据卷(volume)的数据
3. 备份出来的数据下载和上传
4. 数据卷(volume)数据导入
5. docker容器导入
6. 容器启动,完毕

docker备份

docker有提供导入和导出容器指令,但我没有用采取,而是用save的指令(开始我以为数据卷save指令也会保存,后来才知道不会)
指令这里以wordpress为例,我的wordpress是使用docker-compose.yml文件创建的,以下是内容

services:
  wp-db:
    # We use a mariadb image which supports both amd64 & arm64 architecture
    image: mariadb:10.6.17-focal
    # If you really want to use MySQL, uncomment the following line
    #image: mysql:8.0.27
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=wp
      - MYSQL_USER=wp
      - MYSQL_PASSWORD=wp
  wordpress:
    image: wordpress:latest
    volumes:
      - wp_data:/var/www/html
    ports:
      - 8080:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=wp-db
      - WORDPRESS_DB_USER=wp
      - WORDPRESS_DB_PASSWORD=password
      - WORDPRESS_DB_NAME=wp
volumes:
  db_data:
  wp_data:

docker容器备份

在使用save指令导出容器前,我们需要提交一下容器,创建个容器快照

docker commit -p b734d6f container-backup-db

其中b734d6f是我wordpress容器的容器ID,使用docker ps -a查看,后面是名字,起个好辨别的即可
然后使用save指令导出这个镜像

docker save 8f1fbe6b > wordpress.tar

8f1fbe6b是镜像ID,使用docker images指令查看,然后我们就得到了wordpress.tar这个备份的容器文件了

数据卷备份

可以看到这里我挂载了两个数据卷,由于docker没有提供数据卷的导出之类的工具,我们采取创建个临时容器挂载数据卷,然后映射宿主机的目录到临时容器,然后打包数据券的数据,以下是备份数据库的数据卷的指令

docker run --rm --volumes-from wordpress-blog-wp-db-1 -v ~/backup:/backup alpine tar cvf /backup/wp-db.tar /var/lib/mysql

其中--rm是在退出后删除这个容器,--volumes-from则是指定容器的容器名,-v就是挂载宿主机的目录到容器中,然后是使用的镜像,再然后是打包指令,最后的打包的数据库文件路径
执行完后,宿主机的~/backup目录里面就保留我们备份的文件
另一个wp_data类似,就不贴出指令了

备份文件下载上传

这个没什么好说的,既可以使用ssh工具下载上传,也可以直接使用ssh指令

数据卷导入

在导入容器前,先把数据卷导入好吧

先使用以下指令创建一个数据卷

docker volume create db_data

我们依旧使用导出数据卷的类似方法,使用临时容器解压备份的文件

docker run --rm -v db_data:/var/lib/mysql -v ~/backup:/backup alpine sh -c "cd /var/lib/mysql && tar xvf /backup/alist.tar --strip 3"

我们这里就直接挂载这个数据卷到容器中,需要注意的是最后的--strip 3这个应为是我们打包的时候会把路径的层级也打包进来了,前面我们已经使用cd指令进去目标位置了,我这有三层不需要的路径层级,所以是3
wp_data的备份数据也类似操作导入,这里也不贴指令和说明

镜像导入

镜像导入简单,使用以下指令导入

docker load < wordpress.tar

导入后,使用docker images指令可以看到新的镜像,但没有NAMETAG
使用以下指令打上tag

docker tag 43e0e wordpress-back:latest

docker容器启动

这里我直接使用docker-compose.yml创建

services:
  wp-db:
    # We use a mariadb image which supports both amd64 & arm64 architecture
    image: mariadb-backup:10.6.17-focal
    networks:
      - nginx_default

    # If you really want to use MySQL, uncomment the following line
    #image: mysql:8.0.27
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=wp
      - MYSQL_USER=wp
      - MYSQL_PASSWORD=wp
  wordpress:
    # 是的这里是使用我们打的tag,不然会是从镜像库拉取镜像
    image: wordpress-backup:latest
    networks:
      - nginx_default
    volumes:
      - wp_data:/var/www/html
    restart: always
    environment:
      - WORDPRESS_DB_HOST=wp-db
      - WORDPRESS_DB_USER=wp
      - WORDPRESS_DB_PASSWORD=password
      - WORDPRESS_DB_NAME=wp

networks:
  nginx_default:
    external: true

volumes:
  db_data:
    # 需要加上这个,说明是使用已有的数据卷
    external: true
  wp_data:
    external: true

你可能发现这个docker-compose.yml和开始的不一样,因为新机器是使用nginx做反代,统一管理,容器不映射端口到宿主机,关于这个,可以看我这篇文章docker部署多网站的说明

至此备份数据迁移的工作已完成

此作者没有提供个人介绍
最后更新于 2025-01-16