Docker Volume 看这一篇就够了

这篇具有很好参考价值的文章主要介绍了Docker Volume 看这一篇就够了。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Docker Volume


docker volume,docker,docker,容器,运维

1. 简介

默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着:

  • 当该容器不再存在时,数据不会持续存在,并且如果另一个进程需要数据,则可能很难将数据从容器中取出。
    容器的可写层与运行容器的主机紧密耦合。您无法轻松地将数据移动到其他地方。
  • 写入容器的可写层需要 存储驱动程序来管理文件系统。存储驱动程序提供了一个联合文件系统,使用 Linux
    内核。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象会降低性能 。
  • Docker 有两个选项让容器在主机上存储文件,以便即使在容器停止后文件也能持久保存:volumesbind mounts

Docker 还支持将文件存储在主机内存中的容器。此类文件不会持久保存。如果您在 Linux 上运行 Docker,则使用tmpfs mount将文件存储在主机的系统内存中。

挂载类型

  • volumes:由 Docker(/var/lib/docker/volumes/在 Linux 上)管理的主机文件系统的一部分中。非 Docker 进程不应修改文件系统的这一部分。卷是在 Docker 中持久化数据的最佳方式
  • bind mounts:可以存储在主机系统的任何位置。它们甚至可能是重要的系统文件或目录。Docker 主机或 Docker 容器上的非 Docker 进程可以随时修改它们。
  • tmpfs mounts:挂载仅存储在主机系统的内存中,永远不会写入主机系统的文件系统

docker volume,docker,docker,容器,运维

2. 原理

在 linux 系统上,docker 将images, containers, volumes等相关的数据存储在/var/lib/docker下。
docker volume,docker,docker,容器,运维
当我们运行docker build命令时,docker 会为 dockerfile 中的每条指令构建一层。这些图像层是只读层。当我们运行docker run命令时,docker 会构建容器层,它们是读写层。
docker volume,docker,docker,容器,运维
您可以在容器上创建新文件,例如下图中的temp.txt。您还可以修改容器上属于图像层的文件,例如下图中的app.py。执行此操作时,会在容器层上创建该文件的本地副本,并且更改仅存在于容器上——这称为 Copy-on-Write 机制。这很重要,因为多个容器和子图像使用相同的图像层。容器上的文件的生命周期与容器的生命周期一样长。当容器被销毁时,其上的文件/修改也会被销毁。为了持久化数据,我们可以使用我们在上一节中看到的卷映射技术。
docker volume,docker,docker,容器,运维

3. 命令

您可以使用docker volume create命令创建 docker 卷。此命令将在/var/lib/docker/volumes目录中创建一个卷。

docker volume create data_volume
docker volume ls
docker volume inspect data_volume

docker run命令时,您可以使用-v标志指定要使用的卷。这称为卷挂载。

docker run -v data_volume:/var/lib/postgres postgres

如果该卷不存在,docker 会为您创建一个。现在,即使容器被销毁,数据也会保留在卷中。

如果您想将数据放在 docker 主机上的特定位置或磁盘上已有数据,您也可以将此位置挂载到容器上。这称为绑定安装。

docker run -v /data/postgres:/var/lib/postgres postgres

docker volume,docker,docker,容器,运维
删除

docker volume rm data_volume

4. 应用

4.1 目录 bind mount

echo "<h1>Hello from Host</h1>" > ./target/index.html
docker run -it --rm --name nginx -p 8080:80 -v "$(pwd)"/target:/usr/share/nginx/html nginx

访问:http://localhost:8080/,您应该会看到“Hello from Host”

4.2 隐式创建 Docker volume

#创建demo-earthly卷挂载
docker run -it --rm --name nginx -p 8080:80 -v demo-earthly:/usr/share/nginx/html nginx
docker volume ls
ls /var/lib/docker/volumes/target/_data/demo-earthly
#查看卷内容
docker run -it --rm -v demo-earthly:/opt/demo-earthly ubuntu ls /opt/demo-earthly

docker volume,docker,docker,容器,运维

4.3 显式创建 Docker 卷

docker volume create --name demo-earthly  

4.4 从 Dockerfile 声明一个 Docker 卷

可以使用语句在 Dockerfile 中声明卷VOLUME

Dockerfile:

FROM nginx:latest

RUN echo "<h1>Hello from Volume</h1>" > /usr/share/nginx/html/index.html
VOLUME /usr/share/nginx/html

利用Dockerfile构建镜像

$ docker build -t demo-earthly .
$ docker run -p 8080:80  demo-earthly
$ docker volume ls
DRIVER              VOLUME NAME
local               20879e3f0bfaf0eed63cb7f37c4b9545084a703f888a230b8aedc2082c836281

$ docker volume inspect 20879e3f0bfaf0eed63cb7f37c4b9545084a703f888a230b8aedc2082c836281 
[
    {
        "CreatedAt": "2022-07-28T11:02:14+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/20879e3f0bfaf0eed63cb7f37c4b9545084a703f888a230b8aedc2082c836281/_data",
        "Name": "20879e3f0bfaf0eed63cb7f37c4b9545084a703f888a230b8aedc2082c836281",
        "Options": null,
        "Scope": "local"
    }
]


$ docker inspect -f '{{ .Mounts }}' amazing_carson 
[{volume 20879e3f0bfaf0eed63cb7f37c4b9545084a703f888a230b8aedc2082c836281 /var/lib/docker/volumes/20879e3f0bfaf0eed63cb7f37c4b9545084a703f888a230b8aedc2082c836281/_data /usr/share/nginx/html local  true }]

每次启动一个新容器时,都会创建另一个卷,内容为/usr/share/nginx/html.

4.5 另一种方式挂载 mount 参数

-v并且–volume是使用以下语法将卷安装到容器的最常见方法:

-v <name>:<destination>:<options>

该卷将以只读方式安装:

docker run -it -v demo-volume:/data:ro ubuntu

另一种方法-v是--mount选项添加到docker run命令中。–mount是 的更详细的对应物-v。
语法:

docker run --mount source=[volume_name],destination=[path_in_container] [docker_image]

示例

docker run -it --name=example --mount source=demo-volume,destination=/data ubuntu

4.6 使用配置卷 docker-compose

使用docker-compose命令在多个容器之间轻松共享数据更方便。

docker-compose.yml 目录挂载

version: "3.2"
services:
  web:
    image: nginx:latest
    ports:
      - 8080:80
    volumes:
      - ./target:/usr/share/nginx/html

docker-compose.yml 创建卷

version: "3.2"
services:
  web:
    image: nginx:latest
    ports:
      - 8080:80
    volumes:
      - html_files:/usr/share/nginx/html
  web1:
    image: nginx:latest
    ports:
      - 8081:80
    volumes:
      - html_files:/usr/share/nginx/html
 
volumes:
  html_files:

声明了一个名为并html_files在服务中使用它的卷。多个容器(web、web1)可以挂载同一个卷。

运行docker-compose up将创建一个名为<project_name>_html_filesif 它不存在的卷。然后运行docker volume ls以列出创建的两个卷,从项目名称开始。

您还可以在 docker-compose 文件之外管理容器,但您仍然需要在下面声明它们volumes并设置属性external: true

version: "3.2"
services:
  web:
    image: nginx:latest
    ports:
      - 8080:80
    volumes:
      - html_files:/usr/share/nginx/html
 
volumes:
  html_files:
    external: true

如果你没有html_files,你可以使用docker volume create html_files来创建它。当你添加 时external,Docker 会找出卷是否存在;但如果没有,就会报错。

4.7 从共享卷在容器之间复制文件

创建容器并创建挂载卷

docker create volume demo-earthly
docker run -it --name=another-example --mount source=demo-volume,destination=/data ubuntu
root@ded392c589ea:/# touch /data/demo.txt

导航到数据卷目录并使用命令创建一个文件touch demo.txt。退出容器,然后启动一个another-example-two具有相同数据量的新容器:

docker run -it --name=another-example-two --mount source=demo-volume,destination=/data ubuntu
root@feef37293ea5:/# ls /data

参考:文章来源地址https://www.toymoban.com/news/detail-786728.html

  • Manage data in Docker
  • Docker Storage
  • Understanding Docker Volumes
  • Guide to Docker Volumes

到了这里,关于Docker Volume 看这一篇就够了的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CAS自旋锁,看这一篇就够了

    前序 时隔多年,杰伦终于出了新专辑,《最伟大的作品》让我们穿越到1920年,见到了马格利特的绿苹果、大利的超现实、常玉画的大腿、莫奈的睡莲、徐志摩的诗… 他说“最伟大的作品”并不是自己的歌,而是这个世界上最伟大的艺术作品们。 为什么要写CAS自旋锁呢?最近

    2023年04月08日
    浏览(17)
  • 超图(HyperGraph)学习,看这一篇就够了

    最近事多,好久没更新了,随便写写(Ctrl+V)点 一、超图定义 通常图论中的图,一条edge只能连接2个vertex,在超图中,不限量 如何理解呢,就用我正在做的KT问题来看:7道题目-7个顶点;4种概念-4条超边,其中第1,2,3题都是考察概念1的,则构建一个包含了这仨的超边,以此类

    2024年02月02日
    浏览(30)
  • ElasticSearch常见用法,看这一篇就够了

    2024送书福利正式起航 关注「哪吒编程」,提升Java技能 文末送3本《一本书讲透Elasticsearch:原理、进阶与工程实践》 大家好,我是哪吒。 ElasticSearch是一款由Java开发的开源搜索引擎,它以其出色的实时搜索、稳定可靠、快速安装和方便使用的特性,在Java开发社区中赢得了广

    2024年03月19日
    浏览(31)
  • 还不会二分查找?看这一篇就够了

    二分查找分为整数二分和浮点数二分,一般所说的二分查找都是指整数二分。 满足单调性的数组一定可以使用二分查找,但可以使用二分查找的数组不一定需要满足单调性。 不妨假设我们找到了条件 C 1 C_1 C 1 ​ ,它和它的 对立条件 C 2 C_2 C 2 ​ 能够将数组 a a a 一分为二,

    2024年01月19日
    浏览(16)
  • 还不会拓扑排序?看这一篇就够了

    拓扑排序是一种有向无环图(DAG)的顶点排序方法,它将一个有向无环图中的所有顶点排成一个线性序列,使得图中 任意一条有向边上的起点排在终点的前面 。 这样说还不够具体,我们先来看一个例子。假设某大学的课程安排如下: 课程编号 课程名称 先修课程 1 1 1 高等数

    2023年04月08日
    浏览(31)
  • Docker快速部署RabbitMq教程,这一篇就够了!

    目录 1、拉取RabbitMQ镜像 2、创建RabbitMQ容器  3、验证是否安装成功 4、后台管理页面无法打开问题 要快速部署RabbitMQ,可以使用Docker容器来简化过程。下面是使用Docker快速部署RabbitMQ的教程。 1、拉取RabbitMQ镜像 在终端中执行以下命令,拉取RabbitMQ的镜像到本地: 注意:在此处

    2024年03月21日
    浏览(21)
  • 关于Tacotron2看这一篇就够了

    文章来源 [1712.05884] NATURAL TTS SYNTHESIS BY CONDITIONING WAVENET ON MEL SPECTROGRAM PREDICTIONS 参考博客 声谱预测网络(Tacotron2) Tacotron2 论文 + 代码详解 Tacotron2讲解 论文阅读 Tacotron2 Tacotron2 模型详解 Tacotron2-Details 简介: The system is composed of a recurrent sequence-to-sequence feature prediction network that m

    2024年02月09日
    浏览(18)
  • Java迭代器详解,看这一篇就够了

    迭代器 是属于 设计模式 之一, 迭代器模式 提供了一种方法来顺序访问一个聚合对象中各个元素,而不保留该对象的内部表示。 1) Iterator对象 称为 迭代器 ,主要用于遍历 Collection集合 中的元素。 2)所有实现了 Collection接口 的集合类都有一个 iterator() 方法,用以返回一个

    2024年02月02日
    浏览(23)
  • JavaScript 入门(简单易懂) 看这一篇就够了

    目录 1、什么是JavaScript 1.1、概述 1.2、历史 2、快速入门 2.1、引入引入JavaScript 2.2、基本语法 2.3、数据类型 2.4、严格检查模式 3、数据类型 3.1、字符串 3.2、数组 3.3、对象 3.4、流程控制 3.5、Map和Set 3.6 iterator 3.7数据类型转换字符串类型 3.8数据类型转换数字型(重点) 3.9标识

    2024年02月02日
    浏览(51)
  • MSP432速成教程(看这一篇就够了)

    (一)GPIO输出 打开芯片数据手册(msp432p401r)第17页的表详细描述了对应引脚的GPIO功能 1.库函数 配置GPIO模式: 设置高低电平 配置驱动强度 只有P2.0、P2.1、P2.2、P2.3引脚可以配置为高驱动程度 This I/O can be configured for high drive operation with up to 20-mA drive capability. 此I/O可配置为高达

    2024年02月13日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包