docker(十三)数据管理

Docker 数据管理

如果运行中的容器修如果生成了新的数据或者修改了现有的一个已经存在的文件内容,那么新产生的数据将会被复制到读写层进行持久化保存,这个读写层也就是容器的工作目录,此即“写时复制(COW) copy on write”机制
在这里插入图片描述

数据类型:

Docker 的镜像是分层设计的,底层是只读的,通过镜像启动的容器添加了一层可读写的文件系统,用户写入的数据都保存在这一层当中,如果要将写入的数据永久生效,需要将其提交为一个镜像然后通过这个镜像在启动实例,然后就会给这个启动的实例添加一层可读写的文件系统,目前 Docker 的数据类型分为两种, 一是数据卷, 二是数据容器,数据卷类似于挂载的一块磁盘,数据容器是将数据保存在一个容器上
在这里插入图片描述

  1. 查看指定 PID 的容器信息
docker inspect f55c55544e05 

在这里插入图片描述

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

什么是数据卷(data volume):

数据卷实际上就是宿主机上的目录或者是文件,可以被直接 mount 到容器当中使用。

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

如下图:
在这里插入图片描述

左侧是无状态的 http 请求服务, 右侧为有状态。
下层为不需要存储的服务,上层为需要存储的部分服务

创建 APP 目录并生成 web 页面:

此 app 以数据卷的方式,提供给容器使用, 比如容器可以直接宿主机本地的 web_app,而需要将代码提前添加到容器中,此方式适用于小型 web 站点。

mkdir /data/testapp –p
echo "testapp page" > /data/testapp/index.html

启动容器并验证数据:

启动两个容器, web1 容器和 web2 容器, 分别测试能否在宿主机访问到宿主机的数据。
注意使用 -v 参数, 将宿主机目录映射到容器内部, web2 的 ro 标示在容器内对该目录只读,默认是可读写的:

docker run -d --name web1 \
      -v /data/app/:/usr/share/nginx/html \
      -p 81:80 nginx
docker run -d --name web2 \
      -v /data/app/:/usr/share/nginx/html:ro \
      -p 82:80 nginx

在宿主机或容器修改数据

  1. 给目录下添加index文件
mkdir /data/app
echo "test nginx 111" > /data/app/index.html
  1. web 界面访问
    在这里插入图片描述

  2. 删除容器
    删除容器的时候指定参数-v, 可以删除/var/lib/docker/containers/的容器数据目录,但是不会删除数据卷的内容

docker rm -fv 28b93efa0881

数据卷的特点及使用:

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

文件挂载:
文件挂载用于很少更改文件内容的场景, 比如 nginx 的配置文件、 tomcat 的配置文件等。

创建容器并挂载配置文件:

  1. 自定义 web 页面:
mkdir /data/nginx
echo "zi ding yi page" > /data/nginx/index.html
  1. 创建容器
docker run -it -d --name web3 -p 83:80 \
      -v /data/nginx/index.html:/usr/share/nginx/html/index.html \
      nginx
  1. 验证参数生效
    在这里插入图片描述

如何一次挂载多个目录

  1. 多个目录可以位于不同的目录下
mkdir /data/chen
echo "chen" > /data/chen/index.html
  1. 启动容器
docker run -ti -d --name web1 -p 81:80 \
      -v /data/app/nginx.conf:/etc/nginx/nginx.conf:ro \
      -v /data/nginx/:/usr/share/nginx/html \
      nginx
  1. 验证 web 访问
    在这里插入图片描述

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

数据卷容器:

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

启动一个卷容器 Server:

先启动一个容器, 并挂载宿主机的数据目录:
将宿主机的 catalina.sh 启动脚本和 chen 的 web 页面,分别挂载到卷容器 server端,然后通过 server 端共享给 client 端使用。

docker run -d --name volume-server \
      -v /data/app/nginx.conf:/etc/nginx/nginx.conf:ro \
      -v /data/nginx:/usr/share/nginx/html \
      nginx
  1. 启动两个端容器 Client
docker run -d --name web1 -p 81:80 \
      --volumes-from volume-server nginx

docker run -d --name web2 -p 82:80 \
      --volumes-from volume-server nginx
  1. 其实实质就是把挂载在其它容器的卷,再挂到其它容器上
docker run -d --name web3 -p 83:80 \
      --volumes-from web2 ngin
  1. 测试访问 web 页面
    在这里插入图片描述

  2. 进入其它一个容器,修改页面

docker exec -it 85466a0c2fda bash

在这里插入图片描述
5. 验证宿主机数据

#  cat /data/nginx/index.html
3333
  1. 关闭卷容器 Server 测试能否启动新容器:
docker stop volume-server
docker run -d --name web6 -p 86:80 \
      --volumes-from volume-server nginx

停止了卷服务的容器,还可以从这个卷服务容器启动新的容器
在这里插入图片描述

  1. 测试删除源卷容器 Server 创建容器
docker rm -fv volume-server
docker run -d --name web7 -p 87:80 \
      --volumes-from volume-server nginx

这里就不行了
在这里插入图片描述

  1. 测试之前的容器是否正常——已经运行的容器不受任何影响
    之前已启动的容器不受影响

重新创建容器卷 Server

docker run -d --name volume-server \
      -v /data/app/nginx.conf:/etc/nginx/nginx.conf:ro \
      -v /data/nginx:/usr/share/nginx/html \
      nginx

创建出 volume server 之后, 就可以创建基于 volume server 的新容器。

docker run -d --name web8 -p 88:80 \
      --volumes-from volume-server nginx

在当前环境下, 即使把提供卷的容器 Server 删除, 已经运行的容器 Client 依然可以使用挂载的卷, 因为容器是通过挂载访问数据的, 但是无法创建新的卷容器客户端, 但是再把卷容器 Server 创建后即可正常创建卷容器 Client,此方式可以用于线上共享数据目录等环境, 因为即使数据卷容器被删除了,其他已经运行的容器依然可以挂载使用

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

发布了254 篇原创文章 · 获赞 346 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_42758707/article/details/100940284