返回

Docker 容器挂载 CIFS 共享:安全且独立的解决方案

Linux

在 Docker 容器中挂载 CIFS 共享:终极指南

问题

作为程序员,我在一个 Docker 容器中运行一个 Web 应用程序。该应用程序需要访问位于 Windows Server 中 CIFS 共享的图像文件。在开发机器上,我通过在主机上挂载 CIFS 共享,然后在容器中挂载主机文件夹来解决这个问题。

但是,在生产环境中,我希望容器不依赖于主机挂载。我尝试在容器内使用 mount 命令挂载 CIFS 共享,但遇到 mount error(13): Permission denied 错误。

Docker 容器中禁用 mount

研究表明,Docker 在容器内禁止使用 mount 命令。这是出于安全考虑,以防止数据泄露和特权提升。

替代解决方案:Docker 卷

为了在不挂载主机文件夹的情况下挂载 CIFS 共享,我们可以使用 Docker 卷。Docker 卷是用于在容器和主机之间共享数据的机制。

挂载 CIFS 共享的步骤

步骤 1:创建 Docker 卷

docker volume create <volume-name>

其中 <volume-name> 是卷的名称。

步骤 2:挂载 CIFS 共享

docker run -v <volume-name>:<mount-path> <image>

其中:

  • <volume-name> 是 Docker 卷的名称。
  • <mount-path> 是 CIFS 共享在容器中的挂载点。
  • <image> 是要运行的 Docker 镜像。

示例

docker volume create cifs-volume
docker run -v cifs-volume:/mnt/cifs nginx

此命令将创建名为 cifs-volume 的 Docker 卷,并将 CIFS 共享挂载到 /mnt/cifs 目录。

注意事项

  • 确保你有挂载 CIFS 共享所需的凭据。
  • CIFS 共享需要具有适当的权限,以便在容器中进行写入操作。
  • 还可以使用 cifs-utils 包挂载 CIFS 共享,但可能需要在容器中安装此包。

结论

通过使用 Docker 卷,我们可以安全且轻松地在 Docker 容器中挂载 CIFS 共享,即使容器不依赖于主机挂载。

常见问题解答

1. 为什么 Docker 禁止在容器中使用 mount

为了增强安全性,防止数据泄露和特权提升。

2. Docker 卷与主机挂载有什么区别?

Docker 卷在容器和主机之间共享数据,而主机挂载将主机文件系统挂载到容器中。

3. 如何在 Docker 卷中传递 CIFS 凭据?

使用 -e 标志传递环境变量,例如 -e SMB_USERNAME=user-e SMB_PASSWORD=password

4. 如何在 CIFS 共享中启用写入权限?

确保 CIFS 共享具有适当的权限,并以 root 用户或具有适当权限的用户运行容器。

5. 如何使用 cifs-utils 挂载 CIFS 共享?

使用 mount -t cifs 命令,并提供必要的参数,例如 server=HOSTNAMEshare=SHARE_NAMEusername=USER