场景描述:

操作系统: ubuntu16.04, docker版本: Docker version 19.03.1

系统运行一段时间后,该服务器上有一个运行中docker容器,需要在容器里边挂载本地服务器目录,从而实现某个文件在宿主机和容器内部都可以访问的效果。

一般情况下,容器在启动的时候,我们通过挂载指定相应的目录就可以;例:

docker run -p : -it --name test -v /home/test/bak_data:/mnt/bak_data mysql:5.7 /bin/bash

但是,正在运行中的容器,如何动态挂载目录呢?

别着急,有办法!

处理方式:

参考这篇:https://github.com/pushiqiang/utils/tree/master/docker

1. 首先在宿主机本地创建你需要挂载的路径,这里以/home/test/bak_data为例:

mkdir -p /home/test/bak_data

2. 创建脚本文件,并写入内容:

touch dynamic_mount_docker_volume

vi dynamic_mount_docker_volume
#!/bin/bash
#This script is dynamic mount docker volumens
#Author Deng Lei
if [ -z $ ] || [ -z $ ] || [ -z $ ]; then
echo "Usage: container_name physics_volumes container_volumes"
echo "Example: I want mount physics /tmp/test to container /src in test"
echo "The command is: bash `basename $0` test_container_id /tmp/test /src "
exit
fi
which nsenter &>>/dev/null
if [ $? -ne ];then
echo "plsease install nsenser,command is:yum install util-linux"
exit
fi
set -e
CONTAINER=$
HOSTPATH=$
CONTPATH=$
if [ ! -d $HOSTPATH ];then
echo "physics $HOSTPATH is not exist!"
exit
fi
REALPATH=$(readlink --canonicalize $HOSTPATH)
FILESYS=$(df -P $REALPATH | tail -n | awk '{print $6}')
while read DEV MOUNT JUNK
do
[ $MOUNT = $FILESYS ] && [ $DEV != "rootfs" ] && 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))
PID=$(docker inspect --format "{{.State.Pid}}" "$CONTAINER")
run_command="nsenter --target $PID --mount --uts --ipc --net --pid -- sh -c"
if [ `$run_command "mount|grep $CONTPATH|wc -l"` -ne ];then
echo "container $CONTAINER mount dir $CONTPATH is mounting!"
exit
fi
$run_command "[ -b $DEV ] ||mknod --mode 0600 $DEV b $DEVDEC"
$run_command "mkdir /tmpmnt"
$run_command "mount $DEV /tmpmnt"
$run_command "mkdir -p $CONTPATH"
$run_command "mount -o bind /tmpmnt/$SUBROOT/$SUBPATH $CONTPATH"
$run_command "umount /tmpmnt"
$run_command "rmdir /tmpmnt"
check_result=`$run_command "mount|grep $CONTPATH|wc -l"`
if [ $check_result -ne ];then
echo "dymainc mount physics $HOSTPATH on $CONTAINER $CONTPATH is success!"
else
echo "dymaninc mount physics $HOSTPATH on $CONTAINER $CONTPATH is fail!"
fi

给该脚本赋执行权限:

chmod +x dynamic_mount_docker_volume

3. 重点来了,运行神器:---注意:本地没有该镜像,系统如果可以访问互联网,会自动从远程下载!

如果不能下载,参考:https://github.com/jpetazzo/nsenter

说明:nsenter是一个允许根据容器名称进入容器的小工具

docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter

4. 上述nsenter启动完成后,运行dynamic_mount_docker_volume脚本,执行动态挂载操作

./dynamic_mount_docker_volume 955138b6c3ed /home/test/bak_data /mnt/bak_data

说明:955138b6c3ed 是你的容器ID
/home/test/bak_data 是你的宿主机服务器路径
/mnt/bak_data 是你目标容器内的路径--这个不不要提前创建,脚本会自动创建

5. 验证结果

在宿主机目录下/home/test/bak_data 创建一个文件123.test,然后进入到目标容器的/mnt/bak_data目录下,看能否看到该文件。

OK,搞定!

运维笔记--给正在运行的Docker容器动态绑定卷组(挂载指定目录)的更多相关文章

  1. Linux系统运维笔记(五),CentOS 6.4安装java程序

    Linux系统运维笔记(五),CentOS 6.4安装java程序 用eclipse编译通的java程序,现需要实施到服务器.实施步骤: 一,导出程序成jar包. 1,在主类编辑界面点右健,选  ru ...

  2. Linux系统运维笔记(四),CentOS 6.4安装 MongoDB

    Linux系统运维笔记(四),CentOS 6.4安装 MongoDB 1,下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6 ...

  3. Linux系统运维笔记(四),CentOS 6.4安装Nginx

    Linux系统运维笔记(四),CentOS 6.4安装Nginx 1,安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtool op ...

  4. Linux系统运维笔记(三),设置IP和DNS

    Linux系统运维笔记(三),设置IP和DNS 手工配置静态的IP地址 也就是手工配置IP地址.子网掩码.网关和DNS. vi /etc/sysconfig/network-scripts/ifcfg ...

  5. Linux系统运维笔记(二),Linux文件编辑命令

    Linux系统运维笔记 Linux文件编辑命令 首先我们使用命令 vi filename 打开一个文件,这个时候进入到的是命令模式 接下来我们按i,然后键盘随便输入写内容. 然后按ESC重新进入到命令 ...

  6. Linux系统运维笔记(一),查看系统版本和设置系统时间

    Linux系统运维笔记 查看系统版本和设置系统时间 查看系统版本 lsb_release -a (适用于所有的linux,包括Redhat.SuSE.Debian等发行版,但是在debian下要安装l ...

  7. Linux系统运维笔记(6),CentOS 7.6双网卡路由配置

    Linux系统运维笔记(6),CentOS 7.6双网卡路由配置. 一,先确认系统版本: [root@localhost ~]# cat /etc/redhat-releaseCentOS Linux ...

  8. 运维笔记--postgresql占用CPU问题定位

    运维笔记--postgresql占用CPU问题定位 场景描述: 业务系统访问变慢,登陆服务器查看系统负载并不高,然后查看占用CPU较高的进程,发现是连接数据库的几个进程占用系统资源较多. 处理方式: ...

  9. 重磅分享:美团点评架构师私藏的内部Linux运维笔记

    最近不少小伙伴后台联系,希望能弄一些大厂的学习资料,我这边费了很大劲,联系到老朋友,原美团点评架构师张sir,问他要了些美团点评架构的内部资料. 这份资料含金量非常高,包含整个美团点评架构架构图,Li ...

随机推荐

  1. php根据二维数组中的某一元素相等,另一个元素相加

    二维数组:$taskData Array ( [0] => Array ( [area] => 1 [winsFlag] => 7 [count] => 3 ) [1] =&g ...

  2. 【Swagger2】解决swagger文档地址请求404的问题

    一.出现的问题背景 某个项目,本地启动后,访问swagger文档地址可以访问到, http://localhost:8203/doc.html.但是部署到开发环境就访问不到,报404资源找不到的问题 ...

  3. python导入模块被加横线

    2018-07-03 04:20:41 bluelilyfly 阅读数 1238   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  4. 配置nginx的systemctl命令

    启动nginx的命令为     /usr/local/nginx/sbin/nginx  停止nginx的命令为    /usr/local/nginx/sbin/nginx -s stop 重启ng ...

  5. Dump文件的生成和使用

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lk142500/article/detai ...

  6. C#程序保存dump文件

    作用 程序异常崩溃前使用此类为进程创建DUMP文件,之后可以使用WinDbg等工具进行分析. 辅助类代码 using System; using System.Diagnostics; using S ...

  7. 201671010425邱世妍 团队评审&课程总结

    实验十四 团队项目评审&课程学习总结 项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cn ...

  8. Subband Decomposition

    子带分解. 例如语音信号是宽带信号,根据奈奎斯特采样定理,采样率为16kHz的语音信号的有效带宽是8KHz,不论是对于降噪,aec,vad,波束形成亦或是logfbank特征提取,我们都期望更精细的处 ...

  9. MongoDB 大数据技术之mongodb中在嵌套子文档的文档上面建立索引

    一.给collection objectid赋自定义的值 MongoDB Enterprise > db.testid.insert({_id:{imsi:"4567890123&qu ...

  10. 利用python画小猪佩奇

    import turtle as t t.pensize(4) t.hideturtle() t.colormode(255) t.color((255,155,192),"pink&quo ...