Docker 数据管理 —— 介绍及创建数据卷(data volumes)—— 容器内数据映射到本地主机环境(使用 docker volume命令 或 使用 dockerfile 构建数据卷)


       


       

看这里:

        戳此链接 通往 关于 Docker 所有的学习文章


 

前言:

        在生产环境中使用 docker ,往往需要对数据进行持久化,或者在多个容器之间进行数据的共享!这必然涉及到容器的数据管理操作:

①、数据卷(data volumes)—— 容器内数据映射到本地主机环境

②、数据卷容器(data volumes container)—— 使用特定容器维护数据卷

 

本章先学习 第一种方式,第二种方式下一章节学习!

下一篇:Docker 数据卷容器 —— 多个容器之间共享一些持续更新的数据

       


       

1、数据卷介绍:

数据卷(data volumes) 是一个可供容器使用的特殊目录!它将容器主机的目录直接映射到容器内,相当于 Linux 中的 mount 行为 !
 

数据卷的特性:

①、数据卷可以在容器之间共享 和 重用,容器之间传递数据变得更加的高效!
②、对 数据卷内的数据的修改会立即生效!无论是容器内操作 还是 本地操作!
③、对 数据卷 的更新不会影响镜像!
④、数据卷 会一直存在,直到没有容器使用数据卷,可以安全的卸载它!

       


       

2、使用 docker volume 创建数据卷(方法1)

 

①、docker volume command 介绍:

描述:

       docker volume 命令具有用于管理数据卷的子命令。date volumes 是个特别指定的目录,该目录绕过存储驱动程序管理。
       
       date volumes 持久存储数据,与容器的生命周期无关。删除容器时,Docker守护程序不会删除任何 date volumes 。

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

root@zhengzelin:~# docker volume [tab]
create   inspect  ls       prune    rm  
     
root@zhengzelin:~# docker volume --help
作用: 管理卷
语法格式:  docker volume commands

Commands:
  create      Create a volume  (创建一个卷)
  inspect     Display detailed information on one or more volumes  (查看一个或多个卷的信息)
  ls          List volumes  (列出所有卷)
  prune       Remove all unused local volumes  (删除所有不使用的本地数据卷)
  rm          Remove one or more volumes  (删除一个或多个卷)

       


       

②、docker volume 子命令介绍:

"1、docker volume create :"

root@zhengzelin:~# docker volume create --help 

Usage:	docker volume create [OPTIONS] [VOLUME]

作用:Create a volume

Options:
  -d, --driver    指定卷的驱动程序名称(默认为 local)
  --label         设置卷的元数据
  -o, --opt       设置驱动程序的特定选项(默认为 map)

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

"2、docker volume prune :"

格式:	docker volume prune [OPTIONS]

作用:   Remove all unused local volumes

Options:
      --filter        使用过滤器提供过滤值!(eg:lable='')
  -f, --force         不提示用户是否确认删除

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

"3、docker volume ls :"
root@zhengzelin:~# docker volume ls --help

用法:	docker volume ls [OPTIONS]

作用:    List volumes

Options:
  -f, --filter       提供过滤器的值 (eg'dangling=true')
  -q, --quiet        仅仅显示卷名

       


       

③、create a local data volume

"开始创建:"
root@zhengzelin:~# docker volume create -d local localdatavolume
localdatavolume
   
       
"默认创建的数据卷在 /var/lib/docker/volumes/ 下 "
root@zhengzelin:~# ls /var/lib/docker/volumes/
70de12....  localdatavolume  metadata.db


"查看本地数据卷的权限:"
root@zhengzelin:~# ll /var/lib/docker/volumes/
drwxr-xr-x  3 root root  4096 Apr 21 11:19 localdatavolume/

④、运行容器时,绑定数据卷

"1、开始绑定:"

cmd: docker run -itd -P --name=volumetest  -v "宿主机数据卷的绝对路径:/容器内的相对路径"	镜像名:标签 (-v 后不需要双引号)

root@zhengzelin:~# docker run -itd -P --name=volumetest -v /var/lib/docker/volumes/localdatavolume/:/root/containervolume fedora:latest 
3e9b16cc27a413e2e55b35753eda15afc19c16d249be384ac0661fb1d03051fb
root@zhengzelin:~# docker ps
CONTAINER ID      IMAGE             COMMAND            CREATED             STATUS         PORTS           NAMES
3e9b16cc27a4    fedora:latest    "/bin/bash"        6 seconds ago       Up 5 seconds                    volumetest

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

"2、进入容器,查看数据卷:"
root@zhengzelin:~# docker exec -it volumetest /bin/bash
[root@3e9b16cc27a4 /]# ll root/
drwxr-xr-x 3 root root 4096 Apr 21 03:19 containervolume

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

"3、查看容器的详细信息:"
docker inspect 容器名

执行结果找到:
"HostConfig": {
            "Binds": [
                "/var/lib/docker/volumes/localdatavolume/:/root/containervolume"
            ],
            ....
           }

⑤、测试数据卷内容的更新速度及权限:

"注意: Docker 挂载数据卷的默认权限为 读写(rw),当然你也可以更改权限为 只读(ro)"

开始测试:

1、容器内创建文件!并且在本地数据卷查看该文件!
[root@3e9b16cc27a4 containervolume]# touch abc    
root@zhengzelin:~# ls /var/lib/docker/volumes/localdatavolume/
abc  

2、本地创建文件,在容器内查看:
root@zhengzelin:~# touch /var/lib/docker/volumes/localdatavolume/test1
[root@3e9b16cc27a4 containervolume]# ls
_data  abc  test1

"看到这是不是想到了 docker cp : 用于在宿主机和容器之间复制文件或文件夹!"

⑥、更改 rw(读写) 权限为 ro(只读)

docker run -v  "宿主机数据卷的绝对路径:/容器内的相对路径:ro" 

在容器内的相对路径后面加上 :ro 即可!不过既然是只读权限,那么容器内 对于 这个数据卷 就没有写权限了!

(一般不推荐设置只读权限)

       


       

⑦、其他 docker volume commands

root@zhengzelin:~# docker volume ls 
DRIVER              VOLUME NAME
local               70de122251f7206e51a5c649b752a9c5d6794aef03ecca615dffb4d610e38bc7
local               localdatavolume


root@zhengzelin:~# docker volume inspect localdatavolume 
[
    {
        "CreatedAt": "2020-04-21T11:19:12+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/localdatavolume/_data",
        "Name": "localdatavolume",
        "Options": {},
        "Scope": "local"
    }
]

       


       

3、使用 Dockerfile 创建数据卷(方法2)

①、根目录下新建 mydocker 目录并进入

root@zhengzelin:~# mkdir /mydocker
root@zhengzelin:~# cd /mydocker/

②、编写一个 dockerfile

root@zhengzelin:/mydocker# vim dockerfile
FROM fedora:latest
VOLUME ["/datavolumecontainer1","/datavolumecontainer2"]
CMD echo "finished"
CMD /bin/bash


# 你想设置几个容器内的数据卷 就在上面标记几个!

③、执行该 dockerfile

root@zhengzelin:/mydocker# docker image build -f /mydocker/dockerfile -t newfedora . (别忘记. —— 点)

-f   指定dockerfile 文件名 及其 路径
-t   指定新的 iamgename:tag

root@zhengzelin:/mydocker# docker image build -f /mydocker/dockerfile -t newfedora .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM fedora:latest
 ---> 536f3995adeb
Step 2/4 : VOLUME ["/datavolumecontainer1","/datavolumecontainer2"]
 ---> Running in 7e2792444e4e
Removing intermediate container 7e2792444e4e
 ---> eb5f3a12e564
Step 3/4 : CMD echo "finished"
 ---> Running in b26bd4bf388c
Removing intermediate container b26bd4bf388c
 ---> b729ff7f484c
Step 4/4 : CMD /bin/bash
 ---> Running in 4307be72006a
Removing intermediate container 4307be72006a
 ---> f366216f7bec
Successfully built f366216f7bec
Successfully tagged newfedora:latest

④、验证结果

"1、查看生成的镜像:"
root@zhengzelin:/mydocker# docker images 
REPOSITORY         TAG            IMAGE ID            CREATED             SIZE
newfedora         latest         f366216f7bec        13 seconds ago      193MB

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

"2、运行容器查看 数据卷:"
root@zhengzelin:/mydocker# docker run -it newfedora:latest 
[root@a751ab91c485 /]# ll
....
drwxr-xr-x   2 root root 4096 Apr 21 07:53 datavolumecontainer1
drwxr-xr-x   2 root root 4096 Apr 21 07:53 datavolumecontainer2

(成功生成!在其中一个 容器内数据卷 创建数据,然后在主机上的数据卷查看数据!)

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

"3、开始验证:"

a、容器内的 数据卷1 创建文件 aaa:
[root@a751ab91c485 /]# cd datavolumecontainer1;touch aaa
[root@a751ab91c485 datavolumecontainer1]# ls
aaa


b、打开新的终端,查看主机上的数据卷位置!
root@zhengzelin:~# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED            STATUS                  NAMES
a751ab91c485        newfedora:latest    "/bin/sh -c /bin/bash"   6 minutes ago       Up 6 minutes     intelligent_sutherland
root@zhengzelin:~# docker inspect intelligent_sutherland 
 ......
 "Mounts": [
            {
                "Type": "volume",
                "Name": "f46f19ed95b7e1122a135bcebade5e11f05e60f3d3336760d4a8e158d8d4e90a",
                "Source": "/var/lib/docker/volumes/f46f19ed95b7e1122a135bcebade5e11f05e60f3d3336760d4a8e158d8d4e90a/_data",
                "Destination": "/datavolumecontainer1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "95e6e2129a62a7467203229ec92cb0df7284740a1fb6f63d4a3f105d29a61f49",
                "Source": "/var/lib/docker/volumes/95e6e2129a62a7467203229ec92cb0df7284740a1fb6f63d4a3f105d29a61f49/_data",
                "Destination": "/datavolumecontainer2",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],


c、从上图可知,宿主机 数据卷的路径为 /var/lib/docker/volumes/f46f19ed95b7e1122a135bcebade5e11f05e60f3d3336760d4a8e158d8d4e90a/_data 

查看文件 aaa 是否存在!

root@zhengzelin:~# ls /var/lib/docker/volumes/f46f19ed95b7e1122a135bcebade5e11f05e60f3d3336760d4a8e158d8d4e90a/_data/
aaa

存在 即 创建成功 !

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

"4、在 volume2 对应的宿主机的数据卷上 创建文件 test1"
root@zhengzelin:~# touch /var/lib/docker/volumes/95e6e2129a62a7467203229ec92cb0df7284740a1fb6f63d4a3f105d29a61f49/_data/test1

然后在 容器内部 的 数据卷2 上查看该文件是否存在?
[root@a751ab91c485 datavolumecontainer1]# cd ../datavolumecontainer2/
[root@a751ab91c485 datavolumecontainer2]# ls
test1

完全OK!

       


       

Docker datavolume Container

下一篇:Docker 数据卷容器 —— 多个容器之间共享一些持续更新的数据

微信扫码订阅
UP更新不错过~
关注
  • 3
    点赞
  • 6
    收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:黑客帝国 设计师:我叫白小胖 返回首页
评论 3

打赏作者

郑泽林

你的鼓励将是我最大的动力!

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值