Docker 04 数据卷 Volum

基本概念

一、数据卷Volume是什么?

二、为什么需要数据卷

当我们在容器中运行一些关键的应用如mySQL、Redis等服务,其中都会存储着一些关键数据,这些数据是你希望即使删除容器也不应该被删除的,此时我们便需要用到数据卷了。

三、能干什么?

你可以将数据卷理解为文件目录的映射我们可以通过Docker提供的相关命令,来将主机中的某一个文件目录映射到容器中,此时当你在容器中操作该目录下的文件时,实际上操作的就是主机中的文件。

image


绑定方式

一、 匿名绑定

在启动容器时直接使用 -v /container_dir 即可完成匿名绑定,匿名绑定的方式将在Docker的volumes目录下生成一个sha256的字符串作为目录名,且指定的/container_dir中的文件或目录会被保存在该处,

匿名绑定的volume在容器被删除的时候,数据卷也会被删除

docker run --rm -d -p 80:80 -v /www/test nginx

将容器内的目录:/usr/share/nginx/html 共享给主机,具体映射到了主机哪里不知道,所以叫匿名
docer run --rm -d -p 80:80 --name nginx_volume -v /usr/share/nginx/html nginx

匿名绑定方式由于不知道名称,因此如果需要查看数据卷在主机的哪个位置,需要使用docker inspect-f'{{index.Mounts O}}' container_id来查看

1.匿名数据卷启动容器实例

#以主机目录匿名的方式绑定容器目录卷
[root@VM-0-2-centos ~]# docker run --rm --name nginx_volume -d -p 8765:80 -v /usr/share/nginx/html nginx
a0cc8927f69357da1bade155a839858b16517d120cc8ab4464c9e71099de2222
# 进入容器内
[root@VM-0-2-centos ~]# docker exec -it nginx_volume /bin/bash
# 查看容器内服务的文件目录
root@a0cc8927f693:/# cd /usr/share/nginx/html/
root@a0cc8927f693:/usr/share/nginx/html# ls
50x.html  index.html

2. docker inspect nginx_volume 查看文件映射挂载信息

"Mounts": [
            {
                "Type": "volume",
                "Name": "0a37211580af3e1af46a9bf759742f3b796b20632c0fa7732faf43a7ba8ea549",
                "Source": "/var/lib/docker/volumes/0a37211580af3e1af46a9bf759742f3b796b20632c0fa7732faf43a7ba8ea549/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

3. 查看主机自动生成的数据卷映射目录

[root@VM-0-2-centos ~]# cd /var/lib/docker/volumes/0a37211580af3e1af46a9bf759742f3b796b20632c0fa7732faf43a7ba8ea549/_data
[root@VM-0-2-centos _data]# ls
50x.html  index.html

在容器所在的主机中的数据卷映射目录中修改,可以反映到容器内;反之亦然。

4. docker volume ls

查看数据卷

# 进入到主机的容器数据卷映射目录   
[root@VM-0-2-centos ~]# cd /var/lib/docker/volumes/0a37211580af3e1af46a9bf759742f3b796b20632c0fa7732faf43a7ba8ea549/_data
[root@VM-0-2-centos _data]# ls
50x.html  index.html
[root@VM-0-2-centos _data]# docker volume ls
DRIVER    VOLUME NAME
local     0a37211580af3e1af46a9bf759742f3b796b20632c0fa7732faf43a7ba8ea549
[root@VM-0-2-centos _data]# docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS                                   NAMES
a0cc8927f693   nginx     "/docker-entrypoint.…"   21 minutes ago   Up 21 minutes   0.0.0.0:8765->80/tcp, :::8765->80/tcp   nginx_volume
[root@VM-0-2-centos _data]# docker stop nginx_volume
nginx_volume
[root@VM-0-2-centos _data]# docker volume ls
DRIVER    VOLUME NAME
[root@VM-0-2-centos _data]# ls /var/lib/docker/volumes/
backingFsBlockDev  metadata.db
[root@VM-0-2-centos _data]# 

注意
强制删除容器实例时,不会删除容器卷

docker rm -f container_name

可以通过volume 的删除命令进行删除

docker volumn rm volume_name

二、 具名绑定

同样是启动容器时绑定一个数据卷,不同的是可以为该数据卷起个名字-v volume-name:container_dir,通过名字你可以快速的定位并管理这些 volume
docker run --rm -d -p 80:80 -V Dginx-w:/w/test nginx

[root@VM-0-2-centos _data]# docker run -d --rm -p 9876:80 --name nginx_volume -v nginx-html:/usr/share/nginx/html nginx
b16271b0257403a777d4b53553a163fbdb8f067d149f67b741bfaebb010e92f0
[root@VM-0-2-centos _data]# docker volume ls
DRIVER    VOLUME NAME
local     nginx-html
[root@VM-0-2-centos _data]# docker inspect nginx_volume
"Mounts": [
            {
                "Type": "volume",
                "Name": "nginx-html",
                "Source": "/var/lib/docker/volumes/nginx-html/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],

三、Bind Mount

绑定并加载主机的某个文件目录到容器中,这种方式是平常最常用的。这种绑定方式与前面两种一样,也是在容器启动时使用 -v host_dir:containerdir 的格式来完成映射
docker run --rm -d -p 80:80 -v /www/wolfcode:/www/wolfcode -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf nginx

数据卷的管理

docker volume --help

image

posted @ 2026-09-15 15:15  超轶绝尘  阅读(7)  评论(0)    收藏  举报