【翻译于《Mount Filesystems Within a Docker Container》】

1. 概述

Docker 容器是一个可移植的、轻量级的、阻隔的环境,用于运转应用程序及其依靠项。在 Docker 容器中挂载文件体系允许从容器拜访主机体系上的文件或目录。这样做关于在容器和主机之间同享数据或装备非常有用。

在本教程中,咱们将学习如安在 Docker 容器中挂载文件体系。

2. 主机源目录

首要,要在 Docker 容器中挂载文件体系,必须在体系上装置 Docker。此外,让咱们确定主机体系上的源目录,即咱们希望在挂载过程中运用的体系上的途径。

为了阐明这一点,让咱们运用 mkdir 在主机上创立一个新目录:

$ mkdir /home/user1/hostpath

接下来,让咱们查看新目录是否存在,并运用 ls 指令验证其属性:

$ ls -ld /home/user1/hostpath/
drwxrwxr-x 2 user1 user1 4096 Jul 17 04:43 /home/user1/hostpath/

在这里,-l 选项启用了目录的长列表,而 -d 标志保证咱们显示有关目录文件体系方针的信息,而不是其内容。

准备好源目录后,现在让咱们运转容器。

3. 运用卷

为了在 Docker 容器中挂载文件体系,咱们在运转容器时运用 -v–volume 标志。它的参数由两个字段组成,用冒号 (:) 分隔:

主机源目录途径
容器方针目录途径
简而言之,咱们在运用 docker 时将主机上的目录链接到容器内的目录:

$ docker run -it --rm -v /path/on/host:/path/in/container image_name /bin/bash

让咱们分解一下这个指令:

-i -t(或 -it)支持对容器的交互式拜访
–rm 在退出时删去容器以释放体系资源(CPU、内存))
/path/on/host 是咱们要挂载的主机上目录的途径
/path/in/container 是容器中可拜访目录的所需途径
image_name 是咱们要运转的 Docker 映像的名称或 ID
/bin/bash 在容器中供给了一个 Bash shell。
重要的是,假如咱们不运用 –rm 选项,咱们或许需求在退出后手动删去容器以释放存储空间。

4. 运转 Docker 容器

为了阐明这一点,现在让咱们将上面看到的通用语法中的 /path/on/host/path/in/container 替换为方案的相应源途径和方针途径:

$ docker run -it --rm -v /home/user1/hostpath:/home/cont_path ubuntu /bin/bash
root@e8439d98c634:/# 

此指令履行多项操作:

运用 ubuntu 镜像的副本发动一个 Docker 容器
在容器中创立 /home/cont_path 目录
将 /home/cont_path 方针目录映射到咱们之前创立的 /home/user1/hostpath 源目录
容器发动并运转后,咱们能够经过导航到容器中的方针目录来查看文件体系是否正确挂载:

root@baeldung:/# cd /home/cont_path
root@baeldung:/home/cont_path# 

值得注意的是,运用 /home/user1/hostpath 目录,咱们现在能够拜访容器的 /home/cont_path 目录下任何新生成或修正的数据。Docker 还会仿制两条途径之间的任何更改。因而,咱们在 /home/cont_path 目录中所做的任何更改都会影响主机和容器体系。为了理解,让咱们创立子目录结构 /home/cont_path/dir1/dir2:

# mkdir -p dir1/dir2

退出容器后,让咱们查看主机上的目录,看看是否存在增加的内容:

$ ls /home/user1/hostpath/
dir1
$ ls ~/hostpath/dir1
dir2

值得注意的是,当主机目录和容器目录具有相同的内容时,将验证挂载操作是否成功。

5. 运用进步的权限

在 Docker 中,咱们能够运用 –privileged–cap 标志在容器中挂载文件体系。

假设咱们要设置一个依靠于从主机挂载 CIFS 同享的环境。假如咱们尝试直接这样做,容器或许会遇到默许权限不允许挂载的问题。可是,–privileged–cap 能够为容器供给进步的权限。因而,它能够拜访主机级资源,包括挂载文件体系。

为了演示,让咱们探讨怎么运用 –privileged–cap 选项在 Docker 容器中挂载文件体系。

5.1. 运用 –privileged 运转容器

同样,要颁发容器进步的权限,咱们将运用 –privileged 开关运转它:

$ docker run --privileged -it -v /home/user1/hostpath:/home/cont_path ubuntu /bin/bash
root@53d79f0bb259:/#

为了验证,咱们能够运用带有 –format 选项的 docker inspect 指令。此 docker 指令供给有关正在运转的容器的其他数据。重要的是,它能够显示容器是否在特权形式下运转。

因而,让咱们运用 –format 标志和容器 ID 作为参数来查看咱们的容器是否以进步的权限运转:

$ docker inspect --format='{{.HostConfig.Privileged}}' 22a2439bb82f
true

事实上,true 意味着咱们处于特权形式。可是,关于不运用该形式的容器,该指令将打印 false。

5.2. 颁发特定权限

为了加强咱们对容器功用的操控,咱们能够运用 –cap 标志。此选项与 -drop 或 -add 后缀一同运用,以更改 Linux 中容器的默许功用。

值得注意的是,具有较高权限的容器在容器内挂载的文件体系上具有一些默许功用:

  • READ
  • WRITE
  • MKNOD

为了阐明怎么运用这两个标志,让咱们将容器设置为运用除 MKNOD 之外的所有功用:

$ docker run --cap-add=ALL --cap-drop=MKNOD -it -v /home/user1/hostpath:/home/cont_path ubuntu /bin/bash

让咱们分解指令中的新标志:

–cap-add=ALL 将所有功用增加到容器中
–cap-drop=MKNOD 删去 MKNOD 功用,从而阻止容器运用 mknod 创立特殊文件
此外,为了让容器履行一些体系管理任务,咱们能够赋予它 SYS_ADMIN 功用。为此,咱们能够运用 –cap-add=SYS_ADMIN

$ docker run --cap-add=SYS_ADMIN -it -v /home/user1/hostpath:/home/cont_path ubuntu /bin/bash

值得注意的是,SYS_ADMIN 参数为容器供给管理权限(如装载权限)。

6. 挂载多个目录

当然,咱们能够经过在 docker run 指令中指定多个 -v 标志来挂载多个目录。每个 -v 开关代表一个独自的挂载:

$ docker run -v ~/hostpath/path_A:/home/path_1 -v ~/hostpath/path_B:/home/path_2 image_name

此指令挂载两个目录:

~/hostpath/path_A 到容器中的 /home/path_1
~/hostpath/path_B 到容器中的 /home/path_2
值得注意的是,咱们能够经过增加更多的 -v 选项来根据需求挂载任意数量的目录。

为了成功挂载,主机的文件体系必须在容器内可拜访。此外,为了保证准确的读写拜访,咱们能够评价挂载目录的权限和所有权。当咱们遇到权限问题时,咱们或许需求更改权限或运用其他设置选项。

通常,咱们能够毫不费力地在主机和容器之间交流数据和资源。经过在 Docker 容器中挂载文件体系,能够成功进行这种数据交流。此外,它还能够进步灵活性并改善任何容器化应用程序的全体功用。

7. 定论

在本文中,咱们了解了如安在 Docker 容器上挂载主机文件体系。首要,咱们学习了怎么设置主机。然后,咱们运用 -v 选项将文件体系挂载到 Docker 容器上。此外,咱们以进步的权限将主机文件体系挂载到 Docker 容器上,允许它拜访主机级资源。最终,咱们测试了文件体系以承认它工作正常。