Docker之docker volume 挂载到容器(Windows下,volume目录挂载在容器、四)(第十四篇)

前2篇都是相对于docker的运行环境Linux而来的,但是我们现实环境中,开发环境中都是使用的是Windows,所有很有必要学会在Windows下挂载容器,如果你自己的机器也是Linux,那就不需要担心什么了,直接和上面一样,但是你如果是Windows系统,那么就有点麻烦了,具体怎么操作,看一下我的案例吧。

首先docker容器的LinuxWindows支持并不是很高,他只对C:\Users 目录下进行挂载,其他目录都没有办法挂载,除非用VirtualBox修改这个虚拟机的共享目录设定,否则在虚拟机里只能看到C:\Users以下的文件


可以看到Linux系统只有关联到本地C:\Users这个目录,其他的目录都找不到,那么我们就在这个目录下进行挂载操作

 docker run -d -p 8888:8080 -v /c/Users/systemDir:/usr/local/log balance


我们看到已经能够完美的挂载了,其他实验方法可以自行测试。

其实Windows下最主要的是要找对位置,其他的逻辑和之前的是一样的,还是Windows下的docker是在一个Linux虚拟机环境下运行的,这一点非常重要!

volume/数据卷容器(--volumes-from)

创建的方式所谓有一点不同,就是要在挂载的文件下创建一个数据卷容器,专门用户其他容器挂载,但是操作起来和挂载差不多,就是多了一个创建db.properties 文件

比如在挂载目录/data 下面创建一个/data/dbdata,然后再在里面创建一个db.properties 文件

首先启动一个容器

docker run -it -d -p 8888:8080 -v /data/dbdata --name dbdata  balance

/data/dbdata,然后再在里面创建一个db.properties 文件

然后再起一个容器

docker run -it -d -p 9999:8080 --volumes-from dbdata jpress

使用命令docker inspect时,发现他们的Mounts下的Source都是一样的,说明它们都绑定到宿主机的同一个目录,所以当某个容器的挂载修改时,其他容器也看到了同样的效果

Dockerfile 文件构建的时候设置volume

VOLUME /data

这家就不需要每次启动容器的时候再指定挂载目录了



<think>我们正在讨论如何将宿主机目录挂载Docker容器。根据用户提供的引用信息,我们可以总结如下: 1. 使用`docker run`命令的`-v`选项可以实现宿主机目录容器目录挂载。 2. 挂载时需要注意宿主机目录容器目录的覆盖关系。 具体步骤和注意事项如下: ### 一、基本挂载方法 使用`docker run`命令时通过`-v`或`--volume`选项指定挂载: ```bash docker run -d --name <容器名> -v <宿主机绝对路径>:<容器内绝对路径> <镜像名> ``` - `<宿主机绝对路径>`:必须是绝对路径,如`/home/user/data` - `<容器内绝对路径>`:容器内的目标路径,如`/app/data` - 示例:将宿主机`/home/jn10010537`挂载容器的`/share`目录 ```bash docker run -it --name my_container -v /home/jn10010537:/share nvidia/cuda:10.2-base ``` 执行后,容器内`/share`目录将显示宿主机`/home/jn10010537`的内容[^3]。 ### 二、挂载行为详解 1. **宿主机目录存在,容器目录存在** 宿主机目录会**覆盖**容器目录容器内原有内容被隐藏(非删除)[^2]。 ```mermaid graph LR A[宿主机目录] -- 挂载 --> B[容器目录] B --> C[原内容被隐藏] ``` 2. **宿主机目录不存在,容器目录存在** 自动创建宿主机空目录,并覆盖容器目录容器目录内容不可见)。 3. **挂载文件而非目录** - 宿主机文件挂载容器文件:覆盖容器内同名文件(容器启动成功) - 宿主机文件挂载容器目录:启动失败 ### 三、高级挂载模式 1. **只读挂载(防止容器修改数据)** ```bash docker run -v /host/path:/container/path:ro nginx ``` 2. **自动创建宿主机目录Docker 17.06+)** 使用`--mount`选项自动创建宿主机路径: ```bash docker run -v /auto/created/path:/data alpine ``` 3. **数据卷(Volume挂载** 创建独立于容器的数据卷,更易管理: ```bash docker volume create my_vol docker run -v my_vol:/var/lib/mysql mysql ``` ### 、验证挂载 进入容器检查目录内容: ```bash docker exec -it my_container ls /share # 应显示宿主机目录文件 ``` ### 五、注意事项 1. **权限问题** 容器内进程可能因权限不足无法访问挂载目录,需: - 确保宿主机目录可读(至少) - 或使用`-u`指定容器用户ID ```bash docker run -u 1000:1000 -v /host/path:/container/path ... ``` 2. **路径格式** Windows 路径需转换: ```bash docker run -v /c/Users/name:/data ... ``` 3. **挂载传播(Propagation)** 控制挂载点的共享方式(如`shared`, `slave`): ```bash docker run -v /host/path:/container/path:z ... ``` > 💡 **最佳实践**:生产环境推荐使用**数据卷(Volume)**,避免直接操作宿主机文件系统[^1]。 §§相关问题§§ 1. 如何在 Docker Compose 中配置目录挂载? 2. 如何解决容器无权限访问挂载目录的问题? 3. Docker 数据卷(Volume)与绑定挂载(Bind Mount)有何区别? [^1]: [Docker 绑定挂载文档](https://docs.docker.com/storage/bind-mounts/) : [挂载覆盖机制解析](https://docs.docker.com/storage/bind-mounts/#mount-into-a-non-empty-directory) : [宿主机目录挂载示例](https://docs.docker.com/get-started/06_bind_mounts/) </think> ## 如何将宿主机目录挂载Docker 容器 通过 `-v` 或 `--mount` 参数可将宿主机目录挂载Docker 容器中,实现宿主机与容器间的数据共享。以下是详细操作指南: ### 一、基础挂载方法 ```bash docker run -d --name <容器名> \ -v <宿主机绝对路径>:<容器内绝对路径> \ <镜像名> ``` #### 示例:挂载目录 ```bash # 将宿主机 /home/user/data 挂载容器的 /app/data docker run -it --name myapp \ -v /home/user/data:/app/data \ ubuntu:22.04 ``` 挂载容器内 `/app/data` 将显示宿主机目录内容 #### 示例:挂载文件 ```bash # 将宿主机配置文件挂载容器 docker run -d --name nginx \ -v /etc/nginx/site.conf:/etc/nginx/nginx.conf \ nginx ``` ### 二、挂载行为详解 | 场景 | 结果 | 示意图 | |------|------|--------| | **宿主机目录存在**<br>**容器目录存在** | 宿主机目录覆盖容器目录<br>(容器原内容被隐藏) | 宿主机目录容器目录 (覆盖) | | **宿主机目录不存在**<br>**容器目录存在** | 自动创建空宿主机目录<br>清空容器目录内容 | ∅ → 宿主机空目录容器目录 (清空) | | **宿主机文件** → **容器目录** | ❌ 启动失败 | 不兼容操作 | | **宿主机文件** → **容器文件** | ✅ 文件内容覆盖 | 宿主机文件 → 容器文件 (覆盖) | ```mermaid graph LR A[宿主机目录状态] --> B{容器目录状态} B -->|存在| C[覆盖隐藏] B -->|不存在| D[新建目录] A -->|不存在| E[新建空目录] ``` ### 三、高级挂载模式 1. **只读挂载(防止容器修改)** ```bash docker run -v /host/data:/app/data:ro alpine ``` 2. **自动创建宿主机目录Docker 17.06+)** ```bash # 自动创建 /opt/new_data docker run -v /opt/new_data:/container/data nginx ``` 3. **挂载多个目录** ```bash docker run \ -v /host/config:/etc/app \ -v /host/logs:/var/log/app \ myapp ``` ### 、使用 `--mount`(更明确的语法) ```bash docker run --name myservice \ --mount type=bind,source=/host/path,target=/container/path \ nginx ``` ### 五、挂载验证方法 1. 进入容器检查目录内容: ```bash docker exec -it myapp ls /app/data ``` 2. 检查挂载详情: ```bash docker inspect myapp | grep Mounts -A 20 ``` ### 六、注意事项 1. **路径规范** - 必须使用**绝对路径**(相对路径无效) - Windows路径需转换:`docker run -v /c/Users/me/data:/data` 2. **权限问题** ```bash # 指定用户权限 docker run -u 1000:1000 -v /host/data:/data alpine ``` 3. **SELinux 系统** ```bash # 添加 :z 或 :Z 标签 docker run -v /host:/container:z centos ``` > 💡 **最佳实践**:生产环境推荐使用**命名卷(Named Volumes)** 替代直接目录绑定,更易维护数据持久化。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值