Docker Linux CentOS

版本:19.03.5

数据卷是一种特殊的目录或文件,可以实现宿主主机和容器数据共享,这个目录或文件是存在于宿主主机上的。

当容器停止运行并删除后,容器所产生的数据将会丢失,数据卷可以用来保存持久化容器在运行过程中产生的数据,也可以用来当做恢复容器运行所需数据的源。

数据前是独立于容器生命周期,并且可以在被多个容器共享的。

当一个数据圈被多个容器挂载时,则该容器被称为数据容器卷。


数据卷的常用操作:

① 创建容器tomcat-v-1,直接指定数据卷目录 (-v 或 --volume)

# docker run -d --name tomcat-v-1 -v /usr/local/tomcat/webapps/hellodocker -p 9090:8080 tomcat
2aaa2aef9ed14770ffd11fc77f95e360bd8d6b323c7a9b173578a544f2665686
# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
2aaa2aef9ed1        tomcat              "catalina.sh run"   4 seconds ago       Up 3 seconds        0.0.0.0:9090->8080/tcp   tomcat-v-1
查看数据卷信息
# docker volume ls
DRIVER              VOLUME NAME
local               f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f
# docker volume inspect f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f
[
    {
        "CreatedAt": "2019-12-27T13:45:25-05:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f/_data",
        "Name": "f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f",
        "Options": null,
        "Scope": "local"
    }
]
可以看到数据卷被创建,并生成默认名称是64位字符串。
数据卷默认存放位置(宿主主机)是 /var/lib/docker/volumes/ 
# ll /var/lib/docker/volumes/
total 24
drwxr-xr-x. 3 root root    19 Dec 27 13:45 f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f
-rw-------. 1 root root 32768 Dec 27 13:45 metadata.db
进入自动命名数据卷宿主主机对应文件夹
# pwd
/var/lib/docker/volumes/f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f/_data
# vim index.html
<h1>Hello Docker -1</h1>

验证数据卷(使用宿主主机IP或宿主直接回环测试地址访问)

# curl http://192.168.31.200:9090/hellodocker/index.html
<h1>Hello Docker -1</h1>


② 创建容器tomcat-v-2 并 指定数据卷名称 hellodocker2

# docker run -d --name tomcat-v-2 -v hellodocker2:/usr/local/tomcat/webapps/hellodocker -p 9092:8080 tomcat
40df5037e1bf20ff2db7d3e0d9e3d8a460d39a60f52ed9e0af8e5672dcddb77b
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
40df5037e1bf        tomcat              "catalina.sh run"   13 seconds ago      Up 11 seconds       0.0.0.0:9092->8080/tcp   tomcat-v-2
2aaa2aef9ed1        tomcat              "catalina.sh run"   4 minutes ago       Up 4 minutes        0.0.0.0:9090->8080/tcp   tomcat-v-1
查看数据卷信息
# docker volume ls
DRIVER              VOLUME NAME
local               f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f
local               hellodocker2
# docker volume inspect hellodocker2
[
    {
        "CreatedAt": "2019-12-27T13:49:23-05:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/hellodocker2/_data",
        "Name": "hellodocker2",
        "Options": null,
        "Scope": "local"
    }
]
# ll /var/lib/docker/volumes/
total 24
drwxr-xr-x. 3 root root    19 Dec 27 13:45 f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f
drwxr-xr-x. 3 root root    19 Dec 27 13:49 hellodocker2
-rw-------. 1 root root 32768 Dec 27 13:49 metadata.db
进入创建的数据卷hellodocker2宿主主机对应文件夹,创建 index.html
# pwd
/var/lib/docker/volumes/hellodocker2/_data
# vim index.html
<h1>Hello Docker -2</h1>
验证数据卷
# curl http://192.168.31.200:9092/hellodocker/index.html
<h1>Hello Docker -2</h1>


③ 直接创建数据卷 tomcat-volume-1

# docker volume create tomcat-volume-1
tomcat-volume-1
# docker volume ls
DRIVER              VOLUME NAME
local               f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f
local               hellodocker2
local               tomcat-volume-1
# docker volume inspect tomcat-volume-1
[
    {
        "CreatedAt": "2019-12-27T13:55:32-05:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/tomcat-volume-1/_data",
        "Name": "tomcat-volume-1",
        "Options": {},
        "Scope": "local"
    }
]
进入创建的数据卷tomcat-volume-1宿主主机对应文件夹,创建 index.html
# pwd
/var/lib/docker/volumes/tomcat-volume-1/_data
# vim index.html
<h1>Hello Docker -tomcat-volume-1</h1>
新创建容器tomcat-v-3,使用已创建的数据卷tomcat-volume-1
# docker run -d --name tomcat-v-3 -v tomcat-volume-1:/usr/local/tomcat/webapps/hellodocker -p 9093:8080 tomcat
621eca4ae45313049aeb4ba9871c1d643e4da7c1fa9c33ff9ff8716f6a9a6a35
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
621eca4ae453        tomcat              "catalina.sh run"   3 seconds ago       Up 2 seconds        0.0.0.0:9093->8080/tcp   tomcat-v-3
40df5037e1bf        tomcat              "catalina.sh run"   9 minutes ago       Up 9 minutes        0.0.0.0:9092->8080/tcp   tomcat-v-2
2aaa2aef9ed1        tomcat              "catalina.sh run"   13 minutes ago      Up 13 minutes       0.0.0.0:9090->8080/tcp   tomcat-v-1
验证数据卷
# curl http://127.0.0.1:9093/hellodocker/index.html
<h1>Hello Docker -tomcat-volume-1</h1>


验证数据卷的持久化,删除容器,查看对所挂载的数据卷的影响

# docker run -d --name tomcat-v-4 -v tomcat-volume-2:/usr/local/tomcat/webapps/hellodocker -p 9094:8080 tomcat
01cea30d23f562e4f5a64fbce8df68bef66e712e1aaf0038a9a22c1526a1a11d
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
01cea30d23f5        tomcat              "catalina.sh run"   3 seconds ago       Up 2 seconds        0.0.0.0:9094->8080/tcp   tomcat-v-4
621eca4ae453        tomcat              "catalina.sh run"   8 minutes ago       Up 8 minutes        0.0.0.0:9093->8080/tcp   tomcat-v-3
40df5037e1bf        tomcat              "catalina.sh run"   17 minutes ago      Up 17 minutes       0.0.0.0:9092->8080/tcp   tomcat-v-2
2aaa2aef9ed1        tomcat              "catalina.sh run"   21 minutes ago      Up 21 minutes       0.0.0.0:9090->8080/tcp   tomcat-v-1
[root@localhost ~]# docker rm -f 01cea30d23f5
01cea30d23f5
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f
local               hellodocker2
local               tomcat-volume-1
local               tomcat-volume-2

从上面的操作可以看出,当删除数据卷挂载的容器时,数据卷依然存在。


删除数据卷

# docker volume rm tomcat-volume-2
tomcat-volume-2
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f
local               hellodocker2
local               tomcat-volume-1


数据容器卷

新创建容器挂载其他容器已挂载的数据卷 --volumes-from

# docker run -d --name tomcat-v-5 --volumes-from tomcat-v-2 -p 9095:8080 tomcat
59b142bd5325a745e14ee1074016ba386b186451e8f725ca0ff4addf0abc7ff7
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
59b142bd5325        tomcat              "catalina.sh run"   6 seconds ago       Up 5 seconds        0.0.0.0:9095->8080/tcp   tomcat-v-5
621eca4ae453        tomcat              "catalina.sh run"   32 minutes ago      Up 32 minutes       0.0.0.0:9093->8080/tcp   tomcat-v-3
40df5037e1bf        tomcat              "catalina.sh run"   41 minutes ago      Up 41 minutes       0.0.0.0:9092->8080/tcp   tomcat-v-2
2aaa2aef9ed1        tomcat              "catalina.sh run"   45 minutes ago      Up 45 minutes       0.0.0.0:9090->8080/tcp   tomcat-v-1
[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f
local               hellodocker2
local               tomcat-volume-1
上面操作为:新创建容器tomcat-v-5,使用tomcat-v-2已挂载的数据卷 hellodocker2。验证:
# curl http://127.0.0.1:9095/hellodocker/index.html
<h1>Hello Docker -2</h1>

此时,容器tomcat-v-2就成为数据容器卷

接下来,停止、删除 容器tomcat-v-2,查看对新创建容器tomcat-v-5的影响:

# docker stop 40df5037e1bf
40df5037e1bf
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS                    NAMES
59b142bd5325        tomcat              "catalina.sh run"   3 minutes ago       Up 3 minutes                 0.0.0.0:9095->8080/tcp   tomcat-v-5
621eca4ae453        tomcat              "catalina.sh run"   35 minutes ago      Up 35 minutes                0.0.0.0:9093->8080/tcp   tomcat-v-3
40df5037e1bf        tomcat              "catalina.sh run"   45 minutes ago      Exited (143) 3 seconds ago                            tomcat-v-2
2aaa2aef9ed1        tomcat              "catalina.sh run"   48 minutes ago      Up 48 minutes                0.0.0.0:9090->8080/tcp   tomcat-v-1
# curl http://127.0.0.1:9095/hellodocker/index.html
<h1>Hello Docker -2</h1>
# docker rm -f 40df5037e1bf
40df5037e1bf
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
59b142bd5325        tomcat              "catalina.sh run"   3 minutes ago       Up 3 minutes        0.0.0.0:9095->8080/tcp   tomcat-v-5
621eca4ae453        tomcat              "catalina.sh run"   36 minutes ago      Up 36 minutes       0.0.0.0:9093->8080/tcp   tomcat-v-3
2aaa2aef9ed1        tomcat              "catalina.sh run"   49 minutes ago      Up 49 minutes       0.0.0.0:9090->8080/tcp   tomcat-v-1
# curl http://127.0.0.1:9095/hellodocker/index.html
<h1>Hello Docker -2</h1>
从上面操作中可以看出,数据容器卷的状态并不影响其他容器对该数据卷的使用。


直接指定宿主主机目录/datavolumes/hellodocker/挂载到容器tomcat-v-6中目录/usr/local/tomcat/webapps/hellodocker

# docker run -d --name tomcat-v-6 -v /datavolumes/hellodocker/:/usr/local/tomcat/webapps/hellodocker -p 9096:8080 tomcat
e7dbeb9cf1db66fcb258b06f3c9574b66e82361f2fadcd46f2e5c005cb9456a4
[root@localhost hellodocker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
e7dbeb9cf1db        tomcat              "catalina.sh run"   8 seconds ago       Up 8 seconds        0.0.0.0:9096->8080/tcp   tomcat-v-6
59b142bd5325        tomcat              "catalina.sh run"   21 minutes ago      Up 21 minutes       0.0.0.0:9095->8080/tcp   tomcat-v-5
621eca4ae453        tomcat              "catalina.sh run"   54 minutes ago      Up 54 minutes       0.0.0.0:9093->8080/tcp   tomcat-v-3
2aaa2aef9ed1        tomcat              "catalina.sh run"   About an hour ago   Up About an hour    0.0.0.0:9090->8080/tcp   tomcat-v-1
[root@localhost hellodocker]# docker volume ls
DRIVER              VOLUME NAME
local               f5ff191d62f9791ddfbfacfefd7721bfd6ab5aa7c49849d57b480e897751242f
local               hellodocker2
local               tomcat-volume-1
[root@localhost hellodocker]# curl http://127.0.0.1:9096/hellodocker/index.html
<h1>Hello Docker - /datavolume/hellodocker/index.html</h1>
从上面操作中看出,可以挂载成功,但#docker volume list指令无法显示该数据卷



转载请指明出处!http://www.miselehe.com/article/view/54