文章目录

  • Docker 容器数据卷
  • 1. 什么是容器数据卷
  • 2. 数据卷作用总结
  • 3. 数据卷的使用
  • 4. 匿名挂载和具名挂载
  • (1)匿名挂载
  • (2)具名挂载
  • (3)给挂载文件设置权限
  • (4)数据卷挂载总结


Docker 容器数据卷

1. 什么是容器数据卷

Docker容器数据卷,即Docker Volume(卷)。

当Docker容器运行的时候,会产生一系列的数据文件,这些数据文件会在关闭Docker容器时,直接消失的。但是其中产生部分的数据内容,我们是希望能够把它给保存起来,另作它用的。关闭Docker容器=删除内部除了image底层数据的其他全部内容,即删库跑路

所以我们期望:

  1. 将应用与运行的环境打包形成容器运行,伴随着容器运行产生的数据,我们希望这些数据能够持久化。
  2. 希望容器之间也能够实现数据的共享

Docker容器产生的数据同步到本地,这样关闭容器的时候,数据是在本地的,不会影响数据的安全性。
docker的容器卷技术也就是将容器内部目录和本地目录进行一个同步,即挂载。

总结: 容器的持久化和同步化操作,容器之间也是可以数据共享的(但是注意挂载不是等同于同步!!!)

2. 数据卷作用总结

  数据卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System(联合文件系统),提供一些用于持续存储或共享数据的特性。

  数据卷的设计目的就是为了Doeker容器中数据的持久化,完全独立于容器的生存周期,Docker不会在容器删除时,删除其挂载的数据卷。

数据卷

  • 数据卷可在容器之间共享或重用数据。
  • 数据卷中的更改可以直接生效。
  • 数据卷中的更改不会包含在镜像的更新中。
  • 数据卷的生命周期一直持续到没有容器使用它为止。

3. 数据卷的使用

使用-v参数给容器添加数据卷,Volume(卷)的首字母。

# 方式1:使用命令来挂载 -v
docker run -it -v 主机目录:容器目录

先pull一个ubuntu镜像,然后运行一下即可docker pull ubuntu

test@P340:/$ sudo docker run -it -v /home/test/:home/test/ ubuntu /bin/bash
# 这时已经将本地的/home/test目录挂载到容器内的/home/test下面了,所以可以直接在这个目录下创建一些东西来测试一下是否可以真的同步
root@b47f42e3ccb3:/home/test# touch hello.txt

然后去本地check一下是否有这个文件,over!!!

玩儿一点儿花的,如果你将这个容器删除呢?这个文件是否还是可以在本地找到,这个文件是不是会被删除。肯定还在阿,不然我们用容器数据卷干什么

我用的是测试容器,所以可全部删掉,如果你有重要的容器请测试的时候只删掉这个测试容器

# 删掉全部容器
docker rm $(docker ps -aq)

# 只删掉这个容器
docker rm 容器id

4. 匿名挂载和具名挂载

(1)匿名挂载

只指定容器内路径而不指定容器外路径

# 在后台启动容器,并匿名挂载到 /etc/nginx上面,指定容器名字为nginx01,端口随机
test@P340:/$ sudo docker run -d -P --name nginx01 -v /etc/nginx nginx
8720cda842edfc0ad8f14969af34fb7376aae219adce2d6a2e12164a0c3bb465

# 查看容器卷状况
test@P340:/$ sudo docker volume ls
DRIVER    VOLUME NAME
local     824a0f5ac630bf4757f981fd2d165c4650c007f322ba199469b57ec397938675
(2)具名挂载

同时声明容器内部和外部的容器卷路径,可以看到使用docker volume ls查看的Volume 是我们指定的容器路径名字

# 创建一个新的容器,端口随机,名字为nginx02,挂载为主机jumin-nginx到容器内部地/data/test/juming/nginx
test@P340:/$ sudo docker run -d -P --name nginx02 -v jumin-nginx:/data/test/juming-nginx nginx
d8c713b13135d4acb92be59c627ca649a4214905d876d76664261d31c171605d

# 查看容器卷信息
test@P340:/$ sudo docker volume ls
DRIVER    VOLUME NAME
local     824a0f5ac630bf4757f981fd2d165c4650c007f322ba199469b57ec397938675
local     jumin-nginx

# 查看容器卷挂载位置
test@P340:/$ sudo docker volume inspect jumin-nginx
[
    {
        "CreatedAt": "2021-08-21T07:14:29+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/jumin-nginx/_data", # 主机挂载位置
        "Name": "jumin-nginx",
        "Options": null,
        "Scope": "local"
    }
]

注意:所有的docker容器卷,在没有指定目录的情况下都是保存在(/var/lib/docker/volumes/****/_data

通过具名挂载可以方便地找到挂载位置

(3)给挂载文件设置权限

ro: readonly : 容器对该数据卷挂载目录只有只读权限
rw: read write:读写权限

sudo docker run -d -P --name nginx02 -v jumin-nginx:/data/test/juming-nginx:ro nginx 

sudo docker run -d -P --name nginx02 -v jumin-nginx:/data/test/juming-nginx:rw nginx
(4)数据卷挂载总结
# 匿名挂载
-v 容器内路径
# 具名挂载
-v 卷名:容器内路径
# 指定路径挂载
-v 主机路径:容器内路径