首页 > 其他分享 >Docker容器共享磁盘

Docker容器共享磁盘

时间:2023-03-10 20:45:23浏览次数:28  
标签:容器 匿名 磁盘 命名 shared Docker 目录

需求:.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,人工有所修改和校对,代码思路没有问题。

标签:容器,匿名,磁盘,命名,shared,Docker,目录
From: https://www.cnblogs.com/podolski/p/17204608.html

相关文章

  • linux命令--磁盘命令dd
    转载自:https://www.cnblogs.com/kongzhongqijing/articles/9049336.html============= 网上dd命令的文章有很多,这里只是自己做下简单的记录。dd命令介绍作用是用指......
  • Spring:IOC容器创建Bean的方式有哪几种?
    三种:直接使用构造器、从静态工厂中拿、从实例工厂中拿。 一、直接使用构造器1、配置bean<beanclass="com.lurenjia.dao.DemoDao"id="demoDao"></bean>2、从......
  • Docker常用应用之无数据库图床
    1.简介EasyImage,简单强大无数据库的图床,适用于个人使用等单一场景,而且在写这篇文章的时候,作者还在更新。EasyImage2.02.安装EasyImage2.0docker安装mkdir-p/data/do......
  • Golang项目使用Dockerfile部署
    前言关于在构建golang编写的web项目中使用dockerfile的一些总结。通过查阅资料后,写下了如下配置:一般模式会安装golang编译环境,镜像文件包会比较大。#构建golang运行......
  • dockerfile
    FROMopenjdk:8u191-jdk-alpine3.9MAINTAINERgggggRUNecho'http://mirrors.aliyun.com/alpine/v3.9/main'>/etc/apk/repositoriesRUNecho'http://mirrors.......
  • 安装 cri-dockerd
    下载地址#1切换镜像源[root@master~]#wgethttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo-O/etc/yum.repos.d/docker-ce.repowget-O/et......
  • docker部署Jenkins
    可以去Jenkins官网DockerHub的GitHub仓库,拷贝最新的部署脚本:https://github.com/jenkinsci/docker/blob/master/README.mddockerrun-p8888:8080-p55551:50000--r......
  • ACP云原生容器工程师 - 安全管理
    阿里云容器服务ACK安全体系阿里云容器服务Kubernetes版安全体系提供从基础设施到上层用户业务应用全链条安全体系支撑支持运行时刻的安全策略管理,应用安全配置巡......
  • Docker 新手教程(镜像,容器)
    DOCKER根据镜像创建:sudodockercreate-itimg_name启动容器:sudodockerstartcon_name停止容器:dockerstopcon_name删除容器:dockerrmcon_name改名:dockerrename......
  • T3 出行云原生容器化平台实践
    公司简介T3出行是南京领行科技股份有限公司打造的智慧出行生态平台,由中国第一汽车集团有限公司、东风汽车集团有限公司、重庆长安汽车股份有限公司发起,联合腾讯、阿里巴......