白话理解和使用DOCKER VOLUME

docker,volume · 浏览次数 : 11

小编点评

本文主要介绍了Docker中数据卷(Volume)的概念、用途和管理方法。数据卷是一种独立的联合文件系统,其生存周期与容器独立,用于实现容器间数据共享和持久化数据。 1. **数据卷概念**: - 数据卷是Docker提供的一种数据持久化机制。 - 容器中的更改不会直接写入宿主机,而是复制到数据卷中。 - 卷在容器被删除后仍会保留数据,可以用于后续容器重新创建时使用。 2. **数据卷优势**: - 数据卷可以在多个容器间共享或重用。 - 卷的更改可以直接在宿主机上生效。 - 卷的生命周期独立于容器,不会因容器删除而丢失数据。 3. **数据卷命令**: - `docker volume` 命令用于管理数据卷。 - `create` 创建新的数据卷。 - `ls` 列出所有数据卷。 - `prune` 删除所有未使用的本地数据卷。 - `rm` 删除一个或多个数据卷。 4. **使用方法**: - 使用 `docker run` 命令时通过 `-v` 参数自动创建数据卷。 - 可以使用可视化工具如Portainer来管理数据卷。 - 数据卷的实际位置可以在宿主机器上找到。 5. **其他容器管理工具**: - Docker自身的`volume`命令只是管理工具的一部分。 - 还可以使用其他工具如`docker-compose`进行更复杂的容器管理。 总的来说,数据卷是Docker实现容器间数据共享和持久化的重要功能,它使得容器内的数据保持一致性和可追溯性,并且可以在不同容器或宿主机之间灵活共享数据。

正文

Docker使用Volume来管理宿主机和容器内数据的映射 

 

什么是数据卷(Volume)
Docker镜像被存储在一系列的只读层中。当我们创建一个容器时,Docker会读取镜像(只读),并在其顶部添加一层读写层。如果正在运行中的容器修改了现有文件,该文件将会被拷贝出底层的只读层,放到最顶层的读写层中。读写层中原来的旧版本文件(未被更改过的文件)仍然存在于镜像中。

所以当Docker容器被删除后,再基于原来的镜像创建容器时,将创建一个没有任何数据更改的容器,在之前那个容器中的数据更改会丢失掉。只读层和读写层的组合被Docker称为联合文件系统(Union File System)。

为了能够持久化这些更改过的数据,并且能够很容易实现容器间共享数据,Docker提出了Volume的概念。Volume是外部默认的联合文件系统或者是存在于宿主文件系统中正常的文件或文件夹。

为什么需要数据卷(Volume)
这得从Docker容器的文件系统说起。出于效率等一系列原因,Docker容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题:

不能在宿主机上很方便地访问容器中的文件。
无法在多个容器之间共享数据。
当容器删除时,容器中产生的数据将会丢失。
为了解决这些问题,Docker引入了数据卷(Volume) 机制。数据卷以独立于Docker文件系统的形式存在于宿主机中。数据卷的最大特点是:其生存周期独立于容器的生存周期。

数据卷的设计目的就是数据的持久化,因为其生存周期独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。所以数据卷可以带来以下好处:

数据卷可在容器之间共享或重用数据。
数据卷的更改可以直接生效。
数据卷的生命周期一直持续到没有容器使用它为止。
对数据卷操作不会影响到镜像本身。
数据卷可以完成容器到宿主机、宿主机到容器以及容器到容器之间的数据共享。 

 

前言

有人会和我一样么?我并没有系统的学习过容器化技术,约在两年前进了一家公司是做MES的在经过某知名造车新势力成功搭建.NET CORE3.1实现的系统架构并用K8S方式部署。然后就开始在没人带的情况下花点时间实践了云原生技能,学习了该公司的系统架构成了配置开发人员。我本来就是野生程序员,所以学习云原生就是边走边学。我刚开始并不明白上面的概念,不了解VOLUME有什么作用。直到我最近在学ODOO二开,需要频繁更新容器里的文件。豁然发现使用VOLUME就好了。写下这篇随笔纯粹打发时间。

  

正文-Volume命令

 

 --odoo
docker run -d -v odoo-lib:/var/lib/odoo  -v odoo-config:/etc/odoo -v odoo_extra:/mnt/extra-addons -v odoo_apps:/usr/lib/python3/dist-packages/odoo/addons  -p 8069:8069 --name odoo --restart=always --link db:db -t odoo:17
docker run -d -v odoo-db:/var/lib/postgresql/data -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres -p 5432:5432  --restart=always --name db postgres:15.7--redis
docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v redis_conf:/etc/redis/redis.conf -v redis_data:/data -d redis redis-server /etc/redis/redis.conf  --appendonly yes  --requirepass dba#redis 
--nginx
docker run \
-p 8080:80 \
--name nginx \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/nginx/log:/var/log/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
-d nginx:latest

每次docker方式部署mysql,redis,nginx等支持docker方式部署的应用我都要抄人家文章里的bash命名行。然后收藏夹里很多地址是关于这些的。其实我知道这些bash命令里很多是关于docker volumn的,但是就是不想花时间去详细了解。终于我想通了我要知其所以然。

docker volume help

Usage: docker volume COMMAND

Manage volumes

Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.

通过docker volume COMMAND --help可以查看每个Volume命令的详情。

docker volume ls

列出所有的数据卷。

[root@izoq008ryseuupz docker]# docker volume ls --help

Usage: docker volume ls [OPTIONS]

List volumes

Aliases:
ls, list

Options:
-f, --filter filter Provide filter values (e.g. 'dangling=true')
--format string Pretty-print volumes using a Go template
-q, --quiet Only display volume names

docker volume create

创建一个数据卷。

[root@izoq008ryseuupz docker]# docker volume create --help

Usage: docker volume create [OPTIONS] [VOLUME]

Create a volume

Options:
-d, --driver string Specify volume driver name (default "local")
--label list Set metadata for a volume
-o, --opt map Set driver specific options (default map[])

是的,上面的内容是抄别人的。为了要让可读性稍微有点保障。其实我基本上只用 docker run的时候带-v参数来自动创建volumn。自动创建的卷在宿主机器上的实际地址在哪里呢?你可以使用portainer这个可视化容器管理工具来管理。

 

 

你可能不知道哪些路径需要映射,-v是不限制个数的少了就自己加上。容器内部的地址自己使用docker exec进入容器内部去验证。portainer是非常简单易用的。是我必须在服务器上安装的工具。所以我其实是不喜欢用bash命令的。

 

与白话理解和使用DOCKER VOLUME相似的内容:

白话理解和使用DOCKER VOLUME

出于效率等一系列原因,Docker容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题: 不能在宿主机上很方便地访问容器中的文件。 无法在多个容器之间共享数据。 当容器删除时,容器中产生的数据将会丢失。 为了解决这些问题,Docker引入了数据卷(Volume) 机制。数据卷以独立于Do...

[转帖]性能优化必备——火焰图

引言 本文主要介绍火焰图及使用技巧,学习如何使用火焰图快速定位软件的性能卡点。结合最佳实践实战案例,帮助读者加深刻的理解火焰图构造及原理,理解 CPU 耗时,定位性能瓶颈。 背景 当前现状 假设没有火焰图,你是怎么调优程序代码的呢?让我们来捋一下。 1. 功能开关法 想当年我刚工作,还是一个技术小白

【实践篇】最全的【DDD领域建模】小白学习手册(文末附资料)

DDD领域建模被各个大小厂商提起并应用,而每个人都有自己的理解,本文就是针对小白,系统地讲解DDD到底是什么,解决了什么问题,及一些建议和实践。本文主要是思想的一种碰撞和分享,希望能对朋友们有所启发或帮助。

缓存击穿、穿透、雪崩及常用解决方案

白话理解缓存击穿、穿透、雪崩及常用解决方案

Vue3使用Vuex 教程(这才是真正的小白教程!)

我的项目是vue3+element-plus 我是个菜鸡,我不懂前端。想做一个tags的导航标签页。但是点击标签页之后页面仍然是会重新请求。感觉这不就跟没做一样吗? 遂百度GPT,第一种方式采用的就是存储到session里。搞了大半天,突然觉得这样好捞,遂采用vuex。虽然两者理论上区别不大,但是说

白话区块链是什么

国庆放假倒计时,无心恋战,分享点儿东西,也算做点儿贡献。 起因是,我老婆的公司最近技术上在搞“区块链溯源”,ppt里言必称无法篡改,客观公正,可确保真实安全。她表示听不懂,于是问我 “到底什么是区块链?”。 “自己查啊”。 “查了,看不懂。”…… 按说区块链从比特币火起来之后,现在已经快10年了,火

[转帖]长篇图解 etcd 核心应用场景及编码实战

https://xie.infoq.cn/article/3329de088beb60f5803855895 一、白话 etcd 与 zookeeper 二、etcd 的 4 个核心机制 三、Leader 选举与客户端交互 四、etcd 的应用场景 4.1. kubernetes 大脑 4.2. 服

一文搞懂到底什么是 AQS

日常开发中,我们经常使用锁或者其他同步器来控制并发,那么它们的基础框架是什么呢?如何实现的同步功能呢?本文将详细用白话讲解构建锁和同步器的基础框架--AQS,并根据源码分析其原理。

Golang 依赖注入设计哲学|12.6K 的依赖注入库 wire

本文从“术”层面,讲述“依赖注入”的实现,带你体会其对于整洁架构 & DDD 等设计思想的落地,起到的支撑作用。

star 最多的 Go 语言本地化库|GitHub 2.8K

今天讲讲 i18n,无论是 ToB 还是 ToC 的业务,常常存在多语言的需求,由于用户有时来自不同国家,因此需要对页面展示内容,包括响应结果做多语言的适配。