Docker的数据管理

Docker的数据管理

容器的数据存储

docker拉取只读的镜像创建容器,但是创建后的容器却是可以读写的,这是因为在创建的时候docker添加了一层可读写的层,对容器的写操作通过"读写复制(copy on write)",将镜像数据复制一份并写入数据,但是这些新增的数据还是与容器共存,当容器被删除时,这些数据也会被一并删除。如果想要将数据持久化,也就是保存到宿主机中,需要使用docker中所谓的volume数据卷,此事删除容器并不会删除数据卷中的数据。
在这里插入图片描述
数据目录结构:
通过:docker inspect imageID可以探测到一下的数据目录,其中:

LowerDir	:image 镜像层(镜像本身,只读)
UpperDir	:容器的上层(读写)
MergedDir	:容器的文件系统,使用 Union FS(联合文件系统)将 lowerdir 和 upperdir 合并给容器使用。
WorkDir		:容器在宿主机的工作目录

在这里插入图片描述

root@ubuntu1804-server:~# docker exec -it 2fcd20030930 bash
[root@2fcd20030930 /]# ls
anaconda-post.log  apps  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@2fcd20030930 /]# mkdir /data/
[root@2fcd20030930 /]# touch /data/text.txt
root@ubuntu1804-server:~# ll /var/lib/docker/overlay2/6d6678107f162b7d11d7447b54d0c29bc9c22426cca2192ccc712a5fb92524cd/diff
total 24
drwxr-xr-x 5 root root 4096 Feb 23 12:14 ./
drwx------ 5 root root 4096 Feb 23 12:13 ../
drwxr-xr-x 3  999  998 4096 Feb 20 10:42 apps/
drwxr-xr-x 2 root root 4096 Feb 23 12:14 data/
drwxrwxrwt 3 root root 4096 Feb 20 21:04 tmp/

容器中的volume

容器中的volume分为数据卷(data volume)和数据库容器(Data volume container),两者区别在于

  1. 数据卷使用宿主机某个目录,然后将其挂载在容器中。
  2. 数据卷容器是将宿主机的目录挂载至一个专门的数据卷容器,然后让其他容器通过数据卷容器读写宿主机的数据。

data volume

数据卷实际上就是宿主机上的目录或者是文件,可以被直接 mount 到容器当中
使用。
实际生产环境中,需要针对不同类型的服务、不同类型的数据存储要求做相应
的规划,最终保证服务的可扩展性、稳定性以及数据的安全性。

命令用法:使用-v 指定主机目录和容器目录的绑定关系,使用多个 -v可以挂载多个volume
docker run -it -d -p host_port:container_port -v host_dir:container_dir image

1.使用tomcat镜像测试,指定目录对应关系,主机:/data/webapps-》容器:/apps/tomcat/webapps

root@ubuntu1804-server:~# docker run -it -d -p 8080:8080 -p 8009:8009 -v /data/webapps:/apps/tomcat/webapps 06d988b898c7

2.在宿主机上添加index2.html文件,并测试

root@ubuntu1804-server:/data/webapps/myapp# ls
index.html
root@ubuntu1804-server:/data/webapps/myapp# echo "volume test page " > index2.html

在这里插入图片描述

3.默认挂载是rw权限,使用ro指定为数据卷挂载只读,则容器对此数据卷为只读状态,宿主机依然后读写权限。

root@ubuntu1804-server:/data/webapps/myapp# docker run -it -d -p 8080:8080 -p 8009:8009 -v /data/webapps:/apps/tomcat/webapps -v /data/webapps/myapp/index.html:/apps/tomcat/webapps/myapp/index.html:ro 06d988b898c7
ee0ae8c1e0baa126cf8a507c623002d6c8f1586379884dddd5729345dd65e355

root@ubuntu1804-server:/data/webapps/myapp# docker exec -it aed5000e5d62c7461227eab3573bd5966ddb710951e3d812972f47c21b3bb1d5 bash                            
[root@aed5000e5d62 /]# cd /apps/tomcat/webapps/myapp/
[root@aed5000e5d62 myapp]# ls
index.html
[root@aed5000e5d62 myapp]# echo 222 >> index.html 
bash: index.html: Read-only file system

数据卷的特点

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

data volume container

数据卷容器功能是可以让数据在多个docker 容器之间共享,即可以让 B 容器
访问 A 容器的内容,而容器 C 也可以访问 A 容器的内容,即先要创建一个后台
运行的容器作为 Server,用于卷提供,这个卷可以为其他容器提供数据存储服务,
其他使用此卷的容器作为 client 端:

1.创建一个卷容器,并指定挂载的目录,后续供其他创建的容器使用,最好使用--name指定容器名称
宿主机: /data/webapps/myapp: 容器:/apps/tomcat/webapps/myapp
宿主机:/data/webapps/testapp/: 容器:/apps/tomcat/webapps/testapp

root@ubuntu1804-server:/data/webapps/myapp# docker run -it -d  --name volume-server \
-v /data/webapps/myapp:/apps/tomcat/webapps/myapp \
-v /data/webapps/testapp/:/apps/tomcat/webapps/testapp  06d988b898c7
212a49d69bcb546ed565c285ec605b91efabe323014e43cfdb0d70854cfb7ca2
root@ubuntu1804-server:/data/webapps/myapp# docker exec  -it 212a49d69bcb546ed565c285ec605b91efabe323014e43cfdb0d70854cfb7ca2 bash
[root@8d0903d71f73 /]# ll /apps/tomcat/webapps/
total 28
drwxr-x--- 1 www  www  4096 Feb  6 06:30 docs
drwxr-x--- 1 www  www  4096 Feb  6 06:30 examples
drwxr-x--- 1 www  www  4096 Feb  6 06:30 host-manager
drwxr-x--- 1 www  www  4096 Feb  6 06:30 manager
drwxr-xr-x 2 www  www  4096 Feb 23 15:07 myapp
drwxr-x--- 1 www  www  4096 Feb  6 06:30 ROOT
drwxr-xr-x 2 root root 4096 Feb 23 15:24 testapp


2.创建容器使用--volumes-from并指定数据卷容器的名称,以此来继承卷容器挂载的目录

root@ubuntu1804-server:/data/webapps/myapp# docker run -it -d  --name volume-server  -v /data/webapps/myapp:/apps/tomcat/webapps/myapp -v /data/webapps/testapp/:/apps/tomcat/webapps/testapp  06d988b898c7
212a49d69bcb546ed565c285ec605b91efabe323014e43cfdb0d70854cfb7ca2
root@ubuntu1804-server:/data/webapps/myapp# docker run -it -d -p 8081:8080 -p 8089:8009 --volumes-from volume-server  06d988b898c7
b2038f6c317560383947fb75ff389de7cb1b7eb4db4b3a5eeb4dc28f0c828e5e
root@ubuntu1804-server:/data/webapps/myapp# ss -tnl
State             Recv-Q             Send-Q                          Local Address:Port                           Peer Address:Port             
LISTEN            0                  128                             127.0.0.53%lo:53                                  0.0.0.0:*                
LISTEN            0                  128                                   0.0.0.0:22                                  0.0.0.0:*                
LISTEN            0                  128                                 127.0.0.1:6010                                0.0.0.0:*                
LISTEN            0                  128                                 127.0.0.1:6011                                0.0.0.0:*                
LISTEN            0                  128                                 127.0.0.1:6012                                0.0.0.0:*                
LISTEN            0                  128                                         *:8081                                      *:*                
LISTEN            0                  128                                      [::]:22                                     [::]:*                
LISTEN            0                  128                                         *:8089                                      *:*                
LISTEN            0                  128                                     [::1]:6010                                   [::]:*                
LISTEN            0                  128                                     [::1]:6011                                   [::]:*                
LISTEN            0                  128                                     [::1]:6012                                   [::]:*   
root@ubuntu1804-server:/data/webapps/myapp# docker exec -it b2038f6c317560383947fb75ff389de7cb1b7eb4db4b3a5eeb4dc28f0c828e5e bash            
[root@b2038f6c3175 /]# ll /apps/tomcat/webapps/
total 28
drwxr-x--- 1 www  www  4096 Feb  6 06:30 docs
drwxr-x--- 1 www  www  4096 Feb  6 06:30 examples
drwxr-x--- 1 www  www  4096 Feb  6 06:30 host-manager
drwxr-x--- 1 www  www  4096 Feb  6 06:30 manager
drwxr-xr-x 2 www  www  4096 Feb 23 15:07 myapp
drwxr-x--- 1 www  www  4096 Feb  6 06:30 ROOT
drwxr-xr-x 2 root root 4096 Feb 23 15:24 testapp

3.测试

在这里插入图片描述
在这里插入图片描述

4.删除或停止卷容器是否会影响依赖卷容器的容器?

删除或者停止容器不会影响已创建的依赖卷容器的容器,并且可以通过关闭的卷容器继续创建容器,但是删除卷容器后,将无法继续创建依赖卷容器的容器。这是因为这些容器都共用了宿主机的mount namespace。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值