Docker容器共享磁盘

磁盘,Docker容器 · 浏览次数 : 369

小编点评

**使用Docker容器间共享磁盘的方法:** **1. 使用命名卷** * 创建一个名为 `shared-data` 的命名卷。 * 在容器A和B中分别创建两个数据卷,将它们映射到同一个目录中。 * 在 `docker-compose.yml` 文件中定义一个 `shared-data` 卷。 ```yaml services: containerA: image: myimageA volumes: - shared-data:/path/to/shared/directory containerB: image: myimageB volumes: - shared-data:/path/to/shared/directory ``` **2. 使用匿名卷** * 创建一个容器,将其映射到与容器A相同的目录。 * 在 `docker-compose.yml` 文件中定义一个 `shared-data` 卷。 ```yaml services: containerA: image: myimageA volumes: - shared-data:/path/to/shared/directory ``` **3. 使用直接挂载宿主机目录** * 在 `docker-compose.yml` 文件中定义一个 `shared-data` 卷。 * 使用 `/path/to/shared/directory` 的绝对路径来映射宿主机目录到容器中。 ```yaml services: containerA: image: myimageA volumes: - /path/to/shared/directory:/path/to/shared/directory ``` **4. 选择哪种方法取决于你的需求:** * 如果你只需要sharing数据,可以使用命名卷或匿名卷。 * 如果你需要对数据保持完整性,可以使用命名卷。 * 如果你的应用程序需要频繁访问和备份数据,可以使用直接挂载宿主机目录。

正文

需求:.NET程序需要监控一个FTP上的文件变化并进行操作,在linux上使用原生目录时,不管怎么切换后台运行,总是会在一段时间运行后死掉。

方案:远程也不好debug,想了一下,干脆直接使用docker-compose运行,设置死了自动重启(restart=always)就完事了。

由于FTP与.NET程序是两个单独的程序,因此需要进行磁盘共享才可以正常使用,研究了一下怎么使用Docker进行磁盘共享的方法。

使用卷

可以使用命名卷或者匿名卷操作。

匿名卷

匿名数据卷(anonymous volume)是没有显式指定名称的数据卷。当定义了一个匿名卷时,Docker会为该卷分配一个随机的名称,并将其挂载到容器的文件系统中。这样做的好处是使得数据卷的管理更加简单,并且可以避免命名冲突。

使用匿名卷实现Docker容器间共享磁盘的Docker Compose配置:

version: '3.7'
services:
  containerA:
    image: myimageA
    volumes:
      - shared-data:/path/to/shared/directory
  containerB:
    image: myimageB
    volumes:
      - shared-data:/path/to/shared/directory
volumes:
  shared-data:

上面定义了一个名为“shared-data”的匿名卷,并将其挂载到两个容器的相同目录中。这将使容器A和B都能够访问该目录并共享数据。

使用匿名卷有以下优点:

  • 管理更加简单。因为不需要为每个数据卷分配一个唯一的名称,所以您可以更轻松地管理应用程序中的所有数据卷。
  • 避免命名冲突。由于每个匿名卷都有一个随机的名称,所以可以避免命名冲突,从而提高整个应用程序的安全性和可靠性。

但是,使用匿名卷也有一些缺点:

  • 不易识别。由于匿名卷没有名称,因此很难识别哪个卷属于哪个容器。
  • 不易备份和恢复。由于匿名卷没有名称,因此在备份和恢复过程中可能会导致一些问题。

命名卷

命名卷(named volume)是需要显式指定名称的数据卷。通过添加name属性来指定这个卷的名称的好处是可以更清晰地识别哪个卷属于哪个容器,并且可以更方便地备份和恢复数据。

使用命名卷实现Docker容器间共享磁盘的Docker Compose配置:

version: '3.7'
services:
  containerA:
    image: myimageA
    volumes:
      - shared-data:/path/to/shared/directory
  containerB:
    image: myimageB
    volumes:
      - shared-data:/path/to/shared/directory
volumes:
  shared-data:
    name: my-named-volume

上面定义了一个名为“shared-data”的命名卷,并将其挂载到两个容器的相同目录中。与匿名卷不同的是,我们通过添加name属性来指定这个卷的名称为“my-named-volume”。这将使容器A和B都能够访问该目录并共享数据。

使用命名卷有以下优点:

  • 易于识别。由于每个命名卷都有一个唯一的名称,因此可以更轻松地识别哪个卷属于哪个容器。
  • 易于备份和恢复。由于命名卷有唯一的名称,可以更方便地备份和恢复数据。

但是,使用命名卷也有一些缺点:

  • 需要手动指定名称。与匿名卷不同的是,需要为每个命名卷手动指定名称,这可能会导致一些问题。
  • 命名冲突。如果多个容器试图使用相同的命名卷名称,则会发生命名冲突,这可能会影响应用程序的安全性和可靠性。

直接挂载宿主机目录

另一种实现Docker容器间共享磁盘的方法是直接将宿主机上的目录挂载到容器中的目录。这种方法非常简单,可以直接在Docker Compose文件中使用绝对路径来挂载一个目录。

下面是直接挂载宿主机目录实现Docker容器间共享磁盘的示例Docker Compose配置:

version: '3.7'
services:
  containerA:
    image: myimageA
    volumes:
      - /path/to/shared/directory:/path/to/shared/directory
  containerB:
    image: myimageB
    volumes:
      - /path/to/shared/directory:/path/to/shared/directory

以上直接将宿主机上的/path/to/shared/directory目录挂载到两个容器的相同目录中。这将使容器A和B都能够访问该目录并共享数据。

使用直接挂载宿主机目录有以下优点:

  • 易于管理。可以轻松地访问、备份和恢复数据,因为它们存储在宿主机上。
  • 易于识别。可以轻松地找到哪个目录属于哪个容器,从而更好地组织和管理数据。

但是,使用直接挂载宿主机目录也有一些缺点:

  • 安全风险。如果宿主机被攻击或出现故障,数据可能会受到威胁。
  • 不可移植。如果想要将应用程序移动到另一台机器上,必须确保拥有相同的目录结构和路径。

总结

最后我还是选择了命名卷的方法部署程序,主要考虑到以后保留迁移的可能性,但是又保留一定的程序独立启动与配置的功能。

本文编写借助了new bing,人工有所修改和校对,代码思路没有问题。

与Docker容器共享磁盘相似的内容:

Docker容器共享磁盘

需求:.NET程序需要监控一个FTP上的文件变化并进行操作,在linux上使用原生目录时,不管怎么切换后台运行,总是会在一段时间运行后死掉。 方案:远程也不好debug,想了一下,干脆直接使用docker-compose运行,设置死了自动重启(restart=always)就完事了。 由于FTP与.

白话理解和使用DOCKER VOLUME

出于效率等一系列原因,Docker容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题: 不能在宿主机上很方便地访问容器中的文件。 无法在多个容器之间共享数据。 当容器删除时,容器中产生的数据将会丢失。 为了解决这些问题,Docker引入了数据卷(Volume) 机制。数据卷以独立于Do...

[转帖]k8s 修改 pod 内容器内核参数

https://www.cnblogs.com/leffss/p/14832023.html 容器的本质是一个进程,共享宿主机的内核。原以为修改了宿主机的内核参数容器中也会改,但实际上并不是这样,容器的内核参数可以和宿主机不同。 docker 修改内核参数 docker run -it --rm -

[转帖]docker容器跨主机网络overlay

https://www.cnblogs.com/machangwei-8/p/15757120.html 目录 拉取镜像,运行容器 浏览器上访问Consul 修改host1,host2的docker daemon配置文件 创建网络 验证 在overlay中运行容器 运行 查看一下这两个网卡 查看生成

[转帖]Docker容器跨主机通信overlay网络的解决方案

https://www.jb51.net/article/237838.htm 一、Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接口,每个子接口标识一

[转帖]docker 容器基础技术:linux cgroup 简介

https://cizixs.com/2017/08/25/linux-cgroup/ Linux cgroups 的全称是 Linux Control Groups,它是 Linux 内核的特性,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、

[转帖]Docker容器动态添加端口

方法1 修改iptables端口映射 docker的端口映射并不是在docker技术中实现的,而是通过宿主机的iptables来实现。通过控制网桥来做端口映射,类似路由器中设置路由端口映射。 比如我们有一个容器的80端口映射到主机的8080端口,先查看iptables到底设置了什么规则:登录后复制

[转帖]Docker容器管理技术-高级网络管理

Docker容器管理技术-高级网络管理 https://www.jianshu.com/p/5859a2fe4377 1. Docker本地网络类型 1.1查看支持网络类型 docker network ls 1.2 测试使用各类网络类型 docker run network=xxx none :

[转帖]Docker 容器运行 ivorysql 之体验

当下容器运行应用已经越来越火,只要主机上能运行 Docker,就可以通过镜像来运行应用,不需要考虑环境是否满足应用的运行条件。今天就给大家分享一下使用镜像运行 ivorysql 数据库。如果你容器运行过 postgresql,那就比较容易上手了,几乎是一样的体验,稍微有点差别,后面会说明。 友情提示

【转帖】Docker容器四种网络模式

https://blog.whsir.com/post-5268.html docker自身默认提供了四种网络模式:none、bridge、container、host。除了这四种网络模式外,还可以通过插件自定义一些网络模式,比如macvlan、overlay等。 默认的这四种网络模式其实很好理解,