docker高级应用之动态绑定卷组

简介:

之前介绍过docker高级应用之动态扩展容器空间大小(地址:http://dl528888.blog.51cto.com/2382721/1606170),本次介绍如何动态的绑定卷组。

为什么使用卷组呢,比如想把物理机里的目录给予容器共享,或者把物理机的一个目录作为共享目录,做日志搜集等等功能。

默认docker添加卷组是在启动容器的使用使用-v参数

1
- v , --volume=[]            Bind  mount  a volume (e.g., from the host: - v  /host : /container , from docker: - v  /container )

举例

物理机目录/data/software想挂载到容器的/tmp/software里

其中/data/software内容是

1
2
3
4
5
6
15:21:14  # ll /data/software/
total 19692
-rw-r--r--  1 root root     1940 Nov 10 20:42 CentOS-Base-6.repo
-rwxr-xr-x  1 root root 12752168 Nov 10 14:15 etcd
-rwxr-xr-x  1 root root  7400424 Nov 10 14:15 etcdctl
drwxr-xr-x 21 1000 1000     4096 Oct 29 02:06 systemd-217

启动docker的命令是

1
docker run -d -p 22  --name= "test"  - v  /data/software : /tmp/software   docker.ops-chukong.com:5000 /centos6-http :new  /usr/bin/supervisord

下面是做绑定测试

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
31
32
33
34
35
36
37
38
39
root@docker-test2: /tmp
15:29:23  # docker run -d -p 22  --name="test" -v /data/software:/tmp/software  docker.ops-chukong.com:5000/centos6-http:new /usr/bin/supervisord
a21506d7b36e04e091008f4a326ac17c94e3d855e3aadb52992d7ba95f45cbbf
root@docker-test2: /tmp
15:31:15  # docker-enter test sh -c "ls -l /tmp/software"
total 19692
-rw-r--r--  1 root root     1940 Nov 10 20:42 CentOS-Base-6.repo
-rwxr-xr-x  1 root root 12752168 Nov 10 14:15 etcd
-rwxr-xr-x  1 root root  7400424 Nov 10 14:15 etcdctl
drwxr-xr-x 21 1000 1000     4096 Oct 29 02:06 systemd-217
root@docker-test2: /tmp
15:31:21  # docker-enter test sh -c "mount"
rootfs on /  type  rootfs (rw)
/dev/mapper/docker-8 :17-37748738-a21506d7b36e04e091008f4a326ac17c94e3d855e3aadb52992d7ba95f45cbbf on /  type  ext4 (rw,relatime,discard,stripe=16,data=ordered)
proc on  /proc  type  proc (rw,nosuid,nodev,noexec,relatime)
sysfs on  /sys  type  sysfs (rw,nosuid,nodev,noexec,relatime)
shm on  /dev/shm  type  tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
/dev/sdb1  on /.dockerinit  type  ext4 (rw,relatime,data=ordered)
/dev/sda3  on  /etc/resolv .conf  type  ext4 (rw,relatime,data=ordered)
/dev/sdb1  on  /etc/hostname  type  ext4 (rw,relatime,data=ordered)
/dev/sdb1  on  /etc/hosts  type  ext4 (rw,relatime,data=ordered)
/dev/sda3  on  /tmp/software  type  ext4 (rw,relatime,data=ordered)
/dev/sdb1  on /.dockerenv  type  ext4 (rw,relatime,data=ordered)
devpts on  /dev/tty1  type  devpts (rw,relatime,gid=5,mode=620,ptmxmode=000)
devpts on  /dev/pts  type  devpts (rw,relatime,gid=5,mode=620,ptmxmode=666)
devpts on  /dev/ptmx  type  devpts (rw,relatime,gid=5,mode=620,ptmxmode=666)
root@docker-test2: /tmp
15:31:28  # docker-enter test sh -c "df -h"
Filesystem            Size  Used Avail Use% Mounted on
rootfs                9.8G  470M  8.8G   5% /
/dev/mapper/docker-8 :17-37748738-a21506d7b36e04e091008f4a326ac17c94e3d855e3aadb52992d7ba95f45cbbf
                       9.8G  470M  8.8G   5% /
shm                    64M     0   64M   0%  /dev/shm
/dev/sdb1              1.8T   22G  1.7T   2% /.dockerinit
/dev/sda3              518G  457G   35G  93%  /etc/resolv .conf
/dev/sdb1              1.8T   22G  1.7T   2%  /etc/hostname
/dev/sdb1              1.8T   22G  1.7T   2%  /etc/hosts
/dev/sda3              518G  457G   35G  93%  /tmp/software
/dev/sdb1              1.8T   22G  1.7T   2% /.dockerenv

可以看到挂载完成,并且容器里的/tmp/software与/data/software里内容一致

但上面只是在创建并启动容器的时候可以挂载卷组,如果允许中的如何挂载呢?

具体知识可以参考http://jpetazzo.github.io/2015/01/13/docker-mount-dynamic-volumes/

下面是修改的脚本

内容为

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/bin/bash
#This script is dynamic mount docker volumens
#Author Deng Lei
if  [ -z $1 ] || [ -z $2 ] || [ -z $3 ];  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 /tmp/test /src "
     exit  1
fi
which  nsenter &>> /dev/null
if  [ $? - ne  0 ]; then
     echo  "plsease install nsenser,command is:yum install util-linux"
     exit  1
fi
set  -e
CONTAINER=$1
HOSTPATH=$2
CONTPATH=$3
if  [ ! -d $HOSTPATH ]; then
     echo  "physics $HOSTPATH is not exist!"
     exit  1
fi
REALPATH=$(readlink --canonicalize $HOSTPATH)
FILESYS=$( df  -P $REALPATH |  tail  -n 1 |  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  0 ]; then
     echo  "container $CONTAINER mount dir $CONTPATH is mounting!"
     exit  1
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  0 ]; then
     echo  "dymainc mount physics $HOSTPATH on $CONTAINER $CONTPATH is success!"
else
     echo  "dymaninc mount physics $HOSTPATH on $CONTAINER $CONTPATH is fail!"
fi

然后在给已经存在的test容器里新挂载一个卷组,把本地的/data/docker-dir挂载到/tmp/docker-dir

当前物理机/data/docker-dir里内容是

1
2
3
4
5
root@docker-test2: /tmp
15:37:17  # ll /data/docker-dir/
total 4
-rw-r--r-- 1 root root 0 Feb 11 09:31 a
-rw-r--r-- 1 root root 2 Feb 11 09:31 b

挂载的方法是

1
2
3
4
15:38:28  # sh dynamic_mount_docker_volume.sh
Usage: container_name physics_volumes container_volumes
Example: I want  mount  physics  /tmp/test  to container  /src  in  test
The  command  is:  bash  dynamic_mount_docker_volume.sh  test  /tmp/test  /src

第一个参数是容器名,第二个参数的物理机的目录,第三个参数是挂载到容器里的目录

进行挂载

1
2
3
root@docker-test2: /tmp
15:36:14  # sh dynamic_mount_docker_volume.sh test /data/docker-dir/ /tmp/docker-dir
dymainc  mount  physics  /data/docker-dir/  on  test  /tmp/docker-dir  is success!

可以看到成功的挂载了

下面做一下测试

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
31
32
33
34
35
15:37:28  # docker-enter test sh -c "ls -l /tmp/docker-dir"
total 4
-rw-r--r-- 1 root root 0 Feb 11 09:31 a
-rw-r--r-- 1 root root 2 Feb 11 09:31 b
root@docker-test2: /tmp
15:38:18  # docker-enter test sh -c "mount"
rootfs on /  type  rootfs (rw)
/dev/mapper/docker-8 :17-37748738-a21506d7b36e04e091008f4a326ac17c94e3d855e3aadb52992d7ba95f45cbbf on /  type  ext4 (rw,relatime,discard,stripe=16,data=ordered)
proc on  /proc  type  proc (rw,nosuid,nodev,noexec,relatime)
sysfs on  /sys  type  sysfs (rw,nosuid,nodev,noexec,relatime)
shm on  /dev/shm  type  tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
/dev/sdb1  on /.dockerinit  type  ext4 (rw,relatime,data=ordered)
/dev/sda3  on  /etc/resolv .conf  type  ext4 (rw,relatime,data=ordered)
/dev/sdb1  on  /etc/hostname  type  ext4 (rw,relatime,data=ordered)
/dev/sdb1  on  /etc/hosts  type  ext4 (rw,relatime,data=ordered)
/dev/sda3  on  /tmp/software  type  ext4 (rw,relatime,data=ordered)
/dev/sdb1  on /.dockerenv  type  ext4 (rw,relatime,data=ordered)
devpts on  /dev/tty1  type  devpts (rw,relatime,gid=5,mode=620,ptmxmode=000)
devpts on  /dev/pts  type  devpts (rw,relatime,gid=5,mode=620,ptmxmode=666)
devpts on  /dev/ptmx  type  devpts (rw,relatime,gid=5,mode=620,ptmxmode=666)
/dev/sda3  on  /tmp/docker-dir  type  ext4 (rw,relatime,data=ordered)
root@docker-test2: /tmp
15:38:24  # docker-enter test sh -c "df -h"
Filesystem            Size  Used Avail Use% Mounted on
rootfs                9.8G  470M  8.8G   5% /
/dev/mapper/docker-8 :17-37748738-a21506d7b36e04e091008f4a326ac17c94e3d855e3aadb52992d7ba95f45cbbf
                       9.8G  470M  8.8G   5% /
shm                    64M     0   64M   0%  /dev/shm
/dev/sdb1              1.8T   22G  1.7T   2% /.dockerinit
/dev/sda3              518G  457G   35G  93%  /etc/resolv .conf
/dev/sdb1              1.8T   22G  1.7T   2%  /etc/hostname
/dev/sdb1              1.8T   22G  1.7T   2%  /etc/hosts
/dev/sda3              518G  457G   35G  93%  /tmp/software
/dev/sdb1              1.8T   22G  1.7T   2% /.dockerenv
/dev/sda3              518G  457G   35G  93%  /tmp/docker-dir

可以看到已经动态的挂在上了,并且挂在后目录里的内容一致

如果挂载的时候,第一个参数,容器不存在会报以下错误

1
2
16:23:27  # sh dynamic_mount_docker_volume.sh  test123 /data/docker-dir/ /src
Error: No such image or container: test123

如果挂载的时候,第二个参数,物理机的被挂载的目录不存在,会报错

1
2
3
root@docker-test2: /tmp
15:39:18  # sh dynamic_mount_docker_volume.sh  test /tmp/sfsdfdf1 /src
physics  /tmp/sfsdfdf1  is not exist!

如果挂载的时候,第三个参数,容器的挂载的目录已经被挂载了,会报错

1
2
15:44:25  # sh dynamic_mount_docker_volume.sh  test /data/software/ /src
container  test  mount  dir  /src  is mounting!

上面就是介绍如何动态的绑定卷组,只是一种方法,不太建议使用,有问题请留言。



 本文转自 reinxu 51CTO博客,原文链接:http://blog.51cto.com/dl528888/1613764,如需转载请自行联系原作者


相关文章
|
9天前
|
关系型数据库 MySQL Shell
4.Docker 应用部署
4.Docker 应用部署
|
1天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
1天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
1天前
|
机器学习/深度学习 人工智能 异构计算
【Docker 专栏】Docker 与 GPU 加速应用的结合
【5月更文挑战第9天】GPU加速技术在处理大规模数据和复杂计算时展现强大性能,尤其在AI和深度学习领域。Docker作为轻量级容器化工具,提供隔离、可移植和高效的环境。结合GPU加速,关键在于容器访问GPU设备和安装相应驱动。NVIDIA提供了支持工具,允许Docker利用GPU。应用场景包括人工智能、科学计算和视频处理。优势包括资源利用率提升和部署灵活性,但面临驱动兼容性、资源管理和监控调试的挑战。未来,随着技术发展,Docker与GPU加速在边缘计算中的应用将有广阔前景。
【Docker 专栏】Docker 与 GPU 加速应用的结合
|
2天前
|
存储 Prometheus 监控
【Docker 专栏】Docker 容器内应用的调试与故障排除
【5月更文挑战第8天】本文探讨了Docker容器内应用的调试与故障排除,强调其重要性。方法包括:通过日志排查、进入容器检查、使用监控工具及检查容器配置。常见问题涉及应用启动失败、性能问题、网络连接和数据存储。案例分析展示了实战场景,注意事项提醒避免不必要的容器修改、备份数据和理解应用架构。掌握这些技能能确保Docker应用的稳定运行和性能优化。
【Docker 专栏】Docker 容器内应用的调试与故障排除
|
2天前
|
开发框架 安全 网络安全
【Docker 专栏】Docker 多平台应用构建与部署
【5月更文挑战第8天】Docker作为一种关键的容器化技术,简化了多平台应用的构建与部署。它提供一致的运行环境,确保应用在不同平台无缝运行;通过分层构建机制加速镜像创建,提升开发效率。Docker的可移植性、高效部署及资源利用率是其主要优势。流程包括开发环境准备、构建镜像、测试验证及部署。然而,面临操作系统差异、网络安全和资源限制等挑战,需注意安全、版本管理和性能优化。Docker在多平台场景的应用将持续发挥价值。
【Docker 专栏】Docker 多平台应用构建与部署
|
2天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
2天前
|
前端开发 API 数据库
【Docker专栏】Docker Compose实战:编排多容器应用
【5月更文挑战第7天】Docker Compose是Docker的多容器管理工具,通过YAML文件简化多容器应用部署。它能一键启动、停止服务,保证开发、测试和生产环境的一致性。安装后,创建`docker-compose.yml`文件定义服务,如示例中的web和db服务。使用`docker-compose up -d`启动服务,通过`docker-compose ps`、`stop`、`down`和`logs`命令管理服务。
【Docker专栏】Docker Compose实战:编排多容器应用
|
2天前
|
监控 安全 数据库
【Docker专栏】Docker容器化应用的最佳实践
【5月更文挑战第7天】本文介绍了 Docker 容器化应用的关键最佳实践,包括使用官方基础镜像、保持镜像精简、以非 root 用户运行容器、安全扫描、编写高效 Dockerfile、环境隔离、使用数据卷、选择合适网络模式、设置资源限制、使用版本标签、容器编排以及文档和自动化部署。遵循这些实践可提升效率和安全性,同时要注意随着技术发展不断更新知识。
【Docker专栏】Docker容器化应用的最佳实践
|
11天前
|
存储 运维 Linux
Docker详解(六)——Docker高级控制命令
Docker详解(六)——Docker高级控制命令
18 2