当对 Docker 容器执行 stop 时,我们在容器内所做的一些更改就会丢失。我们可以使用以下几种来保存对容器的一些更改:
- 使用 docker cp 命令,该命令比较适合将个别的一些更改的文件的手动备份到宿主机;
- 使用 docker export 命令,手动将整个容器导出到 tar 文件,包括安装的软件、数据文件等;
- 使用 docker commit 命令,手动将对容器的修改封装成一层文件系统,并导出为一个 image 文件,当然该镜像文件也会包含容器中所有数据;
- 使用 docker run 的 -v 参数设置宿主机目录和容器目录的映射,实现自动将容器数据备份到宿主机指定目录。
接下来,演示下这些命令的使用。
- docker cp 命令 {#title-0} ==========================
# 执行命令
docker images
# 输出结果
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 5a214d77f5d7 6 months ago 63.1MB
# 执行命令
docker run -it 5a214d77f5d7 /bin/bash
# 在容器中执行命令1
echo 'hello world' > demo.txt
# 在容器中执行命令2
ls
# 输出结果
bin boot demo.txt dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
注意:我们在根目录创建了 demo.txt 文件,接下来在不 stop 容器的情况下,使用 docker cp 命令将该文件备份到宿主机的指定目录下:
# 执行命令,获得正在运行容器ID
docker ps
# 输出结果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c94fbd298cd7 5a214d77f5d7 "/bin/bash" 3 minutes ago Up 3 minutes magical_babbage
# 执行 docker cp 命令拷贝文件
# docker cp 容器ID:文件绝对路径 宿主机绝对路径
docker cp c94fbd298cd7:/demo.txt /root
当然,使用 docker cp 命令也可以将宿主机的文件拷贝到容器中,例如:
docker cp /root/test.txt c94fbd298cd7:/root
- docker export 命令 {#title-1} ==============================
docker export -o container.tar c94fbd298cd7
该命令是将指定 ID 的容器,导出到 tar 文件中,o 参数指定导出的 tar 包名。如何将其恢复成容器实例,使用下面的命令:
# 1. 将 tar 文件恢复成镜像文件
docker import container.tar container:1.0
# 2. 通过镜像运行容器实例
docker run -it 28dd35b0de5c /bin/bash
- docker commit 命令 {#title-2} ==============================
docker commit 命令可以将将对容器的改动提交为一层文件系统,叠加到原来镜像之上,从另一个角度也实现了对原来容器数据的保存。
docker commit -a "作者" -m "描述内容" 容器编号 镜像名:TAG
- docker run 目录映射 {#title-3} =============================
# docker run -it -v 宿主机路径:容器路径 容器ID /bin/bash
docker run -it -v /root/bak:/root:rw 28dd35b0de5c /bin/bash
v 参数指定宿主机的绝对路径和容器的绝对路径,当容器内指定路径内的文件发生变化时,会自动将该文件同步到宿主机指定的路径。同理,当宿主机指定路径内文件发生变化,也会被同步到容器内。
rw 指定了容器内数据的读写权限,ro 表示只读。
docker run -it --volumes-from 容器 镜像名
上面的命令表示,当我们创建新的容器实例,它也可以直接继承其他容器的 v 设置。这样就可以实现,宿主机、多个容器之间的数据同步、共享。
如果我们有多个目录需要同步,可以添加多个 v 选项。