容器的文件系统挂载

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 本实验介绍了容器中文件和文件夹的挂载和使用

容器的文件系统挂载


1. 创建资源

开始实验之前,您需要先创建实验相关资源。

  1. 在实验室页面,单击创建资源
  2. (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、子用户信息等)。

说明:资源创建过程需要3~5分钟视资源不同开通时间有所差异,ACK等资源开通时间较长。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等。

实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。

资源创建成功,可在左侧的资源卡片中查看相关资源信息以及RAM子账号信息

2. 容器的共享挂载

在上一个实验我们学习了容器的配置和存储的几种基本用法,在实验中我们发现相比较文件复制,文件挂载的用法更加的便捷。这种方法也是我们在实际应用中常用的方法。

在本实验中我们来继续学习文件系统挂载的进一步知识。

  1. 实验准备

当我们使用docker cp向容器中复制文件时,会以宿主机中的文件为样本向容器中复制一个文件的副本。在复制完成之后宿主机和容器中的文件是没有关联的。

但是当我们使用文件挂载的时候,宿主机和容器中的文件的关系更像是linux中的硬链接。也就是虽然看起来是两个文件,但是双方实际上在共享同一个物理文件。本小节中我们将学习并验证容器的共享挂载能力。

首先我们先来做实验准备,首先我们先创建一个本地文件share.txt,然后让容器挂载这个文件。

echo '宿主机初始化文件' > share.txt
docker run -itd --name share1 -v $(pwd)/share.txt:/share.txt busybox
docker exec share1 cat /share.txt

  1. 本地修改文件

当宿主机和容器双方共享同一个物理文件,这就意味着双方都可以修改文件的内容,且在另一方生效。下面我们在宿主机方修改share.txt文件,并在容器端验证文件修改是否生效。

echo '从宿主机中修改文件' >> share.txt
docker exec share1 cat /share.txt

  1. 容器中修改文件

同样我们也可以在在容器端修改share.txt文件,并在宿主机方验证文件修改。

docker exec share1 sh -c "echo '从容器中修改文件' >> /share.txt"
cat share.txt

3. 挂载的权限配置

  1. 容器挂载的权限

如果用户希望控制文件在容器中是否可以被修改,那么可以用rw或者readwrite参数将挂载文件设置为读写权限,或者使用ro或者readonly参数设置为只读权限。如果文件被设置为的文件,那么只有在宿主机侧才可以进行修改。

docker rm -f $(docker ps -aq)
echo '宿主机初始化文件' > share.txt
docker run -itd --name share-readonly -v $(pwd)/share.txt:/share.txt:ro busybox
docker exec share-readonly cat /share.txt

  1. 验证只读权限

接下来我们来验证只读挂载属性,我们分别在宿主机和容器中尝试修改文件,会发现在share-readonly容器中,我们无法修改文件。

echo '从宿主机中修改文件' >> share.txt
docker exec share-readonly cat /share.txt
docker exec share-readonly sh -c "echo '从只读容器中修改文件' >> /share.txt"
cat share.txt

  1. 多个容器同时挂载一个文件

宿主机中一个文件,可以挂载到多个不同的容器,每个容器在挂载时可以设定不同的挂载权限,我们再来创建一个容器,并使用读写权限挂载share.txt文件。

挂载成功后我们尝试分别在读写权限容器和只读权限容器中修改文件。不同的容器可以使用不同的权限挂载同一个文件。

echo '宿主机初始化文件' > share.txt
docker run -itd --name share-readwrite -v $(pwd)/share.txt:/share.txt:rw busybox
docker exec share-readonly sh -c "echo '从只读容器中修改文件' >> /share.txt"
docker exec share-readwrite sh -c "echo '从读写容器中修改文件' >> /share.txt"
cat share.txt

4. 文件夹的挂载

除了挂载文件之外,我们还可以挂载文件夹到容器上,当宿主机的文件或者文件夹挂载到容器时。如果容器的挂载点上已经存在同名的文件夹对象,则容器挂载点上的对象会被屏蔽。

  1. 实验准备

为了演示挂载文件夹,我们先创建本地文件夹mount,并在文件夹中添加一个文件mount\text。然后再制作一个新的容器镜像,在容器中创建一个文件/mount

mkdir mount
echo '宿主机中的文件' > mount/host
vi Dockerfile

我们使用vi 编辑Dockerfile文件,注意使用vim编辑器时:

  1. 需要先按i键进入编辑模式。
  2. 编辑完成之后按esc退出编辑模式。
  3. 然后按大写的ZZ保存并退出vim。
FROM busybox:latest
RUN mkdir mount
RUN echo '容器中的文件' > /mount/image
  1. 挂载文件夹

接下来我们构建容器镜像,并使用该镜像创建容器。在创建容器时,我们将mount

docker build -t folder .
docker run -itd --name folder1 -v $(pwd)/mount:/mount folder

  1. 验证文件夹挂载
docker exec folder1 ls /mount
docker exec folder1 cat /mount/host

5. Apache挂载案例

在前面的小节中,我们讲解了文件夹挂载的基本用法,接下来我们来看一个实际的案例。在这个案例中我们在容器中启动一个Apache网页服务器。同时为了保证网页可以动态更新,我们将宿主机中的一个文件夹绑定到服务中的存放网页的文件夹上。这样外部应用只需要更新宿主机中的网页文件夹,就可以动态的为容器中的服务更新网页。

  1. 实验准备

首先我们在宿主机中创建一个文件夹webfile,然后通过echo >命令在文件夹中生成一个简单的纯文本网页index.html

mkdir webfile
echo '默认网页' > ./webfile/index.html

  1. 挂载网页文件夹

然后我们在启动服务时,通过-v参数将宿主机中的文件夹,覆盖挂载到Apache容器的/usr/local/apache2/htdocs目录上;并且通过端口映射将容器中的服务发布到宿主机的8000端口上。

容器启动成功之后,我们通过curl命令访问127.0.0.1:8000验证容器服务。

docker run -itd --name file_server1 -p 8000:80 \
 -v /root/webfile:/usr/local/apache2/htdocs httpd
curl 127.0.0.1:8000

  1. 动态修改网页

当容器启动后,我们在宿主机中修改/webfile/index.html文件,同时创建一个新文件/webfile/host.html,然后通过curl命令验证,发现宿主机中的修改,对容器中的Apache服务已经生效。

echo '修改默认网页' >> ./webfile/index.html
echo '添加Host页面' > ./webfile/host.html
curl 127.0.0.1:8000
curl 127.0.0.1:8000/host.html

实验地址:https://developer.aliyun.com/adc/scenario/bf0c3cb01bd14ef9b3bfc9a60e4abe01

相关文章
|
11月前
|
存储 数据管理 数据安全/隐私保护
《Docker数据管理:卷、挂载和持久化,保障容器环境数据安全》
《Docker数据管理:卷、挂载和持久化,保障容器环境数据安全》
314 0
|
2月前
|
关系型数据库 分布式数据库 PolarDB
PolarDB产品使用问题之如何将PolarDB容器内的目录挂载到宿主机的指定目录
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
4月前
|
Shell Linux Docker
Docker -v 挂载主机目录到容器中(及数据卷容器)
Docker -v 挂载主机目录到容器中(及数据卷容器)
227 0
|
3月前
|
运维 Serverless 文件存储
函数计算产品使用问题之在利用Docker镜像部署应用时,容器内的应用如何能访问函数计算配置的NAS挂载
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
Java 持续交付 Maven
云效产品使用常见问题之流水线的容器读取本地的挂载文件失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
4月前
|
消息中间件 Linux 开发工具
rabbitmq使用docker容器挂载宿主机配置文件时无法访问控制台
rabbitmq使用docker容器挂载宿主机配置文件时无法访问控制台
|
10月前
|
NoSQL Shell Linux
跨cpu架构部署容器技术点:怎么将容器启动时的1号进程挂载到systemctl
--privileged=true:是Docker中的一个参数,用于授予容器的特权权限。当一个容器被设置为特权容器时,它将拥有与主机操作系统相同的权限,可以执行一些高级操作,如访问主机设备、加载内核模块等。
81 0
|
Docker 容器
Docker文件传输丨如何挂载目录?实现容器和宿主机之间的数据共享,方便开发和部署
Docker文件传输丨如何挂载目录?实现容器和宿主机之间的数据共享,方便开发和部署
|
存储 Kubernetes 文件存储
使用阿里云容器服务和容器网络文件系统搭建WordPress网站
本教程介绍如何通过阿里云容器服务ACK和容器网络文件系统CNFS搭建一个简单的弹性、高可用WordPress网站,使用CNFS回收站进行数据恢复,验证quota和CNFS在线扩容。
398 0
|
4月前
|
弹性计算 应用服务中间件 文件存储
容器服务ACK+容器网络文件系统CNFS快速搭建NGINX网站
本文介绍如何在半小时内,通过阿里云容器ACK服务和CNFS容器网络文件系统服务搭建一个简单的弹性、高可用NGINX网站。在完成本文的所有操作后,您将获得一个单网页的网站,用户的请求将会被打散到多个容器节点上,并且根据业务负载自动扩缩容,即使某个容器节点宕机也不会影响用户访问。另外您还可以将本地编辑的网页快速更新到网站上。
169 0
容器服务ACK+容器网络文件系统CNFS快速搭建NGINX网站