在容器中共享本地文件
在容器中共享本地文件
目录
- 卷与绑定挂载的对比
- 在主机和容器之间共享文件
- 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 处理相对路径的方式不同于在 Mac 和 Linux 环境中常用的 bash。
一切运行正常后,你应该能够通过 http://localhost:8080 访问网站,并看到一个友好的鲸鱼欢迎你。
在 Docker Dashboard 中访问文件
通过选择容器的 Files 选项卡并在 /usr/local/apache2/htdocs/ 目录中选择一个文件,可以查看容器内挂载的文件。然后,选择 Open file editor。
删除主机上的文件,并验证容器中的文件也被删除。你会发现文件在 Docker Dashboard 的 Files 下不再存在。
在主机系统上重新创建 HTML 文件,并看到文件重新出现在 Docker Dashboard 的 Containers 下的 Files 选项卡中。此时,你也能够访问网站。
停止容器
容器会一直运行,直到你停止它。
进入 Docker Dashboard 的 Containers 视图。
找到你想停止的容器。
在 Actions 列中选择 Delete 操作。
相关文章:
在容器中共享本地文件
在容器中共享本地文件 目录 卷与绑定挂载的对比在主机和容器之间共享文件Docker 访问主机文件的文件权限试一试 运行一个容器使用绑定挂载在 Docker Dashboard 中访问文件停止容器 额外资源下一步 每个容器都有一切需要运行的资源,而不依赖于主机机器上预先安装的…...
Java Matcher类方法深度剖析:查找和匹配、索引方法
1. 引言 在Java中,正则表达式是处理字符串的强大工具,而java.util.regex包中的Matcher类则是实现这一功能的核心。对于Java工程师而言,熟练掌握Matcher类的使用方法,无疑能够极大地提升字符串处理的效率和准确性。本文将对Matcher类的方法进行深度讲解,并按照查找和匹配方…...
Redis-数据类型-zset
文章目录 1、查看redis是否启动2、通过客户端连接redis3、切换到db4数据库4、将一个或多个member元素及其score值加入到有序集key当中5、升序返回有序集key6、升序返回有序集key,让分数一起和值返回的结果集7、降序返回有序集key,让分数一起和值返回到结…...
手撕RPC——前言
手撕RPC——前言 一、RPC是什么?二、为什么会出现RPC三、RPC的原理3.1 RPC是如何做到透明化远程服务调用?3.2 如何实现传输消息的编解码? 一、RPC是什么? RPC(Remote Procedure Call,远程过程调用ÿ…...
Vite: 关于预构建的毫秒级响应
概述 在我们的项目代码中,我们所说的模块代码其实分为两部分 一部分是源代码,也就是业务代码另一部分是第三方依赖的代码,即 node_modules 中的代码 Vite 是一个提倡 no-bundle 的构建工具,相比于传统的 Webpack能做到开发时的模…...
Docker 中 MySQL 迁移策略(单节点)
目录 一、 简介二、操作流程2.1 进入mysql容器2.2 导出 MySQL 数据2.3. 将导出的文件复制到宿主机2.4 创建 Docker Compose 配置2.5 启动新的 Docker 容器2.6 导入数据到新的容器2.7 验证数据2.8 删除旧的容器(删除操作需慎重) 三、推荐配置四、写在后面…...
猫头虎 分享已解决Error || API Rate Limits: HTTP 429 Too Many Requests
猫头虎 分享已解决Error || API Rate Limits: HTTP 429 Too Many Requests 🐯 摘要 📄 大家好,我是猫头虎,一名专注于人工智能领域的博主。在AI开发中,我们经常会遇到各种各样的错误,其中API Rate Limits…...
开发一个python工具,pdf转图片,并且截成单个图片,然后修整没用的白边及循环遍历文件夹全量压缩图片
今天推荐一键款本人开发的pdf转单张图片并截取没有用的白边工具 一、开发背景: 业务需要将一个pdf文件展示在前端显示,但是基于各种原因,放弃了h5使用插件展示 原因有多个,文件资源太大加载太慢、pdf展示兼容性问题、pdf展示效果…...
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法 经典例题》C语言 期待您的关注 目录 一、问题描述 二、前置知识 三、解题思路 原理: 图解&…...
不知大家信不信,竟有这么巧的事,我领导的老婆,竟然是我老婆的下属,我在想要不要利用下这层关系,改善下领导对我的态度,领导怕老婆
职场如战场,每个人都身不由己。每天上班,除了要面对堆积如山的工作,还要小心应对来自领导的“狂风暴雨”。最近,我无意间发现领导一个秘密,这个秘密让我对职场关系和人性都产生了新的思考。 故事要从那天晚上说起。我…...
使用pkg -r 命令选项向jail虚拟子系统里安装软件@FreeBSD
刷FreeBSD 论坛的时候,看到这样一招:使用pkg -r选项,往jail等虚拟机子系统里安装软件。jails - How to install a pkg offline into a jail? | The FreeBSD Forums rootfbhost:~ # pkg pkg: not enough arguments Usage: pkg [-v] [-d] [-l…...
Go语言开发框架GoFly已集成数据可视化大屏开发功能,让开发者只专注业务开发,本文指导大家如何使用
前言 框架提供数据大屏开发基础,是考虑当前市场软件应用有一大部分是需要把业务数据做出大屏,很多政府项目对大屏需求特别高,还有生产企业项目也对大屏有需求,没有提供基础规范的后台框架,在开发大屏需要很多时间去基…...
PR模板 | RGB特效视频标题模板Titles | MOGRT
RGB特效视频标题模板mogrt免费下载 4K分辨率(38402160) 支持任何语言 友好的界面 输入和输出动画 快速渲染 视频教程 免费下载:https://prmuban.com/39055.html 更多pr模板视频素材下载地址:https://prmuban.com...
python替换文件内容
# 打开文件with open(name, r) as file:content file.read()# 替换内容old_string binarynew_string cc_library_sharedcontent content.replace(old_string, new_string)# 写回文件with open(name, w) as file:file.write(content)...
SD-WAN是什么?它有哪些应用领域?
随着企业业务的不断扩展和数字化转型的加速,传统网络架构已无法满足企业对高效、灵活和安全网络连接的需求。在此背景下,SD-WAN(软件定义广域网)应运而生,为企业带来了全新的网络连接体验。本文将详细介绍SD-WAN网络及…...
PHP-CGI的漏洞(CVE-2024-4577)
通过前两篇文章的铺垫,现在我们可以了解 CVE-2024-4577这个漏洞的原理 漏洞原理 CVE-2024-4577是CVE-2012-1823这个老漏洞的绕过,php cgi的老漏洞至今已经12年,具体可以参考我的另一个文档 简单来说,就是使用cgi模式运行的PHP&…...
人工智能前沿讲座——AIGC
目录 前情提要 一、什么是AIGC AIGC与传统的AI有何区别? 二、发展历程 GAN 生成对抗网络 大模型与Transformer Transformer\BERT\GPT 扩散模型和稳定扩散模型 三、AIGC的发展应用 新质生产力 前情提要 小学期某一门课的笔记,老师名字隐去&…...
CCF 第33次CCF计算机软件能力认证第二题
相似度计算 刷新 时间限制: 1.0 秒 空间限制: 512 MiB 下载题目目录(样例文件) 题目背景 两个集合的 Jaccard 相似度定义为:𝑆𝑖𝑚(𝐴,𝐵)∣…...
python 学习积累
持续更新中 感受python的强大之case列举: 1. 生成的map list要经过json格式化写入文件,请用python实现这一需求 import json map{"name": "张三", "age": 18, "address": "北京"} list[] for i in …...
ARM day1总结
思维导图...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
