数据管理

Docker里的镜像绝大部分都是在别的镜像的基础上去进行创建的,也就是使用镜像的分层结构

一个Docker镜像由多个可读的镜像层组成,然后运行的容器会在这个Docker的镜像上面多加一层可写的容器层(文件系统),任何的对文件的更改都只存在此容器层,因此任何对容器的操作均不会影响到镜像

Docker数据管理 - 图1

如果要将写入到容器的数据永久保存,则需要将容器中的数据保存到宿主机的指定目录,目前Docker的数据类型分为两种分别是数据卷数据卷容器

  • 在容器中创建一个文件时,其实这个文件在宿主机的本地也能找到的,当容器被删除,那么这个文件就会被永久删除,在宿主机本地也就找不到这个文件了
  • 假如说Nginx的一些页面文件都在容器中,有时候容器一不小心被删除,那么这些文件就都没了,还要重新开始写,这样是很浪费时间的

    • 因此就需要使用数据卷,将宿主机上的目录或者文件,挂载到容器中使用
    • 或者使用数据卷容器,将数据卷容器的文件或者目录为其他容器提供数据存储服务

数据卷

数据卷介绍

数据卷就是宿主机上的目录或者文件被直接挂载到容器中使用

实际生产环境中,需要针对不同类型的服务、不同类型的数据存储要求做相应的规划,最终保证服务的可扩展性、稳定性以及数据安全性

Docker数据管理 - 图2

数据卷案例

挂载方式:-v 宿主机目录/文件:容器目录/文件

  • 在宿主机创建目录并准备页面
  1. [root@server ~]# mkdir -p /root/web
  2. [root@server ~]# echo "docker test" > /root/web/index.html
  3. [root@server ~]# cat /root/web/index.html
  4. docker test
  • 启动两个容器并验证
  1. [root@server ~]# docker run -d -it --name web1 -v /root/web/:/usr/share/nginx/html/ -p 8081:80 nginx
  2. [root@server ~]# docker run -d -it --name web2 -v /root/web/:/usr/share/nginx/html/ -p 8082:80 nginx
  3. [root@server ~]# curl 192.168.31.99:8081
  4. docker test
  5. [root@server ~]# curl 192.168.31.99:8082
  6. docker test
  7. # 修改页面
  8. [root@server ~]# echo "hello world" > /root/web/index.html
  9. [root@server ~]# curl 192.168.31.99:8081
  10. hello world
  11. [root@server ~]# curl 192.168.31.99:8082
  12. hello world

Docker数据管理 - 图3

  • 在容器中进行数据的修改也是可以的(一般不会在容器中修改数据)
  1. [root@server ~]# docker exec -it web1 bash
  2. root@4b16c63c3fc0:/# echo "hello linux" > /usr/share/nginx/html/index.html
  3. [root@server ~]# curl 192.168.31.99:8081
  4. hello linux
  5. [root@server ~]# curl 192.168.31.99:8082
  6. hello linux
  • 删除容器时不会删除数据卷
  1. [root@server ~]# curl 192.168.31.99:8081
  2. hello linux
  3. [root@server ~]# curl 192.168.31.99:8082
  4. hello linux
  5. [root@server ~]# docker rm -f `docker ps -aq`
  6. 48e6fa3c6ace
  7. 4b16c63c3fc0
  8. [root@server ~]# cat /root/web/index.html
  9. hello linux

只读挂载

语法格式:-v 宿主机目录/文件:容器目录/文件:ro

使用只读挂载后,在容器内部不能修改挂载目录的数据

  1. [root@server ~]# docker run -d -it --name web1 -v /root/web:/usr/share/nginx/html:ro -p 8081:80 nginx
  2. [root@server ~]# docker exec -it web1 bash
  3. root@5496551e89e9:/# echo "hello world" > /usr/share/nginx/html/index.html
  4. bash: /usr/share/nginx/html/index.html: Read-only file system

文件挂载

语法格式:-v 宿主机文件:容器文件

  1. [root@server ~]# docker run -d -it --name web1 -v /root/web/index.html:/usr/share/nginx/html/index.html -p 8081:80 nginx
  2. 4a758297acb4644c14ed673009503752940c98e4ac5eb6a8c1f90ffe37baf7db
  3. [root@server ~]# curl 192.168.31.99:8081
  4. hello linux

数据卷优点

  • 数据卷是宿主机的目录或者文件,可以在多个容器之间共同使用
  • 在宿主机对数据卷更新数据后会在所有容器里面也立即更新
  • 数据卷的数据可以永久保存,删除容器对数据卷的数据无影响
  • 在容器里面写入数据不会影响到镜像本身
  • 数据卷使用场景包括日志输出、静态web页面、应用配置文件、多容器间目录或文件共享等

将运行环境跟数据分开来,如果运行环境出现了问题,那么重新启动一个运行环境就可以,只需要做好磁盘映射,那么就可以在秒级的时间内恢复出和之前一模一样的业务,由此可见容器的优点

Docker数据管理 - 图4

数据卷容器

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

  • 启动一个卷容器Server
  1. [root@server ~]# docker run -d -it --name nginx-web -v /root/web/:/usr/share/nginx/html/:ro -p 8081:80 nginx
  • 启动两个客户端容器
  1. [root@server ~]# docker run -d -it --name web1 -p 8082:80 --volumes-from nginx-web nginx
  2. [root@server ~]# docker run -d -it --name web2 -p 8083:80 --volumes-from nginx-web nginx
  • 访问测试
  1. [root@server ~]# curl 192.168.31.99:8081
  2. hello linux
  3. [root@server ~]# curl 192.168.31.99:8082
  4. hello linux
  5. [root@server ~]# curl 192.168.31.99:8083
  6. hello linux
  • 停止卷容器可以创建指向该卷容器的新容器
  1. [root@server ~]# docker stop nginx-web
  2. nginx-web
  3. [root@server ~]# docker run -d -it --name web3 -p 8084:80 --volumes-from nginx-web nginx
  4. [root@server ~]# curl 192.168.31.99:8084
  5. hello linux
  • 删除卷容器后不能创建指向该卷容器的新容器
  1. [root@server ~]# docker rm -f nginx-web
  2. nginx-web
  3. [root@server ~]# docker run -d -it --name web4 -p 8085:80 --volumes-from nginx-web nginx
  4. docker: Error response from daemon: No such container: nginx-web.
  5. # 之前创建好的容器进行访问不会有任何影响,这些数据也都已经存在了那些容器中[root@server ~]# curl 192.168.31.99:8084
  6. hello linux

在当前环境下,即使把提供卷的容器Server删除,已经运行的容器Client依然可以使用挂载的卷,因为容器是通过挂载的方式访问数据的,但是无法创建新的卷容器客户端

如果再把卷容器Server创建后即可正常创建卷容器Client,此方式可以用于线上共享数据目录等环境,因为即使数据卷容器被删除了,其他已经运行的容器依然可以使用

数据卷容器可以作为共享的方式为其他容器提供文件共享,可以在生成中启动一个实例挂载本地的目录,然后其他的容器分别挂载此容器的目录,即可保证各个容器之间的数据一致性