实现宿主机(Windows 10 Docker Desktop)和Linux容器之间的数据挂载的三种方法

ops/2025/1/23 1:10:35/

        在Windows 10上使用Docker Desktop运行Linux容器时,经常需要将宿主机上的文件或目录与容器内的文件或目录进行关联,以便实现数据的共享和持久化。Docker提供了多种方法来实现这一目标,包括使用-v选项挂载宿主机目录、创建Docker数据卷以及使用--mount指令进行绑定挂载。本文将详细介绍这三种方法的基本语法、具体实践以及它们各自的使用场景。

 

一、使用-v选项挂载宿主机目录
基本语法

        使用-v选项可以将宿主机上的目录挂载到容器内的指定目录。其基本语法如下:

docker run -d --name <容器名> -v <宿主机目录>:<容器目录> <镜像>

        其中,<宿主机目录>是宿主机上的目录路径,<容器目录>是容器内的目录路径,<镜像>是要启动的Docker镜像名称。

具体实践
  1. 创建宿主机目录

    在Windows 10上,首先创建一个要挂载到容器中的目录。例如,在C:盘下创建一个名为docker_data的目录。

    mkdir C:\docker_data
  2. 启动容器并挂载目录

    使用docker run命令启动一个Linux容器,并将刚才创建的目录挂载到容器内。例如,挂载到容器的/data目录。

    docker run -d --name my-ubuntu -v C:\docker_data:/data ubuntu

    这里,my-ubuntu是容器的名称,ubuntu是使用的Docker镜像名称。

  3. 验证挂载

    进入容器内部,验证挂载是否成功。

    docker exec -it my-ubuntu /bin/bash
    cd /data
    ls

    如果挂载成功,你应该能够在容器的/data目录中看到宿主机C:\docker_data目录中的内容。

使用场景
  • 开发和测试:在开发和测试环境中,经常需要将宿主机上的代码或配置文件挂载到容器内,以便快速进行修改和测试。例如,在开发一个Web应用时,可以将本地的源代码目录挂载到容器的Web服务器目录中。
  • 简单数据共享:需要将宿主机上的某个目录与容器共享的场景,例如将宿主机上的日志目录挂载到容器中,以便在容器中运行的应用可以直接写日志到宿主机上。
二、创建Docker数据卷
基本语法

        Docker数据卷是一种由Docker管理的特殊目录,用于持久化和共享数据。可以通过以下命令创建一个数据卷并将其挂载到容器:

docker volume create <数据卷名称>
docker run -d --name <容器名> -v <数据卷名称>:<容器目录> <镜像>

        其中,<数据卷名称>是自定义的数据卷名称,<容器目录>是容器内的挂载点,<镜像>是要启动的Docker镜像名称。

具体实践
  1. 创建数据卷

    使用docker volume create命令创建一个数据卷。例如,创建一个名为my_volume的数据卷。

    docker volume create my_volume
  2. 启动容器并挂载数据卷

    使用docker run命令启动一个Linux容器,并将刚才创建的数据卷挂载到容器内。例如,挂载到容器的/data目录。

    docker run -d --name my-ubuntu-volume -v my_volume:/data ubuntu
  3. 验证挂载

    进入容器内部,验证数据卷是否成功挂载。

    	docker exec -it my-ubuntu-volume /bin/bashcd /datals

    由于数据卷是空的,所以此时/data目录应该是空的。但是,你可以在这个目录中创建文件或目录,这些文件或目录将在数据卷中持久化存储。

  4. 查看数据卷信息

    使用docker volume inspect命令查看数据卷的详细信息。

    docker volume inspect my_volume
使用场景
  • 持久化存储:需要在容器重启或删除后仍然保留数据的场景,如数据库数据、应用程序日志等。
  • 多容器数据共享:需要在多个容器之间共享数据的场景,如在微服务架构中不同服务之间共享数据。
三、使用--mount指令进行绑定挂载
基本语法

        绑定挂载(Bind Mounts)是指将宿主机上的一个文件或目录挂载到容器内。使用--mount选项可以提供更精细的控制。其基本语法如下:

docker run -d --name <容器名> --mount type=bind,source=<宿主机目录>,target=<容器目录>[,readonly] <镜像>

        其中,<宿主机目录>是宿主机上的目录路径,<容器目录>是容器内的挂载点,readonly是可选参数,表示以只读方式挂载。

具体实践
  1. 创建宿主机目录

    在Windows 10上,创建一个要挂载到容器中的目录。例如,在D:盘下创建一个名为docker_bind_mount的目录。

    mkdir D:\docker_bind_mount
  2. 启动容器并绑定挂载

    使用docker run命令启动一个Linux容器,并将刚才创建的目录以绑定挂载的方式挂载到容器内。例如,挂载到容器的/mnt/data目录。

    docker run -d --name my-ubuntu-bind -v D:\docker_bind_mount:/mnt/data:ro ubuntu

    这里,D:\docker_bind_mount是宿主机上的目录,/mnt/data是容器内的挂载点,ro表示以只读方式挂载。

  3. 验证挂载

    进入容器内部,验证绑定挂载是否成功。

    docker exec -it my-ubuntu-bind /bin/bash
    cd /mnt/data
    ls

    如果挂载成功,你应该能够在容器的/mnt/data目录中看到宿主机D:\docker_bind_mount目录中的内容。由于是以只读方式挂载的,所以无法在容器内对挂载目录进行修改。

使用场景
  • 需要更精细的挂载配置和选项的场景:例如,某些应用可能需要对配置文件只读访问,而对日志目录则需要读写访问。在这种情况下,可以使用--mount选项明确指定挂载类型和权限。
  • 生产环境:在生产环境中,对挂载行为需要精确控制的场景。使用--mount可以提供更好的可读性和管理性,减少配置错误的可能性。
总结

        在Windows 10上使用Docker Desktop运行Linux容器时,实现宿主机和容器之间的数据挂载有三种主要方法:使用-v选项挂载宿主机目录、创建Docker数据卷以及使用--mount指令进行绑定挂载。每种方法都有其特定的使用场景和优势。

  • 使用-v选项:简单直接,适合开发和测试环境以及简单的共享需求。
  • 创建数据卷:由Docker管理,适合需要持久化存储和多容器数据共享的场景,通常用于生产环境。
  • 使用--mount指令:提供精细控制和更好的可读性,适合复杂挂载需求和生产环境。

        根据具体的需求和使用场景,选择适当的挂载方法可以提高开发效率和系统的稳定性。


http://www.ppmy.cn/ops/152324.html

相关文章

大文件上传服务-后端V1V2

文章目录 大文件上传概述:minio分布式文件存储使用的一些技术校验MD5的逻辑 uploadV1 版本 1uploadv2 版本 2 大文件上传概述: 之前项目做了一个文件上传的功能,最近看到有面试会具体的问这个上传功能的细节&#xff0c;把之前做的项目拿过来总结一下&#xff0c;自己写的一个…

【PCL】Segmentation 模块—— 欧几里得聚类提取(Euclidean Cluster Extraction)

1、简介 PCL 的 Euclidean Cluster Extraction&#xff08;欧几里得聚类提取&#xff09; 是一种基于欧几里得距离的点云聚类算法。它的目标是将点云数据分割成多个独立的簇&#xff08;clusters&#xff09;&#xff0c;每个簇代表一个独立的物体或结构。该算法通过计算点与点…

JAVA:Spring Boot 实现责任链模式处理订单流程的技术指南

1、简述 在复杂的业务系统中&#xff0c;订单流程往往需要一系列的操作&#xff0c;比如验证订单、检查库存、处理支付、更新订单状态等。责任链模式&#xff08;Chain of Responsibility&#xff09;可以帮助我们将这些处理步骤分开&#xff0c;并且以链式方式处理每一个操作…

Docker部署MySQL 5.7:持久化数据的实战技巧

在生产环境中使用Docker启动MySQL 5.7时&#xff0c;需要考虑数据持久化、配置文件管理、安全性等多个方面。以下是一个详细的步骤指南。 1. 准备工作 &#xff08;1&#xff09;创建挂载目录 在宿主机上创建用于挂载的目录&#xff0c;以便持久化数据和配置文件。 sudo mkdi…

Freemarker和ItextPDF实际应用

1. FreeMarker模板文件路径 确保FreeMarker模板文件位于正确的路径&#xff0c;并通过Spring Boot自动加载。模板文件放在 src/main/resources/templates/ 目录下&#xff0c;FreeMarker会自动处理这些文件。 Configuration public class FreeMarkerConfig {Value("${sp…

Walrus Learn to Earn计划正式启动!探索去中心化存储的无限可能

本期 Learn to Earn 活动将带领开发者和区块链爱好者深入探索 Walrus 的技术核心与实际应用&#xff0c;解锁分布式存储的无限可能。参与者不仅能提升技能&#xff0c;还能通过完成任务赢取丰厚奖励&#xff01;&#x1f30a; 什么是 Walrus&#xff1f; 数据主权如今正成为越…

【2024年华为OD机试】 (E卷,100分) - 字符统计及重排(JavaScriptJava PythonC/C++)

一、问题描述 题目描述 给定一个仅包含字母的字符串(不包含空格),统计字符串中各个字母(区分大小写)出现的次数,并按照字母出现次数从大到小的顺序输出各个字母及其出现次数。如果次数相同,则按照自然顺序进行排序,且小写字母在大写字母之前。 输入描述 输入一行,…

使用EVE-NG-锐捷实现静态路由

一、项目拓扑 二、项目实现 1、路由器R1配置 进入特权模式 enable 进入全局模式 configure terminal更改名称为R1 hostname R1关闭域名解析。在域名解析开启的情况下&#xff0c;输错的命令会当做域名进行解析&#xff0c;卡住30秒左右&#xff0c;直至解析超时 …