docker数据持久化

默认情况下,在容器内创建的所有文件都存储在可写容器层上。
另一个进程很难从容器中获取数据,而且当容器不再存在时,数据不会持久化。

向可写容器层写入数据时,需要一个存储驱动来管理文件系统,比如overlay2,这种方式与直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能。

docker有两种方式,可以让容器在主机上存储文件,且持久化。
卷和绑定挂载。如果是在windows上,还可以使用命名管道。如下图所示。


image.png

其中:
volume是存储在由docker管理的主机文件系统的一部分。非docker进程不应该修改这部分文件系统。
volume是持久化的最佳方式,下面会解释。
bind mount可以存储在主机文件系统的任何地方。其他进程可以修改它们。
绑定挂载的性能非常好,但它们依赖于主机的文件系统具有特定的目录结构。如果正在开发新的Docker应用程序,可以考虑使用命名卷。不能使用docker命令来管理绑定挂载。
tmpfs挂载只存储在主机的内存中,并且从不写到主机的文件系统中。其生命周期为容器的生命周期。

volume的一些用例
1、在多个运行的容器之间共享数据
如果您没有显式地创建卷,那么卷在第一次挂载到容器中时就会被创建。当容器停止或被删除时,该卷仍然存在。多个容器可以同时挂载相同的卷,可以是读-写或只读。卷只有在显式删除时才会删除。
2、将容器运行和主机解耦
当Docker主机不能保证具有给定的目录或文件结构时。卷可以帮助您将Docker主机的配置与容器运行时解耦。
3、当您希望在远程主机或云提供商(而不是本地)上存储容器数据时
4、当需要将数据从一台Docker主机备份、恢复或迁移到另一台Docker主机时,卷是更好的选择
可以使用该卷停止容器,然后备份该卷的目录(例如/var/lib/docker/volumes/)。
5、当您的应用程序需要Docker桌面上的高性能I/O时
卷存储在Linux虚拟机而不是主机中,这意味着读写具有更低的延迟和更高的吞吐量。

Bind mount的一些用例
1、从主机到容器共享配置文件
2、在Docker主机和容器上的开发环境之间共享源代码或构建工件
例如,您可以将一个Maven目标/目录挂载到一个容器中,每当您在Docker主机上构建Maven项目时,容器就会访问重新构建的工件。
当Docker主机的文件或目录结构保证与容器需要的绑定安装一致时。

创建volume挂载例子.

$ docker run -d --name devtest --mount source=myvol2,target=/app nginx:latest
当使用docker inspect devtest 查看容器详细信息时,可以看到如下:

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

注意,容器停止或者删除时,volume不会自动删除,需要手动删除。

创建bind mount的例子。

$ docker run -d  -it --name devtest --mount type=bind,source="$(pwd)"/target,target=/app nginx:latest

当使用docker inspect devtest 查看容器详细信息时,可以看到如下:

"Mounts": [
    {
        "Type": "bind",
        "Source": "/tmp/source/target",
        "Destination": "/app",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

有两种方式创建tmpfs挂载。

$ docker run -d  -it --name tmptest  --mount type=tmpfs,destination=/app nginx:latest```
$ docker run -d  -it --name tmptest  --tmpfs /app  nginx:latest

当使用docker inspect tmptest 查看容器详细信息时,可以看到如下:

"Tmpfs": {
    "/app": ""
},

你可能感兴趣的:(docker数据持久化)