Docker 04 数据卷 Volum
基本概念
一、数据卷Volume是什么?
二、为什么需要数据卷
当我们在容器中运行一些关键的应用如mySQL、Redis等服务,其中都会存储着一些关键数据,这些数据是你希望即使删除容器也不应该被删除的,此时我们便需要用到数据卷了。
三、能干什么?
你可以将数据卷理解为文件目录的映射我们可以通过Docker提供的相关命令,来将主机中的某一个文件目录映射到容器中,此时当你在容器中操作该目录下的文件时,实际上操作的就是主机中的文件。

绑定方式
一、 匿名绑定
在启动容器时直接使用 -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


浙公网安备 33010602011771号