问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

🐳 一文看懂Docker中的卷到底是什么玩意?怎么用?

创作时间:
作者:
@小白创作中心

🐳 一文看懂Docker中的卷到底是什么玩意?怎么用?

引用
什么值得买
1.
https://post.smzdm.com/p/ak3p4omk/

🐳 一文看懂Docker中的卷到底是什么玩意?怎么用?
2025-02-09 21:46:36

各位看官,今天咱们不聊虚的,直接上干货,聊聊Docker里一个非常实用但又容易被忽略的家伙——Docker卷。你可以把它想象成容器数据的“任意门”,让数据在容器内外自由穿梭,实现持久化存储和共享。告别“容器一删,数据全完”的噩梦!

🐳 卷是什么?能吃吗?

简单来说,Docker卷就是一种数据持久化机制。它能让你把容器里的数据保存到主机的文件系统或其他地方,这样即使容器被删除了,数据也不会丢失。更厉害的是,多个容器还能共享同一个卷,实现数据共享和通信。

卷的三大作用:

  • 💾数据持久化:容器挂了,数据还在!
  • 🤝数据共享:容器之间可以共享数据,协同工作。
  • 🔄数据备份和恢复:轻松备份和恢复数据,不用担心容器内部结构。

🧱 卷的两种姿势:绑定挂载 vs Docker管理

Docker卷有两种主要的实现方式,就像武林中的两大门派,各有千秋:

  1. 绑定挂载(Bind Mounts):就像“乾坤大挪移”,直接把主机上的目录或文件“挪”到容器里。容器可以直接访问主机上的文件系统,非常灵活。

  2. Docker管理的卷(Docker Managed Volumes):就像“凌波微步”,Docker自己创建一个目录来存储卷数据,并负责管理卷的生命周期。你不用操心数据存在哪儿,Docker帮你搞定。

🚀 如何使用卷?三种方法任你选

1. docker run 命令:最直接的方式

这是最常用的方式,直接在运行容器的时候指定卷。

  • 绑定挂载:
    docker run -v /host/path:/container/path image_name
    例如:
    docker run -v /home/user/mydata:/app/data my_image
    这会将主机上的
    /home/user/mydata
    目录挂载到容器中的
    /app/data
    目录。

  • Docker管理的卷:
    docker run -v volume_name:/container/path image_name
    例如:
    docker run -v my_volume:/app/data my_image
    这会创建一个名为
    my_volume
    的卷(如果它不存在),并将其挂载到容器中的
    /app/data
    目录。如果省略
    volume_name
    ,Docker 会创建一个匿名卷(不推荐,不好管理)。

2. docker-compose.yml 文件:编排利器

如果你使用 Docker Compose 来管理多个容器,可以在
docker-compose.yml
文件中定义卷。

  • 定义卷:
    version: "3.9" services: web: image: nginx:latest ports: - "80:80" volumes: - mydata:/usr/share/nginx/html volumes: mydata:
    这会创建一个名为
    mydata
    的卷,并将其挂载到
    web
    服务中的
    /usr/share/nginx/html
    目录。

  • 绑定挂载:
    version: "3.9" services: web: image: nginx:latest ports: - "80:80" volumes: - ./data:/usr/share/nginx/html
    这会将
    docker-compose.yml
    文件所在目录下的
    ./data
    目录挂载到容器中的
    /usr/share/nginx/html
    目录。

3. Dockerfile 中的 VOLUME 指令:镜像的“预设”

Dockerfile 中的
VOLUME
指令用于声明一个或多个卷。

VOLUME ["/data"]
这会告诉 Docker 在容器启动时创建一个卷,并将其挂载到
/data
目录。
注意,
VOLUME
指令只能指定容器内的挂载点,不能指定主机上的挂载点。

🤔 Dockerfile 中 VOLUME 指令的特殊性

Dockerfile 中的
VOLUME
指令与
docker run -v
命令在使用上有一些差异,需要特别注意:

特性Dockerfile
docker run
作用定义镜像中的卷启动容器时挂载卷主机路径不能指定主机路径,只能定义容器内的挂载点可以指定主机路径(绑定挂载)或卷名创建卷Docker build的时候,会创建匿名卷使用显式命名的volume可以复用卷覆盖
docker run -v
会覆盖Dockerfile中的VOLUME/
重点:Dockerfile 中定义
VOLUME
后,Docker 会在
docker build
的时候创建匿名卷。如果你想使用具名卷或者绑定挂载,需要在
docker run
的时候使用
-v
选项覆盖 Dockerfile 中的定义。

📝 总结:选择最适合你的“任意门”

  • 绑定挂载:灵活方便,适合需要在主机上共享数据或需要更高灵活性的场景。但是可移植性较差,因为依赖于特定的主机目录结构。
  • Docker管理的卷:方便管理,适合需要持久化存储数据,但不需要关心数据存储位置的场景。可移植性较好,因为卷由 Docker 统一管理。
  • Dockerfile 中的
    VOLUME
    指令:适合在镜像中声明需要持久化存储的目录,但需要注意其特殊性。

总而言之,选择哪种方法取决于你的具体需求。希望这篇文章能帮助你更好地理解和使用 Docker 卷,让你的容器数据不再“孤苦伶仃”!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号