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

news/2025/1/23 0:12:02/

        在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/news/1565343.html

相关文章

【数据结构篇】顺序表 超详细

目录 一.顺序表的定义 1.顺序表的概念及结构 1.1线性表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 二.动态顺序表的实现 1.准备工作和注意事项 2.顺序表的基本接口&#xff1a; 2.0 创建一个顺序表 2.1 顺序表的初始化 2.2 顺序表的销毁 2.3 顺序表的打印 3.顺序…

0基础跟德姆(dom)一起学AI 自然语言处理18-解码器部分实现

1 解码器介绍 解码器部分: 由N个解码器层堆叠而成每个解码器层由三个子层连接结构组成第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接第二个子层连接结构包括一个多头注意力子层和规范化层以及一个残差连接第三个子层连接结构包括一个前馈全连接子层…

WPS PPT中插入实时更新可变的日期

在 WPS 演示&#xff08;WPS Presentation&#xff09;中插入实时可变的日期&#xff0c;可以通过以下步骤实现&#xff1a; 方法一&#xff1a;使用“日期和时间”功能 打开 WPS 演示&#xff0c;进入需要插入日期的幻灯片。 插入日期和时间&#xff1a; 点击顶部菜单栏的 “…

浅谈Java之AJAX

一、基本介绍 在Java开发中&#xff0c;AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于创建动态网页的技术&#xff0c;它允许网页在不重新加载整个页面的情况下与服务器进行交互。 二、关键点和示例 1. AJAX的基本原理 AJAX通过JavaScript的XMLHtt…

CentOS 下载软件时报Error: Failed to synchronize cache for repo ‘AppStream‘解决方法

下载软件时出现以下问题 直接把CentOS-AppStream.repo改个名字就行 cd /etc/yum.repos.d/ mv CentOS-AppStream.repo CentOS-AppStream.repo.bak就可以了 解决思路 把AI问遍&#xff0c;无人会&#xff0c;解决法 想要下载软件通通失败了&#xff0c;解决方法当然是问AI&am…

【Unity】ScrollViewContent适配问题(Contentsizefilter不刷新、ContentSizeFilter失效问题)

最近做了一个项目&#xff0c;菜单栏读取数据后自动生成&#xff0c;结果用到了双重布局 父物体 尝试了很多方式&#xff0c;也看过很多大佬的文章&#xff0c;后来自己琢磨了一下&#xff0c;当子物体组件自动生成之后&#xff0c;使用以下以下代码效果会好一些&#xff1a; …

(RAG系列) FastGPT通过API调用工作流问答

FastGPT通过API调用工作流问答 版本使用说明代码模板 版本 fastgpt v4.8.10 使用说明 注意两个参数 stream 是否流式输出 detail 是否体现工作流过程细节 代码模板 import requests import pandas as pddef get_completion(question):# Define the URL and headersurl …

使用 Babylon.js 开发时如何通过 CSS 实现 UI 自适应

本文将介绍如何在 Babylon.js 开发中&#xff0c;通过预先定义的 CSS 文件实现 UI 的自适应布局&#xff0c;确保 UI 能够根据 Canvas 元素的尺寸动态调整。 场景描述 假设我们已经使用 HTML 和 CSS 构建了 Babylon.js 的 UI 界面&#xff0c;并且所有样式都定义在 CSS 文件中…