导入和到处Docker容器(跨主机迁移)

Docker容器的分发通常通过Docker Hub,也就是中心化的镜像上传和下载,适合数据中心管理方式。但是对于个人开发者,简简单单在两台主机间复制镜像则更为常见,此时使用Docker的export和import功能。

容器迁移

以下案例将主机A上的容器myapp-server迁移到主机B

  • 在原主机A上检查容器

docker ps

显示容器

CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                             NAMES
dcaa24ba7c62        local:myapp-server_django-dev   "/bin/bash"              3 months ago        Up 7 weeks          8000/tcp, 0.0.0.0:32768->22/tcp   myapp-server
  • 输出容器

docker export myapp-server | gzip > myapp-server.gz

这里myapp-server是运行的容器名字

  • 将镜像复制到主机B,然后执行以下命令导入

zcat myapp-server.gz | docker import - myapp-server

此时在主机B上检查镜像docker images可以看到

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myapp-server         latest              e9c442f58421        36 minutes ago      2.13 GB
  • 在主机B上运行容器只需要以下命令

docker run -i -t myapp-server /bin/bash

存储卷迁移

  • 原先在主机A上,容器myapp-server有一个存储卷share-data,是多个Docker容器共享的存储卷,需要从主机A迁移到主机B以便完整实现数据同步:

以下是在主机A上检查显示

$ docker volume ls
DRIVER              VOLUME NAME
local               share-data

注意:这个share-data卷在容器中映射目录是data:

docker inspect myapp-server

显示卷如下

        "Mounts": [
            {
                "Type": "volume",
                "Name": "share-data",
                "Source": "/var/lib/docker/volumes/share-data/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],

How to port data-only volumes from one host to another?介绍了Docker官方文档Backup, restore, or migrate data volumes的解决方法:--volumes-from参数可以创建新的容器来挂载卷。

  • 在主机A上备份卷:

docker run --rm --volumes-from myapp-server -v $(pwd):/backup busybox tar cvfz /backup/data.tar.gz /data

参数解释

  • --rm 当退出时移除容器

  • --volumes-from myapp-server 将容器myapp-server的卷连接到本次命令启动的新容器上(用于读取数据)。这个卷的设置会和原先myapp-server完全相同,也是share-data卷映射到容器内的/data目录

  • -v $(pwd):/backup 将主机A的当前目录映射成容器内的/backup目录,这样在容器中执行的命令tar cvfz /backup/backup.tar.gz /data就会把文件backup.tar.gz实际存储到主机A的当前目录下

  • busybox 是一个非常小巧简单的镜像

  • tar cvfz /backup/backup.tar.gz /data 创建一个容器中目录/data的备份 (注意:这里使用了tar cvfz命令,其中-v参数是详细的输出信息,如果不需要屏幕输出备份了那些文件,可以去除-v参数)

  • 将主机A的备份文件data.tar.gz复制到主机B上

  • 在主机B上创建新的容器DATA2,并且卷share-data附加到这个用于回复数据的临时容器中 - 请参考Docker卷原先的操作步骤

docker volume create share-data
docker create -v share-data:/data --name DATA2 busybox true

上述步骤完成后,实际上DATA2这个容器就是我们用来转移回复的桥梁容器了。

  • 在主机B上启动DATA2容器并执行命令恢复数据

docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xfz /backup/data.tar.gz data/
  • 在主机B上正式创建容器myapp-server并挂载共享的存储卷

docker run -it -p 22 -p 8000:8000 --hostname myapp-server --name myapp-server \
-v share-data:/data myapp-server /bin/bash

此时在主机B上就可以看到进入了容器myapp-server,对比检查系统内容可以看到完全和原先在主机A上相同。

参考

Last updated