场景描述:

操作系统: 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. Django之DRF源码分析(二)---数据校验部分

    Django之DRF源码分析(二)---数据校验部分 is_valid() 源码 def is_valid(self, raise_exception=False): assert not hasat ...

  2. mysql 触发器、流程控制、事务等

    视图 触发器 事务 存储过程 内置函数 流程控制 索引 视图 1.什么是视图 ​ 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 ​ 如果要频繁使用一张虚拟表,可以 ...

  3. JVM的底层实现原理

    JVM是Java程序运行的环境,但是他同时也是一个操作系统的一个应用程序的一个进程,因此JVM也有他自己的运行生命周期,也有自己的代码和数据空间. JDK JDK在Java的整个体系中充当一个生产加工 ...

  4. Clion中配置使用更大的栈(防止开大一点的数组异常)

    cmake_minimum_required(VERSION 3.15) project(TestProject) ) set(CMAKE_CXX FLAGS -fexec-charset=GBK) ...

  5. React源码 React.Component

    React中最重要的就是组件,写的更多的组件都是继承至 React.Component .大部分同学可能都会认为 Component 这个base class 给我们提供了各种各样的功能.他帮助我们去 ...

  6. c#每天生成漂亮桌面背景、英文名言、翻译

    阅读目录 一.1. 下载bing.com壁纸查询API 二.2. 解析返回的壁纸JSON信息 三.3. 下载完成的壁纸图片 阅读目录 .NET生成漂亮桌面背景 .NET生成漂亮桌面背景 总结 回到目录 ...

  7. 编程语言和python介绍, 变量,小整数池,垃圾回收机制

    1.编程语言的发展史 计算机是基于电工作(基于高.低电平)1010010101011 1.机器语言 优点:执行速度够快 缺点:开发效率非常低 2.汇编语言(通过英文字符组成) 优点:执行效率相较于机器 ...

  8. Flutter在iOS上的表现就是一坨屎

    Flutter在iOS上的表现就是一坨屎: 用户体验差到了极点: 目前来说不值得投入大量精力去研究: 了解一下原理可以.

  9. ES6学习笔记--default,rest

    default 意思是默认值.大家可以看下面的例子,调用animal()方法时忘记了传参数,传统的做法就是加上这一句type= type || 'cat' 来指定默认值. function anima ...

  10. Longest Common Substring SPOJ - LCS (后缀自动机)

    Longest Common Substring \[ Time Limit: 294ms \quad Memory Limit: 1572864 kB \] 题意 给出两个串,求两个串的最长公共连续 ...