需求:.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容器共享磁盘的更多相关文章

  1. docker容器共享宿主机环境,从而为镜像体积减负

    一.背景介绍 响应公司技术发展路线,开发的服务均需要将打成docker镜像,使用docker进行统一管理.可是随着服务越来越多,镜像也越来越多.每次制作镜像的时候都需要将依赖打进容器,这样一个jre的 ...

  2. docker容器安全

    title: docker容器安全 tags: Docker,容器,安全策略 grammar_cjkRuby: true --- Docker容器的安全性 1.安全策略-Cgroup 1.限制Cpu ...

  3. Docker容器(一)——Docker的介绍与部署

    (1).Docker概述 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化.容器是 ...

  4. Kubernetes & Docker 容器网络终极之战(十四)

    目录 一.单主机 Docker 网络通信 1.1.host 模式 1.2 Bridge 模式 1.3 Container 模式 1.4.None 模式 二.跨主机 Docker 网络通信分类 2.1 ...

  5. 从Docker容器内部,如何连接到本机的本地主机?

    原文 从Docker容器内部,如何连接到本机的本地主机? 编辑:如果您使用的是Docker-for-mac或Docker-for-Windows 18.03+,只需使用主机连接到您的mysql服务即可 ...

  6. Docker for window 无法共享磁盘

    Docker for window 无法共享主机磁盘,环境如下: 操作系统: windown10 Docker version 18.09.0, build 4d60db4 症状如下: 如图,点击ap ...

  7. docker容器磁盘

    docker容器磁盘扩容 一.配置文件里更改容器创建时的默认磁盘大小 [root@ip---- ~]# cat /etc/sysconfig/docker-storage DOCKER_STORAGE ...

  8. docker容器存放目录磁盘空间满了,转移数据修改Docker默认存储位置

    原文:docker容器存放目录磁盘空间满了,转移数据修改Docker默认存储位置 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_3767485 ...

  9. 5、docker容器数据卷: -v添加共享传递容器数据卷

    1.是什么 1.docker理念 先来看看Docker的理念:*  将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的*  容器之间希望有可能共享数据 2.保 ...

  10. docker容器互联,实现目录、服务共享

    一.需求 docker使服务之间实现容器隔离,比如Javaweb项目前端.后端.数据库.数据库后台,分别把它们部署在不同的容器里面,实现隔离.但服务和服务之间也有互访的需求,这就涉及到容器网络和容器互 ...

随机推荐

  1. VMware Vsphere 8.0 ESXI 主机部署

    一. VMware vSphere 8.0新特性 VMware vSphere 8.0是一个全新的版本,引入了许多新功能,其中最主要的新功能包括 1.集中式云控制台 使 IT 管理员能够借助 vSph ...

  2. `std::optional` 函数返回值

    std::optional 是 C++17 中引入的一个模板类,用于表示一个值可能存在也可能不存在的情况. 它可以存储一个值,或者表示没有值的状态,类似于其他编程语言中的"可选"类 ...

  3. USB gadget configfs

    概述 USB Linux Gadget是一种具有UDC (USB设备控制器)的设备,可以连接到USB主机,以扩展其附加功能,如串口或大容量存储能力. 一个gadget被它的主机视为一组配置,每个配置都 ...

  4. Android应用启动全流程分析(源码深度剖析)

    目录 1.前言 2.大纲 3. Input触控事件处理流程 3.1 系统机制分析 3.2 结合Systrace分析 4. 应用进程的创建与启动 4.2 创建应用进程 4.2.1 AMS 发送socke ...

  5. wpf基本布局控件 -- 01

    <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/200 ...

  6. docker镜像&容器管理

    1.拉取镜像 docker pull 拉取 MySQL8.0 和 tomcat 拉取MySQL8.0镜像 [root@localhost ~]# docker pull mysql:8.0 拉取tom ...

  7. K8s GPU 资源管理探索:在 KubeSphere 上部署 AI 大模型 Ollama

    作者:运维有术星主 随着人工智能.机器学习.AI 大模型技术的迅猛发展,我们对计算资源的需求也在不断攀升.特别是对于需要处理大规模数据和复杂算法的 AI 大模型,GPU 资源的使用变得至关重要.对于运 ...

  8. 某物联网数智化园区行业基于 KubeSphere 的云原生实践

    公司简介 作为物联网 + 数智化园区一体化解决方案提供商,我们致力于为大中型园区.停车场提供软硬件平台,帮助园区运营者实现数字化.智能化运营. 在使用 K8s 之前我们使用传统的方式部署上线,使用 s ...

  9. 容器部署DNS你会吗?

    docker快速部署DNS,实现快速上线 概念 环境介绍 部署DNS 下载相关镜像 创建并启动DNS容器 简单介绍三种创建方式 容器启动停止 创建dns交互式容器 配置DNS容器相关配置 测试 修改客 ...

  10. Power BI新卡片更改显示单位

    Power BI 不知道什么时候发布了新卡片,照现在官方来说,该视觉对象目前还属于预览版,但已经可以正常使用了,对比旧的卡片,显示效果个人觉得会友好一些,详见官方说明:创建"新"卡 ...