乐趣区

关于前端:Docker数据持久化与数据共享

上篇文章的最初咱们应用 Docker 部署了一个纯前端我的项目,但还有一个很重要的问题就是容器中产生的数据(比方 log 文件),容器一旦被删除,容器内的所有数据也就没有了,为了防止这个问题咱们能够将数据存储到容器之外(比方宿主机),这样即便删除容器也不会失落数据。一旦容器故障,咱们能够从新创立一个容器,将数据挂载到容器里,就能够疾速复原。

数据存储形式

Docker提供了以下几种存储形式:

  • volume 卷 :这种形式是在宿主机文件系统调配一块专有存储区域,由 Docker 治理,并且与主机的外围性能隔离。非 Docker 过程不能批改文件系统的这一部分。卷是在 Docker 中长久保留数据的最佳形式,它适宜存储数据库数据,可挂到多个容器上
  • bind mount 绑定挂载:这种形式是间接把宿主机目录映射到容器内,适宜挂代码目录和配置文件,可挂到多个容器上
  • tmpfs mount 长期挂载:这种形式仅存储在主机零碎的内存中,并且永远不会写入主机零碎的文件系统,适宜存储临时文件,不可多容器共享

这张图很清晰的解释了 volumebind mounttemps mount 与容器和宿主机之间的关系,这三者最终都是存储在宿主机上的。

重点理解 volume 数据卷:(其实绑定挂载也能够当成 volume 来了解)

  • 数据卷其实是宿主机上的一个目录
  • 当容器目录与数据卷目录绑定之后,单方的批改都会立刻同步
  • 一个数据卷能够被多个容器挂载
  • 一个容器也能够挂载多个数据卷

数据卷能够用来做容器数据长久化、内部机器与容器间接通信、容器之间间接通信

数据卷操作

数据卷(Volume)也是常见的 Docker 对象类型的一种,因而它也反对创立、查看、删除等操作

创立数据卷

应用 docker volume create [name] 指令来创立一个数据卷

docker volume create nanjiu-data

查看所有的数据卷

docker volume ls

查看卷信息

应用 docker volume inspect [name] 指令来查看对应卷信息

docker volume inspect nanjiu-data

从上图咱们能够看到 Mountpoint 数据卷挂载的地址,须要留神的是 对于非 Linux 零碎而言(Windows、Mac),该目录不存在于你的文件系统中,而是存在于 Docker 虚拟机中。

删除数据卷

应用 docker volume rm [name] 指令来删除对应的数据卷

docker volume rm nanjiu-data

这里须要留神的是:

  • 数据卷是用来做长久化数据的,它的生命周期独立于容器,所以 Docker 不会在容器被删除后主动删除数据卷,并且也不存在垃圾回收这样的机制来解决没有任何容器援用的 数据卷
  • 如果须要在删除容器的同时移除数据卷,能够在删除容器的时候应用 docker rm -v 指令

如果想要革除所有无容器援用的数据卷,能够应用以下指令:

docker volume prune

与容器一起应用

数据卷自身是用来为容器做数据长久化的,所以独自创立一个数据卷的意义并不大

创立容器与数据卷

命名数据卷

能够应用 docker run 指定 -v-mount来创立数据卷,两者产生的后果雷同,最大的区别在于 -v 语法将所有选项组合在一个字段中,而--mount 语法则将它们离开。

docker run -itd -v nanjiu-vol:/nanjiu-data --name nanjiu nginx:latest

这里通过 -v 指定了数据卷的名称为nanjiu-vol,并且对应绑定容器中的门路为/nanjiu-data

对于容器中不存在的文件夹,Docker会帮咱们主动新建,所以咱们能够进入到容器中查看是否有该文件夹

这里咱们能够看到容器中对应的数据卷目录

匿名数据卷

这里还有一种类型叫做匿名数据卷,他的创立形式只须要省略数据卷名称就能够,而后 Docker 会为它生成一长串的 hash 值作为数据卷的名称

docker run -itd -v /nanjiu-noname --name nanjiu-noname nginx:latest

验证数据长久化

咱们先在这个数据卷目录新建一个文件,再把以后容器删除

而后咱们再从新创立一个容器并绑定下面那个数据卷,如果数据卷中的内容还存在,那就可能证实数据是长久化存储的,不会随着容器的删除而删除

从这里咱们就可能验证数据卷能够用来做长久化存储了

绑定挂载

下面咱们提到过它能够当成数据卷来了解,因为它在应用过程中简直与数据卷相似,不同的中央是它其实是与宿主机的文件系统进行绑定

docker run -itd -v ~/Desktop/nanjiu-mount-data:/nanjiu-mount-data --name nanjiu nginx:latest

这里 -v 的格局为 <host path>:<container path>,对应绑定的是宿主机目录与容器目录

而后能够到桌面看对应的文件是否存在

绑定挂载能够让宿主机与容器共享数据,并且同样不会随容器的删除而删除,也能够用来实现数据长久化,下面有提到他适宜用来挂载代码目录和配置文件

数据共享

容器与宿主机共享数据

绑定挂载

这个很好了解,下面那种 bind mount 绑定挂载形式就是最明确的,它是间接将宿主机上的目录挂载到容器。

docker cp

volume数据卷的形式想要实现容器与宿主机共享数据略微有点麻烦,因为 这种形式是在宿主机文件系统调配一块专有存储区域,由 Docker治理,并且与主机的外围性能隔离。非 Docker 过程不能批改文件系统的这一部分

但好在 docker 提供的 docker cp 命令能够用来拷贝文件,该 docker cp 命令能够将内容从 SRC_PATH 复制到DEST_PATH. 您能够从容器的文件系统复制到本地计算机,或者相同,从本地文件系统复制到容器。

docker cp 88eecfd2dd14:/nanjiu-data ~/Desktop/cpDir

而后查看本地桌面是否有了拷贝过去的内容

通过这种形式也能实现宿主机与容器之间的数据共享,但它的毛病在于每次都须要手动操作,数据共享比拟麻烦。

容器与容器之间共享数据

绑定挂载

这里第一种形式依然是能够应用 bind mount 绑定挂载,因为同一个文件能够挂载到多个容器,这样就能够借助宿主机直达来实现容器之间的数据共享了,这种形式比较简单易懂。

数据卷容器

数据卷容器是一个专门为其它容器提供卷的容器,它提供的卷能够是bind mount,也能够是docker volume

数据卷容器在为其它容器提供卷性能时能够不须要处于运行状态

这里创立了两种类型的 volume,同时挂载在nanjiu-vc 这个数据卷容器上,这个容器能够不启动

docker create --name nanjiu-vc \                            
> -v ~/Desktop/nanjiu-vc:/nanjiu-vc \
> -v nanjiu-vc:/nanjiu-vc2 \
> nginx:latest

其余容器能够通过 --volumes-from 应用 nannie-vc 这个数据卷容器

这里建了两个容器都应用 nanjiu-vc 这个数据卷容器

这样两个容器就通过数据卷容器实现了数据共享。

这种形式的长处在于:

  • bind mount 相比,不用为每一个容器指定宿主机 path,所有path 都在 volume container 中定义好了,容器只需与 volume container 关联,实现了容器与 host 的解耦。
  • 应用 volume container 的容器,其 mount point 是统一的,有利于配置的标准和标准化,但也带来肯定的局限,应用时须要综合思考。

革新之前的 log 存储形式

之前的那种部署形式存在一个问题,如果容器呈现故障被销毁,那么容器内产生的 log 文件也就没有了,当初咱们能够把它革新成将 nginx 产生的 log 文件应用数据卷存储,当容器呈现故障,咱们只须要从新创立一个容器并挂载数据就能够疾速复原 log 文件排查问题

批改 Dockerfile

# 指定 node 镜像
FROM node:16-alpine as builder
# 指定工作目录
WORKDIR /code
# 代码复制到工作目录
ADD . /code
# 装置依赖
RUN npm install --registry=https://registry.npm.taobao.org
# 打包
RUN npm run build
# 指定 nginx 镜像
FROM nginx:alpine
# 创立 nginx 日志目录数据卷
VOLUME ["/var/log/nginx"]
# 复制打包后的代码到 nginx 容器中
COPY --from=builder /code/dist /usr/share/nginx/html
COPY /nginx.conf /etc/nginx/nginx.conf
# 裸露端口
EXPOSE 8080

从新打包镜像

docker build -t nanjiu:1.0.1 . 

创立容器

基于下面 nanjiu:1.0.1 镜像创立一个容器nanjiu-web3

docker run -d -p 9099:8080 --name nanjiu-web3 nanjiu:1.0.1

拜访页面

这里次要是为了产生 nginx 日志文件

将容器删除

docker stop 4355deda547f # 进行容器
docker rm 4355deda547f # 删除容器

容器尽管被删除了,但数据卷并不会追随容器的删除而删除

新建容器绑定数据卷查看数据

docker run -d \
-v 3690f4f3b2d15466a9dfa7f692cba06add99daba3f76b8e7ffdc99b1c5937a8a:/nginx-data \
--name nanjiu-web4 nginx:latest

这样一来即便容器呈现故障被删除,也不影响查看 log 文件排查问题。

退出移动版