前言

最近领了一台服务器,感觉闲着也是闲着,倒不如拿来挂一下PT,赚点魔力值也不错,就想安装一下Transmission,但拉取镜像的时候发现,它更新了,并且已经移除了第三方的UI页面,变得好丑好丑的界面,忍不了,得换个好看的。

我在另外的两台服务器也有部署到Transmission这个服务,但以前拉取的镜像,我忘记是哪个版本了,那时候拉取的镜像时最新版latest,没办法根据这个标签来定位镜像,想想倒不如直接将现在这个容器打包复制到这台新服务器上,这样也不用到处找了。

迁移Docker我认为有两个方式:

  1. 复制docker-compose.yml文件内容+挂载数据到新服务器(推荐)
  2. 打包整个容器成新镜像,将新镜像打包成tar压缩包复制到新服务器

下面演示这两种方式都演示一遍,方便你的选择。

容器数据

可能你有个疑问,如果这个容器里面有什么数据,打包后这些数据怎么办?

答:我们一般在运行docker容器前会设置重要的数据进行挂载到宿主机,这样是为了数据持久化,保证数据不会因为容器的停止而丢失。

当我们有挂载数据到宿主机时,我们可以直接复制这些数据到新的服务器上,并且将docker服务的挂载路径设置为这些数据就好了。

方案一:docker-compose(推荐)

使用Docker 容器如果会产生存储数据,一直要做持久化操作,也就是挂载容器的数据到宿主机,这样后面迁移Docker服务就直接复制docker-compose和挂载的数据就可以完成迁移了。

缺点:不能打包容器产生的数据

优点:方便,直接复制docker-compose内容到其他docker-compose就可以运行,不需要繁琐的配置方法

适用范围: 需要快速部署,并且没有对容器内部修改过的

  1. 压缩数据并复制到新服务器
  2. 运行新服务器的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
2
cd bitwarden # 进入解压目录
docker-compose up -d # 运行docker-compose

方案二:打包容器

流程

  1. 停止正在运行的Transmission容器
  2. 使用docker commit命令将容器转换为映像
  3. 使用docker save命令将映像保存为.tar文件
  4. 将.tar文件复制到另一台服务器。
  5. 在另一台服务器上,使用docker load命令将.tar文件加载为Docker映像
  6. 使用新加载的映像启动Transmission容器

停止需要打包的容器

查看当前需要打包的容器

1
docker ps

找到容器名,停止该容器

1
docker stop 容器名

01-当前需要打包的容器-20230427-606

打包容器

停止容器后,将容器保存为一个新的镜像,

1
docker commit 容器名 新镜像名

02-将容器保存为新镜像-20230427-573

将镜像打包成压缩包

使用docker save命令,将镜像保存为压缩包,之后通过这个压缩包传送到其他服务器上,再将压缩包加载为镜像,就可以直接使用这个镜像了。

1
docker save 镜像名 > 新压缩包名.tar

03-打包为压缩包-20230427-097

如果你想指定存储位置,也可以使用以下命令:

docker save -o 存储路径/file.tar 新镜像名

传送压缩包到其他服务器

下面是一个例子,将服务器A的文件上传到服务器B。

服务器A的文件路径路径是绝对路径或相对路径。

服务器B的路径必须是绝对路径。

1
2
scp 服务器A文件路径 用户名@IP地址:服务器B文件路径
scp ./transmission-image.tar root@46.136.154.163:/opt/transmission-image.tar

将压缩包加载为镜像

另一台服务器上,使用docker load命令将.tar文件加载为Docker映像。

打开transmission-image.tar压缩包所在的位置,或者使用绝对路径也行。

1
docker load < transmission-image.tar

04-加载为镜像-20230426-181

查看镜像

进过上面的步骤,已经将容器加载为镜像了,接下来我们平时应该怎么部署容器就这么部署了。

1
docker images

05-查看镜像是否存在-20230427-481

编写docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: "2.1"
services:
transmission:
image: transmission-image
container_name: transmission-d
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- USER=test
- PASS=12345
volumes:
- ./config:/config
- ./downloads:/downloads
- ./watch/folder:/watch
ports:
- 3091:9091
- 51413:51413
- 51413:51413/udp

06-编写docker-compose-20230427-817

查看容器运行情况

1
docker ps

07-查看容器运行情况-20230427-293

总的来说,还是挺简单的,将容器保存成镜像,然后将镜像打包成压缩包,在另一台服务器加载压缩包到docker镜像中。