Docker:本地卷的用途以及对卷的一些观察

时间:2019-03-15 07:30:48

标签: docker docker-volume

我有以下docker文件

RUN touch /root/testing

VOLUME ["/root"]

在我构建并检查后,在配置下,我看到了

        "Volumes": {
            "/root": {}
        },

在我运行/ bin / bash并检查之后

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

启动容器时,它将创建一个本地卷并将其安装在/root上。还将/root的内容复制到本地挂载

如果我在主机上这样做,我们可以在其中看到testing文件

ls /var/lib/docker/volumes/fc1dc25de37d6d7593a21443cd2bef74a0a6a4e3276b8353199054404665c398/_data

testing

但是在杀死该容器后,本地卷将立即被破坏。

那么本地卷的目的是什么。因为有时我会误将容器杀死,但仍然希望容器中的某些数据存储在本地卷上,所以这是不可能的,因为本地卷也已删除。

我想尝试命名卷。

我创建了

docker volume create test

然后我是我的docker文件:

RUN touch /root/testing

VOLUME [{"Name":"test","Destination":"/root","external":"true"}]

OR   

VOLUME [ "Name:{"Destination":"/root","external":"true"}"]

当我尝试构建时,我得到:

Error response from daemon: when using JSON array syntax, arrays must be comprised of strings only

然后剩下的唯一选项是从命令行而不是Dockerfile挂载卷

docker run --rm -it --mount source=test,destination=/root archlinux/test /bin/bash
 [root@7c7001221c14 /]# ls /root
 testing

现在我检查测试体积的内容:

$ docker run --rm -it --mount source=test,destination=/tmp/myvolume archlinux/base ls /tmp/myvolume
testing

此处,由于测试卷完全为空,因此当我docker run --rm -it --mount source=test,destination=/root archlinux/test /bin/bash进入卷测试时,它从映像中复制了/ root的内容(即文件测试)

但是如果test之前的docker run --rm -it --mount source=test,destination=/root archlinux/test /bin/bash卷不为空,即

sudo cd /var/lib/docker/volumes/test/_data
rm -rf *
mkdir hellophp

然后做

docker run --rm -it --mount source=test,destination=/root archlinux/test /bin/bash

[root @ 7c7001221c14 /]#ls / root     hellophp

所以我的观察是:

---- VOLUME ["/path/in/container/"]仅会创建local volumes,我们在这里不能使用named volumes

----如果我想使用named volumes,那么

a)创建一个命名卷

docker volume create test

b)将命名卷安装到容器路径中

--mount source=test,destination=/path/in/container

------ ***最重要的观察

如果命名卷为空 (其中没有文件),则在runnnig之后

docker run --rm -it --mount source=test,destination=/path/in/container IMAGENAME CMD

它将/path/in/container的内容复制到test卷,然后将test卷挂载到/path/in/container

ELSE(即命名卷中包含一些文件) ,然后运行后

docker run --rm -it --mount source = test,destination = / path / in / container IMAGENAME CMD

在安装之前,它不会通过将文件从test复制到/path/in/container卷来更改test卷。

它将在test上安装/path/in/container卷。因此/path/in/container中存在的任何文件在容器中将不可用。

1 个答案:

答案 0 :(得分:0)

如果您正在docker中运行数据库,则可以使用run命令上的-v选项将本地目录直接安装到容器中。

docker run -d \
-v <local path>:<container path>:z \
..
..
<your image>

实际存储将保留在本地文件系统上,并且在容器运行时可以在容器中访问。

也请阅读 https://docs.docker.com/storage/volumes/