- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解挂载运行的docker容器中如何挂载文件系统由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
感觉最近很多人都在问docker相关的问题,关于怎么操作一个已经启动的docker容器的文件系统,首先我发现这非常困难,因为 mnt的命名空间.
为了登录进入一个已经启动的docker容器,我们需要这么做:
好吧,开始实践.
启动一个名为charlie的docker实例
1
|
$ docker run --name charlie -ti ubuntu
bash
|
我想要将目录 /home/jpetazzo/Work/DOCKER/docker to /src 挂载到我的docker容器中.
nsenter 。
首先,需要nsenter,通过docker-enter帮助脚本来操作。因为想要挂载文件系统到docker容器中,处于安全原因,我们的docker容器是不允许这么做的。使用nsenter,我们就可以在docker容器中执行任意的命令,而不会受到任何安全限制的干扰,直接获取docker容器的root权限,如何获取docker容器的方法 就是这样 。
安装nsenter,通过docker-enter安装nsenter
1
|
$ docker run --
rm
-
v
/usr/local/bin
:
/target
jpetazzo
/nsenter
|
使用我们的docker文件系统 。
想要挂载宿主主机中的目录 (/home/jpetazzo/Work/DOCKER/docker) 在docker中.
要找到docker文件系统的目录.
首先使用readlink查看docker 目录的挂载位置.
1
2
|
$ readlink --canonicalize
/home/jpetazzo/Work/DOCKER/docker
/home/jpetazzo/go/src/github
.com
/docker/docker
|
设置环境变量
1
2
|
$ HOSTPATH=
/home/jpetazzo/Work/DOCKER/docker
$ REALPATH=$(readlink --canonicalize $HOSTPATH)
|
查看docker文件系统的挂载情况df
1
2
3
|
$
df
$REALPATH
Filesystem 1K-blocks Used Available Use% Mounted on
/sda2
245115308 156692700 86157700 65%
/home/jpetazzo
|
指定指定docker 文件系统的环境变量 。
1
|
$ FILESYS=$(
df
-P $REALPATH |
tail
-n 1 |
awk
'{print $6}'
)
|
查看docker容器中的设备情况 。
因为现在没有绑定挂载或者使用 BTRFS,所以我们要查看/proc/mounts 来找到这个目录的设备文件 /home/jpetazzo .
1
2
3
4
5
|
$
while
read
DEV MOUNT JUNK
>
do
[ $MOUNT = $FILESYS ] &&
break
>
done
<
/proc/mounts
$
echo
$DEV
/dev/sda2
|
通过设备信息找到挂载情况.
1
2
3
4
5
|
$
while
read
A B C SUBROOT MOUNT JUNK
>
do
[ $MOUNT = $FILESYS ] &&
break
>
done
<
/proc/self/mountinfo
$
echo
$SUBROOT
/jpetazzo
|
很好,我们现在知道需要挂载 /dev/sda2,到这个目录 /jpetazzo, 从这个位置 指向我们需要的任何目录.
设定目录 。
1
|
$ SUBPATH=$(
echo
$REALPATH |
sed
s,^$FILESYS,,)
|
查看设备号.
1
2
|
$ stat --
format
"%t %T"
$DEV
8 2
|
设置设备信息 。
1
|
$ DEVDEC=$(
printf
"%d %d"
$(stat --
format
"0x%t 0x%T"
$DEV))
|
将这些步骤集合 。
我们就是要验证docker容器中的路径和主机是不是一置 。
1
2
|
$ docker-enter charlie -- sh -c \
>
"[ -b $DEV ] || mknod --mode 0600 $DEV b $DEVDEC"
|
创建临时挂载点挂载文件系统 。
1
2
|
$ docker-enter charlie --
mkdir
/tmpmnt
$ docker-enter charlie --
mount
$DEV
/tmpmnt
|
确定文件系统存在挂载卷 。
1
2
|
$ docker-enter charlie --
mkdir
-p
/src
$ docker-enter charlie --
mount
-o bind
/tmpmnt/
$SUBROOT/$SUBPATH
/src
|
清理临时挂载 。
1
2
|
$ docker-enter charlie --
umount
/tmpmnt
$ docker-enter charlie --
rmdir
/tmpmnt
|
下面是一个简单实例脚本: 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
#!/bin/sh
set
-e
CONTAINER=charlie
HOSTPATH=
/home/jpetazzo/Work/DOCKER/docker
CONTPATH=
/src
REALPATH=$(readlink --canonicalize $HOSTPATH)
FILESYS=$(
df
-P $REALPATH |
tail
-n 1 |
awk
'{print $6}'
)
while
read
DEV MOUNT JUNK
do
[ $MOUNT = $FILESYS ] &&
break
done
<
/proc/mounts
[ $MOUNT = $FILESYS ]
# Sanity check!
while
read
A B C SUBROOT MOUNT JUNK
do
[ $MOUNT = $FILESYS ] &&
break
done
<
/proc/self/mountinfo
[ $MOUNT = $FILESYS ]
# Moar sanity check!
SUBPATH=$(
echo
$REALPATH |
sed
s,^$FILESYS,,)
DEVDEC=$(
printf
"%d %d"
$(stat --
format
"0x%t 0x%T"
$DEV))
docker-enter $CONTAINER -- sh -c \
"[ -b $DEV ] || mknod --mode 0600 $DEV b $DEVDEC"
docker-enter $CONTAINER --
mkdir
/tmpmnt
docker-enter $CONTAINER --
mount
$DEV
/tmpmnt
docker-enter $CONTAINER --
mkdir
-p $CONTPATH
docker-enter $CONTAINER --
mount
-o bind
/tmpmnt/
$SUBROOT/$SUBPATH $CONTPATH
docker-enter $CONTAINER --
umount
/tmpmnt
docker-enter $CONTAINER --
rmdir
/tmpmnt
|
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流.
原文链接:http://www.simapple.com/387.html 。
最后此篇关于详解挂载运行的docker容器中如何挂载文件系统的文章就讲到这里了,如果你想了解更多关于详解挂载运行的docker容器中如何挂载文件系统的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试创建1-click快捷方式,以便在上小学时玩一些90年代的旧游戏。 我正在尝试将ISO挂载到特定驱动器 运行程序 确保已卸载驱动器,以清除下一个要清除的游戏 我是脚本新手,所以我不确定从哪里
我正在运行 docker compose 命令以在 docker 中运行应用程序。但是,yml 中定义的卷是空的。如果我挂载一个文件,它就可以工作。但是,当我从 Windows 挂载目录时,我可以看到
我有一个双向滚动的无限滚动列表。该列表显示每行 5 个项目的网格,表示一周 7 天中的 5 个工作日。日子是按月剥离的斑马线(甚至月份的颜色略深)。我想将月份标题放在网格左侧的一列中,从该月的第一天或
我在按照 qemu/linaro 教程尝试执行 qemu, https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Vir
我正在尝试挂载 cephfs,密码没问题: mount -t ceph ceph-mon:6789:/docker/mnt/cephfs -o name=admin,secret=admin-pass
我可以将 HDFS 目录(在 Ubuntu 中配置)挂载到 Windows 服务器的驱动器吗? 映射后,例如 H:\--->\home\user1\HDFSCreatedDir ,想使用普通的 Jav
我有一个由 500 个 linux 机器组成的集群,现在需要使用带有绑定(bind)选项的挂载资源(参见 man 8 mount)来支持 chroot jail 。安装点需要在引导后强制执行和维护。我
我在一些代码片段和 Requests documentation 中看到过类似的事情。 : import requests sess = requests.Session() adapter = re
嗨,我正在编写一个安装cgroup的应用程序,如下所示 mount("cgroup", "/sys/fs/cgroup", "tmpfs",0,NULL); 我可以执行此操作,但是我想添加一个检查以了
我希望使用 Powershell 获取 VHD 安装的驱动器号。我可以使用以下 cmdlet 挂载 VHD: Mount-VHD -Path d:/tmp.vhdx 安装工作正常,但是当我尝试获取驱动
我正在编写一个脚本来创建坐骑。我使用的系统命令是: sudo /bin/mount -soft -t smbfs -o username='{username}',password='{passwor
我正在尝试在多个用户之间共享 NFS 安装。我无法让它工作,因为我总是被拒绝访问。我可以挂载共享,但看不到文件。 导出是通过Heartbeat+Pacemaker进行的。我认为这没有什么区别,但这是导
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 此问题似乎与 a specific programming problem, a sof
我最近全新安装了elementary OS,与Windows 8.1双启动。安装完成后,我编辑了eOS的fstab文件,使其自动在/mnt/Windows地址挂载一个ntfs分区。后来我关闭了笔记本电
我正在尝试在装有 Android 2.1 的模拟器上分析 Android 恶意软件。我想在执行可疑应用程序后分析文件权限和指纹。我知道,我可以使用 adb shell 来获取此信息,但我认为在执行例如
在使用 Webpack 和 Vue 编译项目后,当我打开一个使用 Vue 组件的页面时,我得到: [Vue warn]: Failed to mount component: template or
我正在使用 Linux Inotify 来检测程序上的 FS 事件。 当设备挂载到监控目录时如何通知我? 最佳答案 我不认为你可以用 inotify 来做到这一点。这是方法: 阅读uevents fr
有几篇文章对理解 Docker 的卷和数据管理非常有帮助。这两个尤其出色: http://container-solutions.com/understanding-volumes-docker/ h
我正在使用 mount -o bind /some/directory/here /foo/bar 我想用 bash 脚本检查 /foo/bar,看看它是否已经挂载?如果不是,则调用上面的 mount
我是一名优秀的程序员,十分优秀!