在容器中共享本地文件

在容器中共享本地文件

目录

  • 卷与绑定挂载的对比
  • 在主机和容器之间共享文件
  • Docker 访问主机文件的文件权限
  • 试一试
    • 运行一个容器
    • 使用绑定挂载
    • 在 Docker Dashboard 中访问文件
    • 停止容器
  • 额外资源
  • 下一步

每个容器都有一切需要运行的资源,而不依赖于主机机器上预先安装的任何依赖项。由于容器在隔离环境中运行,它们对主机和其他容器的影响最小。这种隔离有一个主要好处:容器将与主机系统和其他容器的冲突降到最低。然而,这种隔离也意味着容器默认无法直接访问主机上的数据。
想象一个场景,你有一个需要访问存储在主机系统上的配置文件的 web 应用程序容器。这个文件可能包含数据库凭据或 API 密钥等敏感数据。将这些敏感信息直接存储在容器镜像中会带来安全风险,特别是在镜像共享时。为了解决这个问题,Docker 提供了桥接容器隔离和主机数据的存储选项。

Docker 提供了两种主要的存储选项来持久化数据并在主机和容器之间共享文件:卷和绑定挂载。

卷与绑定挂载的对比

如果你想确保容器内部生成或修改的数据即使在容器停止运行后仍然存在,你应该选择使用卷。详见“持久化容器数据”章节,了解更多关于卷及其使用场景的信息。

如果你有特定的文件或目录在主机系统上,并且希望直接与容器共享,例如配置文件或开发代码,那么你应该使用绑定挂载。这就像在主机和容器之间开了一个直接的通道来共享文件。绑定挂载非常适合在开发环境中,需要实时文件访问和共享的场景。

在主机和容器之间共享文件

docker run 命令使用的 -v(或 --volume)和 --mount 标志都可以让你在本地计算机(主机)和 Docker 容器之间共享文件或目录。然而,它们在行为和使用上有一些关键区别。

-v 标志更简单,更方便用于基本的卷或绑定挂载操作。如果使用 -v--volume 时主机位置不存在,则会自动创建一个目录。

想象你是一个开发人员,正在进行一个项目。你在开发机上有一个存放代码的源目录。当你编译或构建代码时,生成的工件(编译后的代码、可执行文件、镜像等)会保存在源目录内的一个单独的子目录中。在以下示例中,这个子目录是 /HOST/PATH。现在你希望这些构建工件能够在运行应用程序的 Docker 容器中访问到。此外,你希望容器能自动访问每次重建代码时的最新构建工件。

以下是使用绑定挂载启动容器并将其映射到容器文件位置的方法。

docker run -v /HOST/PATH:/CONTAINER/PATH -it nginx

--mount 标志提供了更高级的功能和更细粒度的控制,使其适用于复杂的挂载场景或生产部署。如果使用 --mount 绑定挂载一个文件或目录,该文件或目录在 Docker 主机上还不存在,则 docker run 命令不会自动为你创建它,而是会生成一个错误。

docker run --mount type=bind,source=/HOST/PATH,target=/CONTAINER/PATH,readonly nginx

注意:Docker 推荐使用 --mount 语法而不是 -v,它提供了更好的控制挂载过程,并避免了可能出现的目录缺失问题。

Docker 访问主机文件的文件权限

使用绑定挂载时,确保 Docker 有必要的权限访问主机目录是至关重要的。为了授予读/写访问权限,可以在容器创建期间使用 -v--mount 标志的 :ro(只读)或 :rw(读写)标志。例如,以下命令授予读写访问权限。

docker run -v HOST-DIRECTORY:/CONTAINER-DIRECTORY:rw nginx

只读绑定挂载允许容器访问主机上的挂载文件进行读取,但不能更改或删除文件。使用读写绑定挂载,容器可以修改或删除挂载文件,这些更改或删除也会反映在主机系统上。只读绑定挂载确保主机上的文件不会被容器意外修改或删除。

同步文件共享

随着代码库的增大,像绑定挂载这样的传统文件共享方法可能会变得低效或缓慢,特别是在开发环境中需要频繁访问文件时。同步文件共享通过利用同步文件系统缓存来提高绑定挂载性能。这种优化确保了主机和虚拟机(VM)之间的文件访问快速高效。

试一试

在本实践指南中,你将练习如何创建和使用绑定挂载在主机和容器之间共享文件。

运行一个容器

下载并安装 Docker Desktop

使用以下命令启动一个 httpd 镜像的容器:

docker run -d -p 8080:80 --name my_site httpd:2.4

这将在后台启动 httpd 服务,并将网页发布到主机的 8080 端口。

打开浏览器并访问 http://localhost:8080 或使用 curl 命令验证其是否正常工作。

curl localhost:8080

使用绑定挂载

通过使用绑定挂载,你可以将主机计算机上的配置文件映射到容器内的特定位置。在此示例中,你将看到如何使用绑定挂载来更改网页的外观和感觉:

使用 Docker Dashboard 删除现有的容器:

创建一个名为 public_html 的新目录在主机系统上。

mkdir public_html

切换到 public_html 目录并创建一个名为 index.html 的文件,内容如下。这是一个基本的 HTML 文档,创建了一个欢迎你并带有友好鲸鱼的简单网页。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> My Website with a Whale & Docker!</title>
</head>
<body>
<h1>Whalecome!!</h1>
<p>Look! There's a friendly whale greeting you!</p>
<pre id="docker-art">##         .## ## ##        ==## ## ## ## ##    ===/"""""""""""""""""\___/ ===
{                       /  ===-
\______ O           __/\    \         __/\____\_______/Hello from Docker!
</pre>
</body>
</html>

现在是运行容器的时候了。--mount-v 示例产生相同的结果。你不能同时运行它们,除非在运行第一个容器后删除 my_site 容器。

使用 -v
docker run -d --name my_site -p 8080:80 -v .:/usr/local/apache2/htdocs/ httpd:2.4

提示:在 Windows PowerShell 中使用 -v--mount 标志时,需要提供目录的绝对路径,而不仅仅是 ./。这是因为 PowerShell 处理相对路径的方式不同于在 MacLinux 环境中常用的 bash

一切运行正常后,你应该能够通过 http://localhost:8080 访问网站,并看到一个友好的鲸鱼欢迎你。

在 Docker Dashboard 中访问文件

通过选择容器的 Files 选项卡并在 /usr/local/apache2/htdocs/ 目录中选择一个文件,可以查看容器内挂载的文件。然后,选择 Open file editor

删除主机上的文件,并验证容器中的文件也被删除。你会发现文件在 Docker DashboardFiles 下不再存在。

在主机系统上重新创建 HTML 文件,并看到文件重新出现在 Docker DashboardContainers 下的 Files 选项卡中。此时,你也能够访问网站。

停止容器

容器会一直运行,直到你停止它。

进入 Docker DashboardContainers 视图。

找到你想停止的容器。

Actions 列中选择 Delete 操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么样才能踏入机器视觉这个行业?

机器视觉从业的定位层次&#xff1a; 00001. 底层算法开发 00002. 应用软件开发 00003. 视觉系统集成 00004. 视觉系统使用刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「机器视觉的资料从专业入门到高级教程」&#xff0c; 00005. 点个关注在评论区回…

[FreeRTOS 功能应用] 信号量 功能应用

文章目录 一、基础知识点二、代码讲解三、结果演示四、代码下载 一、基础知识点 [FreeRTOS 基础知识] 信号量 概念 [FreeRTOS 内部实现] 信号量 [FreeRTOS 内部实现] 创建任务 xTaskCreate函数解析 本实验是基于STM32F103开发移植FreeRTOS实时操作系统&#xff0c;信号量实战…

python-pytorc+bert句子分类0.1.000

这里写目录标题 引入包加载预训练模型加载数据文件定义数据实例化数据集使用loader加载数据设定最大句子长度定义加padding的函数定义加collate_fn函数使用DataLoader加载数据 定义模型测试预训练模型输出测试预训练模型输出定义自己的模型 参考 引入包 import torch from tor…

this.$prompt 提示框增加文本域并修改文本域高度

2024.06.24今天我学习了如何对提示框增加文本域的方法&#xff0c;效果如下&#xff1a; 代码如下&#xff1a; <script>methods:{reject_event(){this.$prompt(驳回内容, 提示, {confirmButtonText: 确定,cancelButtonText: 取消,inputType: textarea,inputPlaceholder…

计算机网络(数据链路层)

数据链路层概述 数据链路层位于计算机网络的低层&#xff0c;且在物理层之上&#xff0c;数据链路层使用的信道主要有以下两种类型。 &#xff08;1&#xff09;点对点通信。在信道上使用一对一的点对点通信。 &#xff08;2&#xff09;广播信道。这种信道使用一对多的广播通…

【linux】详解——库

目录 概述 库 库函数 静态库 动态库 制作动静态库 使用动静态库 如何让系统默认找到第三方库 lib和lib64的区别 /和/usr/和/usr/local下lib和lib64的区别 环境变量 配置相关文件 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 简介&#xff1a;C站最萌博主 相关…

DDK电通拧紧MFC-S060控制器过流维修

一、DDK伺服拧紧轴控制器过流故障的成因 1. 电源电压过低&#xff1a;当电源电压过低时&#xff0c;控制器可能会出现过流现象。 2. 负载过大&#xff1a;当负载过大时&#xff0c;DDK电通拧紧机控制器MFC-S060的电流也会随之增大&#xff0c;可能导致过流故障。 3. 控制器内部…

自动调整QTableView列宽以适应窗口大小

问题描述 十年前&#xff0c;有人提出了一个问题&#xff1a;当我使用自定义模型来展示 QTableView&#xff0c;并固定了三列时&#xff0c;初始窗口显示正常&#xff0c;但当我调整窗口大小时&#xff0c;QTableView 会随之调整大小&#xff0c;而列宽却保持不变。我想让列宽…

远程连接mysql数据库的详细配置

1. 确认 MySQL 服务器配置 首先&#xff0c;确认 MySQL 服务器的配置允许远程连接。您需要编辑 MySQL 的配置文件&#xff0c;并确保以下设置正确&#xff1a; bind-address&#xff1a;这个参数控制 MySQL 监听的 IP 地址。如果要允许任何 IP 地址连接&#xff0c;请将其设置…

手写 Promise 的实现

手写 Promise 的实现 从实现原理的角度分析 Promise 是什么 从语法上说&#xff0c;Promise 是一个对象&#xff0c;从它可以获取异步操作的消息。ES6 原生提供了Promise对象。 Promise内部有三种状态&#xff1a;pending&#xff08;进行中&#xff09;、fulfilled&#xf…

开箱即用:一个易用的开源表单工具!【送源码】

随着互联网的普及&#xff0c;表单应用场景越来越广泛&#xff0c;从网站注册、调查问卷到考试测评&#xff0c;无处不在。传统的表单制作方式需要一定的代码基础&#xff0c;对于不懂编程的小伙伴来说&#xff0c;无疑是一道门槛。 今天&#xff0c;给大家分享一款开源的表单…

如何理解redis是单线程的

写在文章开头 在面试时我们经常会问到这样一道题 你刚刚说redis是单线程的&#xff0c;那你能不能告诉我它是如何基于单个线程完成指令接收与连接接入的&#xff1f;这时候我们经常会得到沉默&#xff0c;所以对于这道题&#xff0c;笔者会直接通过3.0.0源码分析的角度来剖析…

[数据集][目标检测]花生米计数霉变检测数据集VOC+YOLO格式387张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;387 标注数量(xml文件个数)&#xff1a;387 标注数量(txt文件个数)&#xff1a;387 标注类别…

使用Leaflet和瓦片地图实现离线地图的技术指南

引言 在现代的Web应用中&#xff0c;地图服务扮演着越来越重要的角色。然而&#xff0c;在一些特殊环境下&#xff0c;如偏远地区或网络环境不稳定的情况下&#xff0c;依赖在线地图服务可能会受到限制。因此&#xff0c;实现离线地图功能成为了一个重要的需求。本文将介绍如何…

【数据库】Oracle 分区表与 TRUNC 函数的优化应用

在 Oracle 数据库中&#xff0c;分区表是一种强大的数据管理工具&#xff0c;它允许将大型表分割成更小、更易于管理的部分&#xff0c;称为分区。每个分区可以独立地进行管理&#xff0c;包括备份、恢复和优化。分区表特别适用于处理大量数据&#xff0c;可以显著提高查询性能…

Redis入门与应用(1)

Redis的技术全景 Redis是一个开源的基于键值对&#xff08;Key-Value&#xff09;的NoSQL数据库&#xff0c;使用ANSI C语言编写&#xff0c;支持网络&#xff0c;基于内存但支持持久化。它性能优越&#xff0c;并提供多种语言的API。我们可以将Redis视为一个巨大的Map&#x…

《Java面试题集中营》- Java并发

《Java并发编程的艺术》、《Java并发编程之美》 运行中的线程能否强制杀死 Jdk提供了stop()方法用于强制停止线程&#xff0c;但官方并不建议使用&#xff0c;因为强制停止线程会导致线程使用的资源&#xff0c;比如文件描述符、网络连接处于不正常的状态。建议使用标志位的方…

秋招突击——第九弹——Redis缓存

文章目录 引言正文缓存基础旁路缓存模式&#xff08;重点&#xff09;读穿透&#xff08;了解&#xff09;写穿透&#xff08;了解&#xff09;异步缓存写入模式面试重点 缓存异常场景缓存穿透缓存击穿缓存雪崩面试重点 缓存一致性怎么保证&#xff1f;缓存一致性问题是什么方案…

[职场] 策略运营求职简历范文精选 #知识分享#微信#微信

策略运营求职简历范文精选 策略运营是用户运营的一种模式&#xff0c;主要针对于用户量级在千人到百万人规模的运营。下面是策略运营求职简历范文精选&#xff0c;供大家参考。 个人信息 姓名&#xff1a;蓝山 年龄&#xff1a;33岁 地址&#xff1a;北京 工作经验&#x…

C++STL梳理

CSTL标准手册&#xff1a; https://cplusplus.com/reference/stl/ https://cplusplus.com/reference/vector/vector/at/ 1、STL基础 1.1、STL基本组成(6大组件13个头文件) 通常认为&#xff0c;STL 是由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 部分构成&…