保存docker映像的当前状态并导出到另一台服务器

时间:2018-11-13 07:20:11

标签: docker

我是docker和container的新手。 我按照以下步骤迁移了在Docker容器上运行的postgres数据库:

docker save -o <path for generated tar file> <image name>
scp root@192.10.1.5:/images/gpdb.tar root@192.10.2.5:/images

在目标服务器(192.10.2.5):

docker load -i /images/gpdb.tar

但是,当我登录到docker映像时,数据库不存在。 如何将Docker映像与所有数据库表和数据一起保存。

4 个答案:

答案 0 :(得分:0)

Your container was based on image when start, but after start, all changes will not affect image.

So all your changes including database if made on the runtime of container need to be commit to form a new docker image before save.

Something like follows, see here

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Then save the new image to tar, and do what you wanted.

答案 1 :(得分:0)

将当前状态提交给图像

docker commit currentcontainer newimage

将图像另存为tar文件

docker save newimage > /tmp/newimage.tar

从图像加载容器

docker load < /tmp/newimage.tar

答案 2 :(得分:0)

没有数据库,因为docker savedocker commit命令不会保存容器卷...

下面是一个脚本,可以做到这一点:

https://github.com/ricardobranco777/docker-volumes.sh

# Stop the container 
docker stop $CONTAINER
# Create a new image
docker commit $CONTAINER $CONTAINER
# Save and load image to another host
docker save $CONTAINER | ssh $USER@$HOST docker load 

# Save the volumes (use ".tar.gz" if you want compression)
docker-volumes.sh $CONTAINER save $CONTAINER-volumes.tar

# Copy image and volumes to another host
scp $CONTAINER.tar $CONTAINER-volumes.tar $USER@$HOST:

### On the other host:

# Create container with the same options used by the previous container
docker create --name $CONTAINER [<PREVIOUS CONTAINER OPTIONS>] $CONTAINER

# Load the volumes
docker-volumes.sh $CONTAINER load $CONTAINER-volumes.tar

# Start container
docker start $CONTAINER

答案 3 :(得分:0)

尝试像这样移动容器不是最佳实践。不过,可能需要一些设置才能使您的容器进入正确的状态。

重要的细节是,所有可能更改并需要保留的数据都必须存储在容器外部。尽管Docker为此批准了命名卷,但使用本机文件系统路径使IME易于维护和移动。您需要知道数据在容器内的位置(通常有据可查),然后您可以运行类似命令

docker run -v /data/mysql:/var/lib/mysql/data ... mysql

现在,您可以使用容器进行任何操作,甚至可以docker rm进行操作,但是只要主机上的/data/mysql完整了您的数据< / em>很好。这也意味着您可以使用普通的scp将数据复制到其他主机,并在docker run那里使用同一容器,这是更典型的迁移路径。

如果您要构建和运行自定义图像,则需要检查以下几件事:

  • 您确实应该使用某种Docker注册表,无论是Docker Hub,还是您的云提供商提供的东西,第三方的东西,或者是自托管的东西。 docker save来回移动图像是很少需要的最后手段。

  • 图像本身应从Dockerfiles构建,并且像应用程序的其余部分一样,应检查到源代码管理中。理想情况下,您会为您运行docker build && docker push的自动化构建系统(持续集成)。永远不要使用docker commitdocker export:它们是在不同系统上获取不同版本软件并且不记得您的安装方式的秘诀。

  • 您的应用程序应尽量减少其在本地存储的数据量。最好的情况是将所有内容都存储在外部数据库中,然后您可以指向数据库。如果真的无法避免本地文件存储,请尝试将其全部包含在应用程序源代码树之外的单个目录中。

  • 在本地,您应该可以自由docker stop; docker rm; docker run使用同一容器,并且不会丢失数据。在需要进行跨主机迁移之前,请先进行测试。

如果可以对应用程序进行结构化,使其所有数据都位于外部数据库中,请考虑使用非常好的备份过程在专用主机上运行数据库。如果您已完成此处的所有操作,则可能会发生大规模的协调性硬盘故障,并丢失所有Docker主机,而实际上并没有丢失任何内容(因为您可以再次docker build从源镜像,而{ {1}}容器,并且数据不在主机上。