代码之家  ›  专栏  ›  技术社区  ›  ForeverLearner

保存docker映像的当前状态并导出到其他服务器

  •  0
  • ForeverLearner  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  2
  •   Ricardo Branco    7 年前

    没有数据库,因为 docker save docker 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
    
        2
  •  1
  •   David Maze    7 年前

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

    重要的细节是,需要存储所有可能更改和需要持久化的数据 容器外

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

    容器 即使 docker rm /data/mysql 在你的主机上是完整的 数据 很好。这也意味着你可以使用普通的 scp 将数据复制到其他主机并 docker run 相同的容器,这是更典型的迁移路径。

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

    • 您真的应该使用某种Docker注册表,无论是Docker Hub、您的云提供商提供的、第三方的还是自托管的。 docker save

    • docker build && docker push 为你。从不使用 docker commit docker export :它们是在不同的系统上获得不同版本软件的一个诀窍,而不记得你是如何做到这一点的。

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

    • 在当地,你应该可以自由地 docker stop; docker rm; docker run

    如果可以构造应用程序,以便其所有数据都在外部数据库中,请考虑在具有非常好备份程序的专用主机上运行数据库。如果到目前为止你已经做了所有的事情,你可能会有一个大规模的协调硬盘故障,并失去所有的Docker主机,而实际上没有失去任何东西(因为你可以 docker build 码头工人赛跑

        3
  •  0
  •   atline    7 年前

    启动时容器基于图像,但启动后,所有更改都不会影响图像。

    所以,在保存之前,您的所有更改(包括在容器运行时进行的数据库更改)都需要提交以形成新的docker映像。

    here

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

    然后将新图像保存到tar,然后执行您想要的操作。

        4
  •  0
  •   marekmuratow    7 年前

    将当前状态提交到映像

    docker commit currentcontainer newimage
    

    docker save newimage > /tmp/newimage.tar
    

    从图像中加载容器

    docker load < /tmp/newimage.tar
    
    推荐文章