迁移Docker容器及数据
迁移Docker容器及数据
小码同学前言
最近领了一台服务器,感觉闲着也是闲着,倒不如拿来挂一下PT,赚点魔力值也不错,就想安装一下Transmission,但拉取镜像的时候发现,它更新了,并且已经移除了第三方的UI页面,变得好丑好丑的界面,忍不了,得换个好看的。
我在另外的两台服务器也有部署到Transmission这个服务,但以前拉取的镜像,我忘记是哪个版本了,那时候拉取的镜像时最新版latest,没办法根据这个标签来定位镜像,想想倒不如直接将现在这个容器打包复制到这台新服务器上,这样也不用到处找了。
迁移Docker我认为有两个方式:
- 复制docker-compose.yml文件内容+挂载数据到新服务器
(推荐)
- 打包整个容器成新镜像,将新镜像打包成tar压缩包复制到新服务器
下面演示这两种方式都演示一遍,方便你的选择。
容器数据
可能你有个疑问,如果这个容器里面有什么数据,打包后这些数据怎么办?
答:我们一般在运行docker容器前会设置重要的数据进行挂载到宿主机,这样是为了数据持久化,保证数据不会因为容器的停止而丢失。
当我们有挂载数据到宿主机时,我们可以直接复制这些数据到新的服务器上,并且将docker服务的挂载路径设置为这些数据就好了。
方案一:docker-compose(推荐)
使用Docker 容器如果会产生存储数据,一直要做持久化操作,也就是挂载容器的数据到宿主机,这样后面迁移Docker服务就直接复制docker-compose和挂载的数据就可以完成迁移了。
缺点:不能打包容器产生的数据
优点:方便,直接复制docker-compose内容到其他docker-compose就可以运行,不需要繁琐的配置方法
适用范围: 需要快速部署,并且没有对容器内部修改过的
- 压缩数据并复制到新服务器
- 运行新服务器的docker服务
压缩挂载数据并复制到新服务器
我们的docker-compose.yml
都在bitwarden
文件夹里面了,数据也在里面,所以我们可以将整个压缩包打包发送到新服务器上面,这样就不用分次复制数据和docker-compose.yml
了。
1. 压缩文件夹
1 | tar cvf bitwarden.tar ./bitwarden |
压缩bitwarden
文件夹保存到当前目录下,压缩包名为bitwarden.tar
2. 传输文件
复制刚刚压缩好的压缩包到新服务器上
1 | scp ./bitwarden.tar username@192.168.2.5:/home/docker/ |
运行新服务器的docker服务
1. 解压压缩包
1 | tar xvf ./bitwarden.tar |
2. 启动docker服务
1 | cd bitwarden # 进入解压目录 |
方案二:打包容器
流程
- 停止正在运行的Transmission容器
- 使用
docker commit
命令将容器转换为映像 - 使用
docker save
命令将映像保存为.tar文件 - 将.tar文件复制到另一台服务器。
- 在另一台服务器上,使用
docker load
命令将.tar文件加载为Docker映像 - 使用新加载的映像启动Transmission容器
停止需要打包的容器
查看当前需要打包的容器
1 | docker ps |
找到容器名,停止该容器
1 | docker stop 容器名 |
打包容器
停止容器后,将容器保存为一个新的镜像,
1 | docker commit 容器名 新镜像名 |
将镜像打包成压缩包
使用docker save命令,将镜像保存为压缩包,之后通过这个压缩包传送到其他服务器上,再将压缩包加载为镜像,就可以直接使用这个镜像了。
1 | docker save 镜像名 > 新压缩包名.tar |
如果你想指定存储位置,也可以使用以下命令:
docker save -o 存储路径/file.tar 新镜像名
传送压缩包到其他服务器
下面是一个例子,将服务器A的文件上传到服务器B。
服务器A的文件路径路径是绝对路径或相对路径。
服务器B的路径必须是绝对路径。
1 | scp 服务器A文件路径 用户名@IP地址:服务器B文件路径 |
将压缩包加载为镜像
另一台服务器上,使用docker load
命令将.tar文件加载为Docker映像。
打开transmission-image.tar
压缩包所在的位置,或者使用绝对路径也行。
1 | docker load < transmission-image.tar |
查看镜像
进过上面的步骤,已经将容器加载为镜像了,接下来我们平时应该怎么部署容器就这么部署了。
1 | docker images |
编写docker-compose.yml
1 | version: "2.1" |
查看容器运行情况
1 | docker ps |
总的来说,还是挺简单的,将容器保存成镜像,然后将镜像打包成压缩包,在另一台服务器加载压缩包到docker镜像中。