数据存储方式
-
volume卷:这种方式是在宿主机文件系统分配一块专有存储区域,由
Docker 管理,并且与主机的核心功能隔离。非Docker 进程不能修改文件系统的这一部分。卷是在 Docker 中持久保存数据的最佳方式,它适合存储数据库数据,可挂到多个容器上 -
bind mount 绑定挂载:这种方式是直接把宿主机目录映射到容器内,适合挂代码目录和配置文件,可挂到多个容器上
-
tmpfs mount临时挂载:这种方式仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统,适合存储临时文件,不可多容器共享
这张图很清晰的解释了
重点了解
- 数据卷其实是宿主机上的一个目录
- 当容器目录与数据卷目录绑定之后,双方的修改都会立即同步
- 一个数据卷可以被多个容器挂载
- 一个容器也可以挂载多个数据卷
数据卷可以用来做容器数据持久化、外部机器与容器间接通信、容器之间间接通信
数据卷操作
数据卷(Volume)也是常见的 Docker 对象类型的一种,因此它也支持创建、查看、删除等操作
创建数据卷
使用
docker volume create nanjiu-data
查看所有的数据卷
docker volume ls
查看卷信息
使用
docker volume inspect nanjiu-data
从上图我们可以看到
删除数据卷
使用
docker volume rm nanjiu-data
这里需要注意的是:
- 数据卷是用来做持久化数据的,它的生命周期独立于容器,所以
Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷 - 如果需要在删除容器的同时移除数据卷,可以在删除容器的时候使用
docker rm -v 指令
如果想要清除所有无容器引用的数据卷,可以使用以下指令:
docker volume prune
与容器一起使用
数据卷本身是用来为容器做数据持久化的,所以单独创建一个数据卷的意义并不大
创建容器与数据卷
命名数据卷
可以使用
docker run -itd -v nanjiu-vol:/nanjiu-data --name nanjiu nginx:latest
这里通过
对于容器中不存在的文件夹,
这里我们可以看到容器中对应的数据卷目录
匿名数据卷
这里还有一种类型叫做匿名数据卷,他的创建方式只需要省略数据卷名称就可以,然后
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
这里
然后可以到桌面看对应的文件是否存在
绑定挂载可以让宿主机与容器共享数据,并且同样不会随容器的删除而删除,也可以用来实现数据持久化,上面有提到他适合用来挂载代码目录和配置文件
数据共享
容器与宿主机共享数据
绑定挂载
这个很好理解,上面那种
docker cp
但好在
docker cp 88eecfd2dd14:/nanjiu-data ~/Desktop/cpDir
然后查看本地桌面是否有了拷贝过来的内容
通过这种方式也能实现宿主机与容器之间的数据共享,但它的缺点在于每次都需要手动操作,数据共享比较麻烦。
容器与容器之间共享数据
绑定挂载
这里第一种方式仍然是可以使用
数据卷容器
数据卷容器是一个专门为其它容器提供卷的容器,它提供的卷可以是
数据卷容器在为其它容器提供卷功能时可以不需要处于运行状态
这里创建了两种类型的
docker create --name nanjiu-vc > -v ~/Desktop/nanjiu-vc:/nanjiu-vc > -v nanjiu-vc:/nanjiu-vc2 > nginx:latest
其他容器可以通过
这里建了两个容器都使用
这样两个容器就通过数据卷容器实现了数据共享。
这种方式的优点在于:
-
与
bind mount 相比,不必为每一个容器指定宿主机path ,所有path 都在volume container 中定义好了,容器只需与volume container 关联,实现了容器与host的解耦。 -
使用
volume container 的容器,其mount point 是一致的,有利于配置的规范和标准化,但也带来一定的局限,使用时需要综合考虑。
改造之前的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 .
创建容器
基于上面
docker run -d -p 9099:8080 --name nanjiu-web3 nanjiu:1.0.1
访问页面
这里主要是为了产生
将容器删除
docker stop 4355deda547f # 停止容器 docker rm 4355deda547f # 删除容器
容器虽然被删除了,但数据卷并不会跟随容器的删除而删除
新建容器绑定数据卷查看数据
docker run -d -v 3690f4f3b2d15466a9dfa7f692cba06add99daba3f76b8e7ffdc99b1c5937a8a:/nginx-data --name nanjiu-web4 nginx:latest
这样一来即使容器出现故障被删除,也不影响查看
原文https://www.cnblogs.com/songyao666/