Docker的存储

一、简介

docker提供数据卷来实现数据共享与持久化,而数据卷的挂载有两种方式:
挂载主机目录(Bind mounts
数据卷容器(Data Volumes

数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
1、数据卷可以在容器之间共享和重用
2、数据卷是目录或者文件,而非没有格式化的磁盘(块设备)
3、对数据卷的修改会立马生效
4、对数据卷的更新不会影响镜像
5、卷会一直存在,只到没有容器使用

1、挂载主机目录

先删除全部容器


[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

1.1、挂载一个宿主机指定的目录作为数据卷

     将宿主机根目录下的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

2、数据卷容器

(1)、数据卷实际上就是宿主机上的目录或者是文件,可以被直接mount 到容器当中使用 
(2)、实际生成 环境中,需要针对不同类型的服务、不同类型的数据存储要求做相应的规划, 最终保证服务的可扩展性、稳定性以及数据的安全性
(3)、docker run 命令使用-v 选项即可使用volume,其实也就是将宿主机的文件挂载到容器中,默认挂载为rw的权限

数据卷的特点及使用:
1、数据卷是目录或者文件,并且可以在多个容器之间共同使用 
2、对数据卷更改数据容器里面,会立即更新 
3、数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不 影响 
4、 在容器里面的写入数据,不会影响到镜像本身

数据卷使用场景:
1、 日志输出
2、 静态web页面
3、应用配置文件
4、 多容器间目录或文件共享

2.1、创建一个数据卷容器

创建一个数据卷容器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 命令来指定同时删除关联的容器

2.2、删除数据盘

查看主机上现有的数据盘


[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          

3、案例

把本地的一个目录挂载到容器,修该本地的目录就可以达到修改容器的目的

3.1、创建一个挂载的容器


[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

Docker的存储_第1张图片

 3.2、在物理机写入数据


[root@Docker ~]# echo "

今天有太阳....!

" > /data/index.html

Docker的存储_第2张图片

 完成!!!~~~

你可能感兴趣的:(docker,Docker的存储)