文章目录
看这里:
戳此链接 通往 关于 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!