Docker实现挂载的N种方式

目录

docker挂载

默认情况下,在Docker容器内创建的所有文件都只能在容器内部使用。容器删除后,数据也跟着删除,虽然通常我们不会删除容器,但是一旦宿主机发生故障,我们重新创建容器恢复服务,那么之前容器创建的文件就会丢失。所以我们需要将容器数据写到宿主机内,方便我们数据的存储、修改和共享。

那么这时候就需要使用到我们的挂载技术了,挂载技术就是将容器的文件路径挂载到宿主机的文件系统路径上,这样在容器更改文件可以同步到宿主机,在宿主机更改文件也可以同步到容器,而且我们多个容器可以挂载到一个宿主机的文件目录,实现数据共享

实现挂载的方式

Docker实现挂载有多种方式,下面是我了解到的一些方式

绑定挂载

绑定挂载(Bind Mounts):绑定挂载是将主机上的文件或目录挂载到容器中,是在允许容器时使用-v参数来指定挂载的目录,下面是运行指令

bash 复制代码
docker run -v /host/path:/container/path image_name

注:/host/path:为宿主机地址,/container/path为容器地址

容器启动起来以后,我们可以通过docker inspect 容器id命令查看是否挂载成功,如果出现"Mounts"属性则挂载成功。

数据卷(Volume)挂载

数据卷挂载就是将 Docker 数据卷挂载到容器中。数据卷是一个可供一个或多个容器使用的特殊目录,用于存储数据和共享数据。它独立于容器的生命周期,容器可以在挂载点读取和写入数据,就像使用普通目录一样。

一般数据卷的都放在docker的工作目录/var/lib/docker/volume/下

数据卷分为两种:一种是具名数据卷,一种是匿名数据卷。具名是自定义了数据卷文件夹的名字,匿名的话就是docker会分配一个默认的名字

下面创建一个具名数据卷

bash 复制代码
# 创建数据卷
docker volume create myvolume 

注:myvolume为数据卷的名称

# 查看所有数据卷
docker volume ls

# 查看指定数据卷Mountpoint属性,可以看到数据卷的具体位置
docker volume inspect myvolume
[
    {
        "CreatedAt": "2023-11-08T14:44:09+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
        "Name": "myvolume",
        "Options": null,
        "Scope": "local"
    }
]

创建了具名数据卷之后,我们就可以使用这个数据卷来绑定容器了,绑定容器有以下两种方式
# 使用-v参数
docker run -d  -v myvolume:/app/logs -p 8000:8000 image_name

# 使用--mount参数(可指定更详细参数)
docker run  --mount source=myvolume,target=/app/logs -p 8000:8000 image_name

注:image_name为镜像名

下面为匿名挂载

匿名挂载我们不需要先创建数据卷,只需要在运行时使用-v参数,并指定容器路径,那么docker久会为该路径创建一个随机名称的文件夹进行挂载

bash 复制代码
#下面命令就会为/etc/nginx生成一个数据卷,我们可以使用docker volume ls查看
docker run -d -P --name nginx01 -v /etc/nginx nginx

我们挂载的时候还可以指定容器对于数据卷的读写权限

:ro 容器只能读

:rw 容器可读可写

不指定的话默认用:rw

bash 复制代码
#下面设置为只读
docker run -d -P --name nginx01 -v /etc/nginx:ro nginx

DockerFile 定义数据卷

我们在使用DockerFile进行创建镜像的时候,就可以创建数据卷

DockerFile创建数据卷的指令是:VOLUME

注:VOLUME 生成的都是匿名数据卷,不能指定主机目录

语法:

bash 复制代码
VOLUME ["镜像内部的路径1","镜像内部的路径2","镜像内部的路径3",.......]

实例:

bash 复制代码
FROM centos
VOLUME ["/data1","/data2"]

使用这个DockerFile创建镜像后,就会自动创建两个数据卷挂载点

对于匿名数据卷,我们可以使用下面步骤来查询容器对应的数据卷

1、先查询运行中的容器,获取到容器ID(container_id)

bash 复制代码
docker ps -a

2、再使用docker inspect查询容器的详细信息,找到Mounts就是数据卷的信息了

bash 复制代码
docker inspect container_id

临时文件系统(tmpfs)挂载挂载

临时文件系统挂载允许将临时文件系统挂载到容器的指定路径。与文件挂载和数据卷挂载不同,临时文件系统挂载仅在容器的生命周期内存在,并且不会对主机文件系统产生影响。可以通过在运行容器时使用 --tmpfs 参数来指定临时文件系统挂载

实例:

bash 复制代码
docker run --tmpfs /container/path image_name```
相关推荐
AOwhisky20 分钟前
Python 学习笔记(第十四期)——运维自动化(下·中篇):远程文件传输——paramiko进阶篇
运维·python·学习·云原生·自动化·文件传输·paramiko
做个文艺程序员23 分钟前
Linux第22篇:用Docker容器化你的Java SaaS应用:一次构建,随处运行
java·docker·容器
imc.111 小时前
linux基础IO
linux·运维·服务器
躺不平的理查德1 小时前
让Ubuntu 的第二块网卡 ens37 永久固定为 192.168.30.111
运维·服务器
bitbrowser1 小时前
Facebook 验证反复回到原页面,应该从哪里排查
运维·服务器·facebook
Land03292 小时前
AI网页元素变化无法自动修复?自带元素自愈的自动化解决方案
运维·人工智能·ai·自动化·rpa
fengyehongWorld2 小时前
Jenkins 安装与简单配置
运维·jenkins
云智慧AIOps社区2 小时前
2026 国产化 ITSM 替代指南:横向测评 ServiceNow、轻帆云、Jira等五款主流IT服务管理平台
运维·人工智能·运维开发·it服务管理·itsm平台
Urbano2 小时前
针织卫衣全流程生产工序科普:自动化替代、产能优化与设备选型实战方案
运维·自动化
梦梦代码精2 小时前
基于ThinkPHP6 + Vue3的家政预约系统全解析:从LBS定位到自动派单的完整实现
java·docker·开源·php·代码规范