数据管理
Docker里的镜像绝大部分都是在别的镜像的基础上去进行创建的,也就是使用镜像的分层结构
一个Docker镜像由多个可读的镜像层组成,然后运行的容器会在这个Docker的镜像上面多加一层可写的容器层(文件系统),任何的对文件的更改都只存在此容器层,因此任何对容器的操作均不会影响到镜像

如果要将写入到容器的数据永久保存,则需要将容器中的数据保存到宿主机的指定目录,目前Docker的数据类型分为两种分别是数据卷和数据卷容器
- 在容器中创建一个文件时,其实这个文件在宿主机的本地也能找到的,当容器被删除,那么这个文件就会被永久删除,在宿主机本地也就找不到这个文件了
假如说Nginx的一些页面文件都在容器中,有时候容器一不小心被删除,那么这些文件就都没了,还要重新开始写,这样是很浪费时间的
- 因此就需要使用数据卷,将宿主机上的目录或者文件,挂载到容器中使用
- 或者使用数据卷容器,将数据卷容器的文件或者目录为其他容器提供数据存储服务
数据卷
数据卷介绍
数据卷就是宿主机上的目录或者文件被直接挂载到容器中使用
实际生产环境中,需要针对不同类型的服务、不同类型的数据存储要求做相应的规划,最终保证服务的可扩展性、稳定性以及数据安全性

数据卷案例
挂载方式:-v 宿主机目录/文件:容器目录/文件
- 在宿主机创建目录并准备页面
[root@server ~]# mkdir -p /root/web[root@server ~]# echo "docker test" > /root/web/index.html[root@server ~]# cat /root/web/index.htmldocker test
- 启动两个容器并验证
[root@server ~]# docker run -d -it --name web1 -v /root/web/:/usr/share/nginx/html/ -p 8081:80 nginx[root@server ~]# docker run -d -it --name web2 -v /root/web/:/usr/share/nginx/html/ -p 8082:80 nginx[root@server ~]# curl 192.168.31.99:8081docker test[root@server ~]# curl 192.168.31.99:8082docker test# 修改页面[root@server ~]# echo "hello world" > /root/web/index.html[root@server ~]# curl 192.168.31.99:8081hello world[root@server ~]# curl 192.168.31.99:8082hello world

- 在容器中进行数据的修改也是可以的(一般不会在容器中修改数据)
[root@server ~]# docker exec -it web1 bashroot@4b16c63c3fc0:/# echo "hello linux" > /usr/share/nginx/html/index.html[root@server ~]# curl 192.168.31.99:8081hello linux[root@server ~]# curl 192.168.31.99:8082hello linux
- 删除容器时不会删除数据卷
[root@server ~]# curl 192.168.31.99:8081hello linux[root@server ~]# curl 192.168.31.99:8082hello linux[root@server ~]# docker rm -f `docker ps -aq`48e6fa3c6ace4b16c63c3fc0[root@server ~]# cat /root/web/index.htmlhello linux
只读挂载
语法格式:-v 宿主机目录/文件:容器目录/文件:ro
使用只读挂载后,在容器内部不能修改挂载目录的数据
[root@server ~]# docker run -d -it --name web1 -v /root/web:/usr/share/nginx/html:ro -p 8081:80 nginx[root@server ~]# docker exec -it web1 bashroot@5496551e89e9:/# echo "hello world" > /usr/share/nginx/html/index.htmlbash: /usr/share/nginx/html/index.html: Read-only file system
文件挂载
语法格式:-v 宿主机文件:容器文件
[root@server ~]# docker run -d -it --name web1 -v /root/web/index.html:/usr/share/nginx/html/index.html -p 8081:80 nginx4a758297acb4644c14ed673009503752940c98e4ac5eb6a8c1f90ffe37baf7db[root@server ~]# curl 192.168.31.99:8081hello linux
数据卷优点
- 数据卷是宿主机的目录或者文件,可以在多个容器之间共同使用
- 在宿主机对数据卷更新数据后会在所有容器里面也立即更新
- 数据卷的数据可以永久保存,删除容器对数据卷的数据无影响
- 在容器里面写入数据不会影响到镜像本身
- 数据卷使用场景包括日志输出、静态web页面、应用配置文件、多容器间目录或文件共享等
将运行环境跟数据分开来,如果运行环境出现了问题,那么重新启动一个运行环境就可以,只需要做好磁盘映射,那么就可以在秒级的时间内恢复出和之前一模一样的业务,由此可见容器的优点
数据卷容器
数据卷容器功能是可以让数据在多个Docker容器之间共享,可以让B容器访问A容器的内容,而容器C也可以访问A容器的内容,即先要创建一个后台运行的容器作为Server,用于卷提供,这个卷可以为其他容器提供数据存储服务,其他使用此卷的容器作为客户端
- 启动一个卷容器Server
[root@server ~]# docker run -d -it --name nginx-web -v /root/web/:/usr/share/nginx/html/:ro -p 8081:80 nginx
- 启动两个客户端容器
[root@server ~]# docker run -d -it --name web1 -p 8082:80 --volumes-from nginx-web nginx[root@server ~]# docker run -d -it --name web2 -p 8083:80 --volumes-from nginx-web nginx
- 访问测试
[root@server ~]# curl 192.168.31.99:8081hello linux[root@server ~]# curl 192.168.31.99:8082hello linux[root@server ~]# curl 192.168.31.99:8083hello linux
- 停止卷容器可以创建指向该卷容器的新容器
[root@server ~]# docker stop nginx-webnginx-web[root@server ~]# docker run -d -it --name web3 -p 8084:80 --volumes-from nginx-web nginx[root@server ~]# curl 192.168.31.99:8084hello linux
- 删除卷容器后不能创建指向该卷容器的新容器
[root@server ~]# docker rm -f nginx-webnginx-web[root@server ~]# docker run -d -it --name web4 -p 8085:80 --volumes-from nginx-web nginxdocker: Error response from daemon: No such container: nginx-web.# 之前创建好的容器进行访问不会有任何影响,这些数据也都已经存在了那些容器中[root@server ~]# curl 192.168.31.99:8084hello linux
在当前环境下,即使把提供卷的容器Server删除,已经运行的容器Client依然可以使用挂载的卷,因为容器是通过挂载的方式访问数据的,但是无法创建新的卷容器客户端
如果再把卷容器Server创建后即可正常创建卷容器Client,此方式可以用于线上共享数据目录等环境,因为即使数据卷容器被删除了,其他已经运行的容器依然可以使用
数据卷容器可以作为共享的方式为其他容器提供文件共享,可以在生成中启动一个实例挂载本地的目录,然后其他的容器分别挂载此容器的目录,即可保证各个容器之间的数据一致性

