Skip to content

使用卷管理数据

优势

卷与在容器的可写层中保存持久化数据相比是更好的选择,因为卷不会增加使用的容器大小,并且卷的内容给定于容器的生命周期之外

使用卷(volume)管理数据有如下优势:

  • 卷比绑定挂载更容易备份(back-up)或迁移(migrate
  • 可以使用Docker CLI命令或Docker API管理卷
  • 卷可以在LinuxWindows容器上工作
  • 卷可以在多个容器之间更安全地共享
  • 卷驱动程序允许在远程主机或云提供商上存储卷,加密卷的内容或添加其他功能
  • 新卷的内容可以由容器预先填充

启动容器挂载卷

在启动容器同时挂载卷,如果卷不存在,则Docker会自动创建。示例如下,创建容器并挂载卷myvol2/app

# --mount
$ docker run -d \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest
# -v
$ docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest

启动后可通过docker inspect检查容器挂载信息,指定了卷在主机的地址,在容器的挂载地址,是否读写等等信息

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

使用容器填充卷

启动创建新卷的容器,并且该容器在要装入的目录(如/app/)中包含文件或目录,则该目录的内容将复制到该卷中。使用该卷的其他容器也可以访问预填充的内容

示例如下,启动容器nginx,创建新卷nginx-vol,挂载到容器的/usr/share/nginx/html目录,其是nginx默认的HTML保存地址

$ docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html \
  nginx:latest
$ docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html \
  nginx:latest

其实html文件夹中的数据预填充到了卷nginx-vol中,启动另一个容器ubuntu,挂载卷nginx-vol/app

$ docker run -it --rm --name=ubuntu --mount source=nginx-vol,destination=/app  alpine:latest
/ # cd app
/app # ls
50x.html    index.html

此时/app中出现了预填充的html文件

使用只读卷

可以设置容器只对卷的数据进行读访问(read-only)。多个容器可以挂载同一个卷,其中一些容器可以以读写方式挂载,而其他容器可以同时以只读方式挂载

使用ro, readonly作为卷的选项

# --mount
$ docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
  nginx:latest
# -v
$ docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
  nginx:latest

使用docker inspect查询

        "Mounts": [
            {
                "Type": "volume",
                "Name": "nginx-vol",
                "Source": "/var/lib/docker/volumes/nginx-vol/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "z",
                "RW": false, // 在这里
                "Propagation": ""
            }
        ],

相关阅读