docker提供数据卷来实现数据共享与持久化,而数据卷的挂载有两种方式:
挂载主机目录(Bind mounts)
数据卷容器(Data Volumes)
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
1、数据卷可以在容器之间共享和重用
2、数据卷是目录或者文件,而非没有格式化的磁盘(块设备)
3、对数据卷的修改会立马生效
4、对数据卷的更新不会影响镜像
5、卷会一直存在,只到没有容器使用
先删除全部容器
[root@Docker ~]# docker ps -aq|xargs docker rm -f
[root@Docker ~]# docker pull centos #拉取镜像
创建一个数据卷
[root@Docker ~]# docker run -it --name centos -v /data centos /bin/bash
[root@fdd9b47f43df /]# ls
bin dev home lib64 media opt root sbin sys usr
data etc lib lost+found mnt proc run srv tmp var
[root@fdd9b47f43df /]# cd data
-v参数:创建一个数据卷,就是将本地的/var/lib/docker/volumes下的某个目录挂载到容器的/webapp,即便容器删除,/var/lib/docker/volumes下的数据也不会丢失(可以指定本地的目录)
新打开一个窗口
查看本地的挂载到容器的路径
[root@Docker ]# docker inspect centos
.....
..
"Mounts": [
{
"Type": "volume",
"Name": "a18417891ec9d2282cbb4b469bbb4c7b7cd0de6911ff095da20027862fec04e1",
"Source": "/var/lib/docker/volumes/a18417891ec9d2282cbb4b469bbb4c7b7cd0de6911ff095da20027862fec04e1/_data",
"Destination": "/data",
......
...
[root@Docker _data]# cd /var/lib/docker/volumes/a18417891ec9d2282cbb4b469bbb4c7b7cd0de6911ff095da20027862fec04e1/_data
[root@Docker _data]# touch index.html #创建一个文件
——————————————————————————————————————
[root@fdd9b47f43df data]# ls #在容器中查看,可以看见刚刚创建的文件
index.html
[root@fdd9b47f43df data]# echo "index.html
" > index.html #写入内容
[root@fdd9b47f43df data]# cat index.html
index.html
[root@fdd9b47f43df data]# exit #退出容器
exit
[root@Docker ~]# docker rm a18417891ec9 #删除容器
[root@Docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@Docker _data]# cat index.html #在进行查看数据没有丢失
index.html
将宿主机根目录下的data目录挂载到容器的/data目录中
[root@Docker ~]# docker run -it --name centos -v /data:/data centos
[root@5c11e3f083c9 /]# cd /data
[root@5c11e3f083c9 data]# ls
[root@5c11e3f083c9 data]# vi index2.html
[root@5c11e3f083c9 data]# cat index2.html
cs8.4
[root@5c11e3f083c9 data]# exit
exit
[root@Docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c11e3f083c9 centos "/bin/bash" 6 minutes ago Exited (0) 48 seconds ago centos
[root@Docker ~]# docker rm 5c11e3f083c9
5c11e3f083c9
[root@Docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
————————————————————————————————————————
[root@Docker ~]# cat /data/index2.html #查看保存的数据
cs8.4
(1)、数据卷实际上就是宿主机上的目录或者是文件,可以被直接mount 到容器当中使用
(2)、实际生成 环境中,需要针对不同类型的服务、不同类型的数据存储要求做相应的规划, 最终保证服务的可扩展性、稳定性以及数据的安全性
(3)、为docker run 命令使用-v 选项即可使用volume,其实也就是将宿主机的文件挂载到容器中,默认挂载为rw的权限
数据卷的特点及使用:
1、数据卷是目录或者文件,并且可以在多个容器之间共同使用
2、对数据卷更改数据容器里面,会立即更新
3、数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不 影响
4、 在容器里面的写入数据,不会影响到镜像本身
数据卷使用场景:
1、 日志输出
2、 静态web页面
3、应用配置文件
4、 多容器间目录或文件共享
创建一个数据卷容器DataDB,并把宿主机/data挂载至容器的/DataDB目录中
[root@Docker ~]# docker run -it -v /data:/DataDB --name DataDB centos
[root@ae3afad4f741 /]# cd /DataDB/
[root@ae3afad4f741 DataDB]# ls
index2.html
[root@Docker ~]# docker run -it --volumes-from DataDB --name DB1 centos
[root@a2c25f347896 /]# cd /DataDB/
[root@a2c25f347896 DataDB]# ls
index2.html
[root@a2c25f347896 DataDB]# cat index2.html
cs8.4
--volume-from选项:指定从哪个容器主机进行复制,从多个容器挂载多个数据卷
如果删除了挂载的容器,数据卷并不会被自动删除,如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显示的使用docker rm -v 命令来指定同时删除关联的容器
查看主机上现有的数据盘
[root@Docker ~]# docker volume ls
DRIVER VOLUME NAME
local 6b780e3f8bbaacb0b616d8c3310377fccda4fe06f11a9142e95ca5f5f62c9d66
local 1802ba8fc204c70b958ee346474558e0d447361912648ee63fdc1b11cb940c8c
local 43728192d4ae01dae45ddeb93dd30b34ae958cd0863d0517b54b02e748f704d7
local a18417891ec9d2282cbb4b469bbb4c7b7cd0de6911ff095da20027862fec04e1
默认情况下,在删除容器时,docker并不会删除其数据盘,查看没有容器在使用的数据盘方法如下:
[root@Docker ~]# docker volume ls -f dangling=true
DRIVER VOLUME NAME
local 6b780e3f8bbaacb0b616d8c3310377fccda4fe06f11a9142e95ca5f5f62c9d66
local 1802ba8fc204c70b958ee346474558e0d447361912648ee63fdc1b11cb940c8c
local 43728192d4ae01dae45ddeb93dd30b34ae958cd0863d0517b54b02e748f704d7
local a18417891ec9d2282cbb4b469bbb4c7b7cd0de6911ff095da20027862fec04e1
如果想要删除没有使用的数据盘,使用如下指令:
docker volume rm VOLUME_NAME
删除掉容器时,同时删掉数据盘,则使用:
docker rm -v container_name
把本地的一个目录挂载到容器,修该本地的目录就可以达到修改容器的目的
[root@Docker ~]# cat /data/index.html #访问页面
测试
[root@Docker ~]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx
b5382b73c9d05c25ac2fe2ce6be0951aa8c387de80699b1a19da90437b1e402f
[root@Docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5382b73c9d0 nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp, :::80->80/tcp wonderful_brown
访问:192.168.2.17
[root@Docker ~]# echo "今天有太阳....!
" > /data/index.html
完成!!!~~~