前言
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,而不用担心运行环境的问题。Docker 容器的灵活性,使得它成为了前端开发中非常重要的工具之一。本文将介绍 Docker 容器的备份及迁移教程,帮助广大前端开发者更好地运用 Docker 容器。
Docker 镜像与容器
Docker 安装后,首先需要了解 Docker 中的两个重要概念:Docker 镜像和 Docker 容器。
Docker 镜像是一种只读的文件系统,具有所有系统需要运行的文件,包括系统文件、应用程序、依赖和配置。
Docker 容器是 Docker 镜像的一个实例。容器是用 Docker 镜像创建的运行时环境,容器可以运行、开始、停止、移动和删除。容器的本质是进程,但它拥有自己的文件系统,网络配置和资源隔离。
Docker 容器备份
当 Docker 容器中有重要的数据时,我们需要对容器进行备份。Docker 容器的备份有两种方式,一种是备份容器的镜像,另一种是备份容器的数据卷。
备份容器镜像
备份容器镜像非常简单,只需要执行以下命令即可:
docker commit container_id backup_image_name
这条命令将会创建一个新的 Docker 镜像,包含了当前容器的所有更改。container_id
为 Docker 容器的 ID,而 backup_image_name
为备份后创建的 Docker 镜像名称。备份完成后,可以使用以下命令来查看 Docker 镜像:
docker images
备份容器数据卷
如果容器中有重要的数据,我们需要对数据卷进行备份。Docker 容器的数据卷同样也有两种备份方式:手动备份和自动备份。
手动备份
手动备份的方式更加灵活,需要以下步骤:
执行以下命令,创建一个新的容器,并挂载需要备份的数据卷:
docker run --rm --volumes-from container_name -v $PWD:/backup ubuntu tar cvf /backup/backup.tar /data
命令含义:
--rm
:容器退出后自动清理容器的数据;--volumes-from container_name
:从要备份的容器(container_name
)中挂载数据卷到当前容器;-v $PWD:/backup
:将当前目录挂载到容器中,用于备份数据卷;ubuntu
:使用 Ubuntu 镜像作为容器镜像;tar cvf /backup/backup.tar /data
:打包备份/data
目录,保存在当前目录下的backup.tar
文件中。
执行以下命令,将备份文件传回本地:
docker cp container_id:/backup/backup.tar .
命令含义:
container_id
:备份数据卷容器的 ID;.
:将备份文件传回当前目录;
执行以下命令,删除备份容器:
docker rm -v backup_container
命令含义:
backup_container
:备份数据卷的容器名称。
自动备份
自动备份的方式更加便捷,需要通过 Docker 容器的 --mount
参数为容器挂载卷,并使用卷压缩命令周期性备份卷中的文件。以下是一个自动备份的示例:
-- -------------------- ---- ------- -------- --- --------- --- ------ -------- ------------ ------------------ ------- -------- - -------------------------------- ------- --------- - ---------- ------- ----- ----- ------- --- --------------- ---------- ---------- ------------ ----- ------------- ----------- -- ------------------------------------------------------- --------- --- -------- -- -------- - ------- ------ ------- -------- - ---------------- - ---------------- ------- --------- - ---------- ------------ ---------- -- -------- --------------- ---------- ---------- -------- - -- -- ---- ---- ----------------------- ---------------------- --------- -------- -------- --------
上面示例将数据库容器 db
和备份容器 backup
一起部署。容器 db
使用 POSTGRES_PASSWORD
环境变量指定管理员密码,并挂载名为 db-data
的卷。容器 backup
挂载卷 db-data
并使用 tar
命令进行备份,备份文件存在名为 backups
的卷中。
Docker 容器迁移
当需要将 Docker 容器从一台机器迁移到另一台机器时,我们需要将容器备份并传送到目标机器。接下来,将介绍三种 Docker 容器迁移方式:Docker 镜像导入导出、Docker 容器导入导出和 Docker Swarm。
Docker 镜像导入导出
Docker 镜像导入导出是一种简单的容器迁移方式。首先,在原机器上将容器备份为 Docker 镜像,然后将 Docker 镜像传送到新机器,并在新机器上导入为 Docker 容器。以下是具体步骤:
在原机器上执行以下命令,将容器备份为 Docker 镜像:
docker commit container_id backup_image_name docker save -o backup_image_name.tar backup_image_name
命令含义:
container_id
:待备份容器的 ID;backup_image_name
:备份后的 Docker 镜像名称;docker save -o backup_image_name.tar backup_image_name
:将备份 Docker 镜像存为backup_image_name.tar
文件。
然后,将备份 Docker 镜像传送到新机器。在新机器上执行以下命令,将 Docker 镜像导入为 Docker 容器:
docker load < backup_image_name.tar docker run -it backup_image_name
命令含义:
docker load
:将 Docker 镜像导入为 Docker 容器;docker run -it backup_image_name
:启动导入的 Docker 容器。
Docker 容器导入导出
Docker 容器导入导出方式比较麻烦,但它可以完整地导出 Docker 容器所有信息。以下是具体步骤:
在原机器上执行以下命令,导出 Docker 容器:
docker export -o backup_container.tar container_id
命令含义:
backup_container.tar
:备份文件名;container_id
:待备份容器的 ID。
然后,将备份文件传送到新机器。在新机器上执行以下命令,将 Docker 容器导入:
cat backup_container.tar | docker import - backup_image_name docker run -it backup_image_name
命令含义:
docker import
:导入备份文件为 Docker 容器;backup_image_name
:新的 Docker 容器名称。
Docker Swarm
Docker Swarm 是 Docker 官方提供的容器集群管理工具,它可以方便地将容器迁移到其它节点。以下是具体步骤:
在原节点上执行以下命令,将容器启动为 Docker Swarm 服务:
docker service create --name my_service --replicas 1 --detach=false --publish published=1111,target=80 nginx:latest
命令含义:
my_service
:服务名称;1
:服务的实例数;published=1111,target=80
:将容器暴露在1111
端口;nginx:latest
:容器镜像。
然后,在新节点上执行以下命令,加入 Docker Swarm 集群:
docker swarm join --token <token> <ip>:<port>
命令含义:
token
:原节点docker swarm init
命令产生的 token 值;ip
和port
:原节点的 IP 和端口。
最后,在新节点上启动服务:
docker service scale my_service=1
命令含义:
my_service
:迁移过来的服务名称。
总结
本文详细介绍了 Docker 容器备份及迁移教程。在实际应用中,需要根据自己的需求选择最合适的方式。不管选择哪种方式,备份和迁移的基本思路都是先备份,然后再将备份复制到目标机器,接着导入或启动即可。Docker 容器的灵活性和便捷性,使得前端开发工作更简单、高效。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6461f3e0968c7c53b0348b9c