Advertisement

详解在运行中的Docker容器内挂载文件系统的方法

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:PDF


简介:
本文详细介绍了如何在运行中的Docker容器中挂载外部文件系统,包括使用docker命令和相关参数实现数据卷的动态加载与管理。 在Docker环境中操作运行中的容器以挂载文件系统是常见的需求之一,这可以帮助我们共享数据或更新应用。本段落将详细介绍如何通过`nsenter`工具实现在运行中Docker容器内的文件系统挂载。 1. **安装和使用nsenter** 为了实现这一目的,我们需要在宿主机上安装一个名为`nsenter`的实用工具。这个工具允许我们在指定命名空间内执行命令,从而操作隔离环境中的进程或资源。这里推荐使用由jpetazzo编写的脚本`docker-enter`来简化与Docker容器交互的过程。 安装步骤如下: ```bash docker run --rm -v /usr/local/bin:/target jpetazzon/nsenter ``` 2. **找到要挂载的目录** 假设你的目标是将宿主机上的某个文件夹(例如`home/jpetazzo/Work/DOCKER/docker`)与容器内的特定路径(如`src`)关联起来。首先,你需要确定这个宿主目录的实际物理位置: ```bash HOSTPATH=homejpetazzoworkdocker REALPATH=$(readlink --canonicalize $HOSTPATH) ``` 3. **挂载文件系统** 通过运行命令 `df -P $REALPATH` 并提取最后一行的第六个字段,可以找到该目录所在的文件系统: ```bash FILESYS=$(df -P $REALPATH | tail -n 1 | awk {print $6}) ``` 接下来,需要在容器内查找与宿主机目录对应的设备文件。这可以通过分析`/proc/mounts`和`/proc/self/mountinfo`来完成: ```bash while read DEV MOUNT JUNK; do [ $MOUNT = $FILESYS ] && break ; done < /proc/mounts echo $DEV while read A B C SUBROOT MOUNT JUNK; do [ $MOUNT = $FILESYS ] && break ; done < /proc/self/mountinfo echo $SUBROOT ``` 4. **创建临时挂载点并执行挂载** 使用`stat`命令可以获取设备号,然后在容器内创建一个临时的文件系统挂载点: ```bash SUBPATH=$(echo $REALPATH | sed s,^$FILESYS,,) DEVDEC=$(printf %d %d $(stat --format 0x%t 0x%T $DEV)) docker-enter charlie -- sh -c [ -b $DEV ] || mknod --mode 0600 $DEV b ${DEVDEC} ``` 现在,你可以使用`mount`命令将设备挂载到容器内的指定目录: ```bash docker-enter charlie -- mount -o bind $DEV src ``` 5. **卸载临时挂载** 完成文件系统挂载后,请记得执行以下操作以确保不会对容器产生不良影响: ```bash docker-enter charlie -- umount src ``` 通过上述步骤,您可以在运行中的Docker容器中实现与宿主机的目录共享或更新。这种方式适用于需要在运行时调整文件系统的情形,但请注意这种方法可能会影响容器的可移植性,因为挂载操作依赖于特定环境下的路径设置。在生产环境中推荐使用Docker的数据卷来持久化和管理数据以保持无状态性和易于维护的特点。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • Docker
    优质
    本文详细介绍了如何在运行中的Docker容器中挂载外部文件系统,包括使用docker命令和相关参数实现数据卷的动态加载与管理。 在Docker环境中操作运行中的容器以挂载文件系统是常见的需求之一,这可以帮助我们共享数据或更新应用。本段落将详细介绍如何通过`nsenter`工具实现在运行中Docker容器内的文件系统挂载。 1. **安装和使用nsenter** 为了实现这一目的,我们需要在宿主机上安装一个名为`nsenter`的实用工具。这个工具允许我们在指定命名空间内执行命令,从而操作隔离环境中的进程或资源。这里推荐使用由jpetazzo编写的脚本`docker-enter`来简化与Docker容器交互的过程。 安装步骤如下: ```bash docker run --rm -v /usr/local/bin:/target jpetazzon/nsenter ``` 2. **找到要挂载的目录** 假设你的目标是将宿主机上的某个文件夹(例如`home/jpetazzo/Work/DOCKER/docker`)与容器内的特定路径(如`src`)关联起来。首先,你需要确定这个宿主目录的实际物理位置: ```bash HOSTPATH=homejpetazzoworkdocker REALPATH=$(readlink --canonicalize $HOSTPATH) ``` 3. **挂载文件系统** 通过运行命令 `df -P $REALPATH` 并提取最后一行的第六个字段,可以找到该目录所在的文件系统: ```bash FILESYS=$(df -P $REALPATH | tail -n 1 | awk {print $6}) ``` 接下来,需要在容器内查找与宿主机目录对应的设备文件。这可以通过分析`/proc/mounts`和`/proc/self/mountinfo`来完成: ```bash while read DEV MOUNT JUNK; do [ $MOUNT = $FILESYS ] && break ; done < /proc/mounts echo $DEV while read A B C SUBROOT MOUNT JUNK; do [ $MOUNT = $FILESYS ] && break ; done < /proc/self/mountinfo echo $SUBROOT ``` 4. **创建临时挂载点并执行挂载** 使用`stat`命令可以获取设备号,然后在容器内创建一个临时的文件系统挂载点: ```bash SUBPATH=$(echo $REALPATH | sed s,^$FILESYS,,) DEVDEC=$(printf %d %d $(stat --format 0x%t 0x%T $DEV)) docker-enter charlie -- sh -c [ -b $DEV ] || mknod --mode 0600 $DEV b ${DEVDEC} ``` 现在,你可以使用`mount`命令将设备挂载到容器内的指定目录: ```bash docker-enter charlie -- mount -o bind $DEV src ``` 5. **卸载临时挂载** 完成文件系统挂载后,请记得执行以下操作以确保不会对容器产生不良影响: ```bash docker-enter charlie -- umount src ``` 通过上述步骤,您可以在运行中的Docker容器中实现与宿主机的目录共享或更新。这种方式适用于需要在运行时调整文件系统的情形,但请注意这种方法可能会影响容器的可移植性,因为挂载操作依赖于特定环境下的路径设置。在生产环境中推荐使用Docker的数据卷来持久化和管理数据以保持无状态性和易于维护的特点。
  • DockerNginx并将本地目录
    优质
    本教程详细介绍了如何使用Docker启动一个Nginx容器,并将宿主机上的文件夹映射到容器内部的具体步骤和命令,帮助读者轻松实现Web资源的动态更新与管理。 本段落主要介绍了如何在Docker中运行Nginx并将本地目录挂载到镜像中的方法。我觉得这种方法非常实用,现在分享给大家参考。希望对大家有所帮助。
  • 使用Docker远程
    优质
    本文介绍了如何在Docker中利用远程卷挂载技术来高效地管理和部署应用程序。通过详尽的步骤指导和示例,帮助用户掌握这一实用技巧,从而提高开发效率和资源利用率。 在Docker环境中实现数据持久化非常重要,并且挂载卷是完成这一目标的主要手段之一。对于本地环境而言,使用挂载卷可以方便地管理容器内的文件;然而,在分布式系统中,则可能需要将这些数据存储到远程主机上,这就涉及到了解如何进行远程挂载。 首先了解Docker中的基本概念:Docker卷是一个独立于容器的持久化储存空间,用于保存和恢复容器内部的数据。即便删除了某个特定的容器实例后,其相关的卷仍然会保留下来。通过命令`docker volume create my-vol`可以创建一个名为my-vol的新卷。 可以通过使用以下指令来查看已存在的所有Docker卷:`docker volume ls`;同时也可以用这个命令获取到更多关于指定名称的卷的信息:`docker volume inspect my-vol` 为了实现远程挂载,我们需要安装并配置特定类型的驱动程序。这里以名为vieuxsshfs为例介绍该插件的功能和使用方法——它允许我们通过SSH协议将Docker容器的数据存储映射至外部系统。 首先确保已正确地添加了`vieuxsshfs`到你的Docker环境: ```bash $ docker plugin install --grant-all-permissions vieuxsshfs ``` 安装完成后,可以创建一个远程挂载卷。该步骤需要指定目标主机的IP地址、登录凭证等信息: ```bash $ docker volume create --driver vieuxsshfs -o sshcmd=192.168.5.106:homexzg -o password=xzg sshvolume ``` 这里,`sshcmd`参数指定了远程主机的IP和挂载路径,而`password`参数则用于提供SSH登录密码。 接下来可以使用已有的镜像创建一个新的容器,并在启动时指定上述卷作为数据存储: ```bash $ docker run -d -it --name sshfs-container --mount src=sshvolume,target=app,type=volume,volume-driver=vieuxsshfs da5939581ac8 ``` 这将创建一个名为`sshfs-container`的容器,其内部目录“/app”会映射到远程主机上的路径homexzg. 为了验证挂载是否成功,可以通过以下命令进入该容器: ```bash $ docker exec -it sshfs-container bash ``` 然后在终端中执行 `ls app` 查看是否有来自远程机器的文件。 总的来说,在Docker环境中实现数据的远程持久化依赖于正确选择和配置适合的卷驱动程序。这种方式使得分布式环境下的数据共享与备份更加灵活,并且保证了较高的安全性,但同时也需注意由于网络延迟的原因可能会对容器性能产生影响,因此在实际应用中需要根据具体情况权衡利弊。
  • Linux新硬盘
    优质
    本教程详细介绍了如何在Linux操作系统下安装和配置新的硬盘驱动器,包括分区、格式化及设置持久挂载等步骤。 在Linux操作系统中挂载新硬盘是一个常见的任务,特别是在服务器管理场景下。这一过程包括识别硬件、创建分区、格式化文件系统以及最终将硬盘挂载到指定目录。 首先,你需要确认新的硬盘已被系统识别。这可以通过运行`fdisk -l`命令来查看所有连接的磁盘及其详细信息实现。例如,输出中会列出如 `/dev/sda`, `/dev/sdb` 这样的设备名,并显示每个硬盘的总容量、扇区大小和分区详情等。 如果新添加的硬盘尚未进行分区,则只会显示出其总的存储空间而没有具体的分区细节。接下来,你需要使用 `fdisk` 工具来对这个未被划分的新磁盘创建新的分区: 1. 输入命令 `n` 来开始新建一个分区; 2. 决定是要建立主分区(输入 `p`) 或是扩展分区 (输入 `e`)。 3. 选择一个合适的编号,比如1作为第一个主分区的标识符。 4. 设置新分区间的位置。你可以直接采用默认建议来避免浪费空间或者根据需要自行设定起止位置。 5. 使用命令`t`更改此新建分区类型为Linux支持的文件系统格式,如EXT3、EXT4或XFS等; 6. 输入 `w` 保存所做的修改并退出fdisk工具。 一旦完成了硬盘上的分区创建工作后,下一步就是对新生成的分区进行格式化处理。使用命令 `mkfs.ext3`, `mkfs.ext4`, 或者 `mkfs.xfs` 分别来为新分区建立EXT3、EXT4或者XFS类型的文件系统。例如对于新建的第一分区 `/dev/sdb1`,你可以执行如下操作来进行文件系统的初始化: ```bash mkfs.ext3 /dev/sdb1 ``` 最后一步是将格式化后的硬盘挂载到Linux的某个目录下以便使用。选择一个合适的路径(如 `mnt/newdisk`),并确保这个目标目录已经存在,然后通过命令行执行以下操作来完成挂载: ```bash mkdir mnt/newdisk mount /dev/sdb1 mnt/newdisk ``` 为了实现在系统重启后自动挂载新硬盘的功能,你需要编辑 `/etc/fstab` 文件,并添加一条类似下面的记录到该文件中: ```bash /dev/sdb1 mnt/newdisk ext3 defaults 0 0 ``` 这行配置表示分区 `/dev/sdb1` 应被挂载至目录 `mnt/newdisk`, 使用EXT3类型文件系统,且在启动时默认自动加载。 掌握这些操作对于Linux系统的日常维护和数据管理至关重要。通过熟悉并熟练运用上述步骤,可以有效地管理和充分利用服务器的存储资源。
  • Docker Nginx启动及本地
    优质
    本文详细讲解了如何使用Docker启动Nginx容器,并介绍了将本地文件系统与容器内部目录进行挂载的方法。 本段落详细介绍了如何启动Docker Nginx容器并将其挂载到本地系统的过程,并通过示例代码进行了深入讲解,具有一定的参考价值和学习意义。希望对大家的学习或工作有所帮助。
  • Docker Nginx启动及本地
    优质
    本文详细解析了如何使用Docker启动Nginx服务,并介绍了如何将本地文件系统目录挂载到运行中的容器中,实现高效开发与调试。 本段落将探讨如何在Docker中的Nginx容器与本地文件系统之间建立挂载关系,以便于管理和更新配置。 了解Nginx容器的内部结构是至关重要的一步。当你通过`docker exec -it b511b6049f57 bash`进入容器后,可以看到如下的目录结构: - **日志位置**:`varlognginx` - **配置文件位置**:`etcnginx` - **项目位置**:`usrsharenginxhtml` 为了在本地进行Nginx配置的修改,并让这些更改实时生效,我们需要将上述路径挂载到本地。首先,在本地创建对应的目录结构: ```bash mkdir -p hometestnginx{log,conf,html} ``` 接着需要创建主配置文件`nginx.conf`并确保它包含子配置文件的引用。例如: ```nginx user nginx; worker_processes 1; error_log varlognginxerror.log warn; pid varrunnginx.pid; events { worker_connections 1024; } http { include etcnginxmime.types; default_type applicationoctet-stream; log_format main $remote_addr $http_host [$time_local] $request $status $body_bytes_sent $bytes_sent $gzip_ratio $http_referer $http_user_agent $http_x_forwarded_for $upstream_addr $upstream_response_time $request_time $request_body $http_authorization ; access_log varlognginxaccess.log main; sendfile on; keepalive_timeout 65; include etcnginxconf.d*.conf; } ``` 在`conf`目录下,创建一个默认的配置文件如`default.conf`以定义Nginx的基本行为: ```nginx server { listen 80; server_name localhost; # 其他配置... } ``` 现在我们可以通过以下命令启动或重新启动容器,并将本地目录挂载到容器内: ```bash docker run -d --name my_nginx -v hometestnginxconf:etcnginxconf.d -v hometestnginxhtml:usrsharenginxhtml -v hometestnginxlog:varlognginx nginx:latest ``` 这里,`-v`参数用于指定本地目录到容器内目录的映射。这样任何在本地对配置文件和静态资源所做的更改都会立即反映到容器中,无需重新构建镜像。 总结来说,在Docker Nginx容器与本地文件系统之间建立挂载关系可以方便地管理和调试Nginx服务,并保持了容器化的灵活性和隔离性。这种方式尤其适用于开发和测试环境,使得开发者能够快速迭代和部署配置更改。
  • Docker目录与总结
    优质
    本文详细介绍了如何在Docker中使用卷和绑定挂载进行目录挂载的方法,并对相关知识点进行了总结。适合初学者参考学习。 当使用Docker启动容器并希望挂载宿主机的一个目录时,可以使用 `-v` 参数来指定。 例如,如果要启动一个 CentOS 容器,并将宿主机的 `test` 目录挂载到容器内的 `soft` 目录,则可以通过以下命令实现: ```bash docker run -it -v test:soft centos bin/bash ``` 这样在容器启动后,会在容器内自动创建 `soft` 目录。通过这种方式可以明确一点: `-v` 参数中冒号“:` 前面的目录是宿主机上的目录,后面的目录则是容器内的。 乍一看很简单,但实际上有一些需要注意的地方: 一、容器内部路径不能使用相对路径 ```bash [root@localhost ~]# docker run -it -v tes ``` 在上述示例中,如果尝试指定一个不存在或不正确的路径(如 `test` 而不是 `tes`),则命令会失败。因此,在实际操作时需要确保路径的正确性。
  • H2数据库Docker服务
    优质
    本文介绍了如何在Docker环境中部署和运行H2数据库,涵盖了从安装到配置的最佳实践及常见问题解决方法。 该映像在服务器模式下运行。 快速开始 要运行此图像: ``` docker container run --publish 9092:9082 --detach --name h2 nemerosah2 ``` 然后可以使用以下JDBC URL访问数据库: jdbc:h2:tcp://localhost/yourdb (假设您的Docker主机也是localhost) 数据量 包含H2数据库的usrlibh2也作为卷公开。 因此,您可以在主机上公开此卷: ``` --volume mypathonhost:/usr/lib/h2 ``` 或作为命名卷: ``` --volume h2:/usr/lib/h2 ``` 配置选项 JAVA_OPTIONS:启动H2 JVM时设置的选项,默认为空字符串 H2_OPTIONS:启动H2服务器时要传递的其他选项
  • Linux硬盘
    优质
    本文将详细介绍如何在Linux操作系统中安装和配置外部或内部硬盘驱动器,并提供实用步骤以确保正确挂载硬盘。 《AI+生物医药发展研究专题报告》深入探讨了人工智能技术与生物医疗产业的融合趋势,覆盖了包括AI医疗器械、AI医疗影像以及AI药物研发等多个领域,并对其市场规模、应用场景及融资情况进行了全面分析。 在“AI+医疗器械”部分中,本报告着重介绍了采用人工智能技术的新型医疗器械及其应用范围。这些设备不仅涵盖独立的人工智能软件和组件等产品类型,在辅助治疗与医学影像处理等领域也得到了广泛应用和发展,成为了未来医疗器材行业的一个重要发展方向之一。从全球市场角度来看,“AI+医疗器械”的市场规模逐年扩大:2016年为8,650万美元,至2021年底已增至5.06亿美元,并预计在接下来三年内增长到34.96亿美元;复合增长率高达42.4%和118.5%,显示出强劲的增长势头。而在中国市场方面,“AI+医疗器械”的起步相对较晚,但近年来发展迅速:从2019年的1.25亿人民币跃升至2021年的6.82亿元,并预计在未来的三年内达到约87.16亿元;复合增长率更是高达惊人的133.9%,显示出市场潜力巨大。 “AI医疗影像”部分则详细分析了人工智能技术在医学成像领域的广泛应用。据统计,我国每年进行的医学影像检查量已超过75亿人次,2021年市场规模达到约524亿元,并预计到今年年底将突破578亿元大关;庞大的数据需求与快速增长的数据规模之间形成了显著差距:目前影像资料的增长率达到了30%,而同期放射科医生的数量仅增长了4%左右。这表明在医疗成像领域,人工智能技术的应用前景广阔。 最后,“AI药物研发”部分介绍了利用人工智能进行新药开发的过程及其优势所在。通过采用先进的算法模型和大数据分析工具,可以显著提高药物研究的效率与成功率,并减少成本支出。“AI+生物医药”的融合已经成为推动整个行业创新发展的重要动力之一。 综上所述,《AI+生物医药发展研究报告》为读者提供了一个全面了解人工智能技术在生物医疗领域应用现状及未来发展趋势的机会。