在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言 感觉最近很多人都在问docker相关的问题,关于怎么操作一个已经启动的docker容器的文件系统,首先我发现这非常困难,因为 mnt的命名空间。 为了登录进入一个已经启动的docker容器,我们需要这么做:
好吧,开始实践。 启动一个名为charlie的docker实例: $ docker run --name charlie -ti ubuntu bash 我想要将目录 /home/jpetazzo/Work/DOCKER/docker to /src 挂载到我的docker容器中。 nsenter 首先,需要nsenter,通过 安装nsenter,通过 $ docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter 使用我们的docker文件系统 想要挂载宿主主机中的目录 (/home/jpetazzo/Work/DOCKER/docker) 在docker中。 要找到docker文件系统的目录。 首先使用readlink查看docker 目录的挂载位置。 $ readlink --canonicalize /home/jpetazzo/Work/DOCKER/docker /home/jpetazzo/go/src/github.com/docker/docker 设置环境变量: $ HOSTPATH=/home/jpetazzo/Work/DOCKER/docker $ REALPATH=$(readlink --canonicalize $HOSTPATH) 查看docker文件系统的挂载情况df: $ df $REALPATH Filesystem 1K-blocks Used Available Use% Mounted on /sda2 245115308 156692700 86157700 65% /home/jpetazzo 指定指定docker 文件系统的环境变量 $ FILESYS=$(df -P $REALPATH | tail -n 1 | awk '{print $6}') 查看docker容器中的设备情况 因为现在没有绑定挂载或者使用 BTRFS,所以我们要查看/proc/mounts 来找到这个目录的设备文件 /home/jpetazzo 。 $ while read DEV MOUNT JUNK > do [ $MOUNT = $FILESYS ] && break > done </proc/mounts $ echo $DEV /dev/sda2 通过设备信息找到挂载情况。 $ while read A B C SUBROOT MOUNT JUNK > do [ $MOUNT = $FILESYS ] && break > done < /proc/self/mountinfo $ echo $SUBROOT /jpetazzo 很好,我们现在知道需要挂载 /dev/sda2,到这个目录 /jpetazzo, 从这个位置 指向我们需要的任何目录。 设定目录 $ SUBPATH=$(echo $REALPATH | sed s,^$FILESYS,,) 查看设备号。 $ stat --format "%t %T" $DEV 8 2 设置设备信息 $ DEVDEC=$(printf "%d %d" $(stat --format "0x%t 0x%T" $DEV)) 将这些步骤集合 我们就是要验证docker容器中的路径和主机是不是一置 $ docker-enter charlie -- sh -c \ > "[ -b $DEV ] || mknod --mode 0600 $DEV b $DEVDEC" 创建临时挂载点挂载文件系统 $ docker-enter charlie -- mkdir /tmpmnt $ docker-enter charlie -- mount $DEV /tmpmnt 确定文件系统存在挂载卷 $ docker-enter charlie -- mkdir -p /src $ docker-enter charlie -- mount -o bind /tmpmnt/$SUBROOT/$SUBPATH /src 清理临时挂载 $ docker-enter charlie -- umount /tmpmnt $ docker-enter charlie -- rmdir /tmpmnt 下面是一个简单实例脚本: #!/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 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。 |
请发表评论