docker4.9数据卷/网络模式

数据卷volume

1. 是什么?

数据卷(Volume)是 Docker 官方推荐的容器数据持久化方案 ,本质是由 Docker 守护进程统一管理的宿主机目录(默认路径:/var/lib/docker/volumes/),完全独立于容器的生命周期,专门用于持久化容器生成 / 使用的数据。

2. 为什么需要?

容器默认是临时存储:容器删除后,内部所有数据会被彻底清除,无法保留。数据卷解决了以下核心问题:

  • ✅ 数据持久化:容器销毁 / 重建后,数据不丢失
  • ✅ 数据共享:多个容器可挂载同一数据卷,实现数据互通
  • ✅ 解耦容器与数据:容器与存储分离,提升容器可移植性
  • ✅ 性能与安全:比直接挂载宿主机目录更安全,支持多种存储驱动扩展

3. 能干什么?

  • 持久化数据库、日志、配置等核心业务数据
  • 实现容器与宿主机、容器与容器之间的文件共享
  • 容器迁移、备份与恢复
  • 开发环境热重载(如代码实时同步)

绑定方式

1匿名绑定

-v /container/path

Docker 自动生成随机卷名,统一管理,/var/lib/docker/volumes/[哈希]/_data

匿名绑定绑定删除容器后,数据卷保留,可以使用--rm让容器删除时数据卷也删除

2具名绑定

-v my-volume:/container/path

按指定名称管理,默认路径/var/lib/docker/volumes/[卷名]/_data

3Bind Mount(绑定挂载)

-v /host/path:/container/path

用户手动指定宿主机任意路径,Docker 不管理直接映射宿主机目录,可实时读写宿主机文件

数据卷管理

docker volume是 Docker 专门用于 ** 管理数据卷(Volume)** 的核心命令,所有操作都围绕数据卷的生命周期展开。

  • 语法:docker volume COMMAND
  • 可以通过 docker volume COMMAND --help 查看每个子命令的详细用法
子命令 作用 常用实战示例
create 手动创建一个数据卷(匿名 / 具名) docker volume create nginx-data(创建名为 nginx-data 的具名卷)
inspect 查看数据卷的详细信息(包括存储路径、挂载点等) docker volume inspect nginx-data
ls 列出当前主机上所有的数据卷 docker volume ls(区分匿名卷 / 具名卷)
prune 删除所有未被使用的本地数据卷(清理孤儿卷) docker volume prune(执行前会二次确认)
rm 删除指定的一个或多个数据卷 docker volume rm nginx-data(删除单个)docker volume rm $(docker volume ls -qf dangling=true)(批量删匿名卷)

docker网络模式

1bridge网桥模式

核心结论速记

  1. 网络模式:这是 Docker 默认的 bridge 网络模式,容器默认连接到 docker0 网桥。

  2. 容器间通信:同一主机上的容器通过同一个 docker0 网桥实现二层互通,无需额外配置。

  3. 外网访问流程:容器访问外网时,请求会经过:容器 → docker0 网桥 → 宿主机网络栈/NAT → 宿主机网卡(ens33) → 外网

  • 默认网桥 docker0 不支持容器名解析→ 只能 ping IP,不能 ping 容器名

  • 自定义网桥 内置 DNS 服务→ 可以直接 ping web2curl web2

bash 复制代码
自定义网桥
docker network create --driver bridge my-net

docker run -d --name web1 --network my-net nginx
docker run -d --name web2 --network my-net nginx

docker exec -it web1 curl web2

2host模式

  • 原理
    • 共享网络命名空间。容器不再拥有独立的 IP,直接复用宿主机的 IP 和端口。
    • 容器内的端口就是宿主机的端口,不需要 -p 映射
  • 优点性能高(少一层转发)、端口直接暴露。
  • 缺点失去隔离性,端口容易冲突,容器间网络隔离失效。
bash 复制代码
docker run -d --name web3 --net host nginx

3. None(无网络模式)

  • 原理
    • 彻底关闭网络。容器只有一个 lo(回环接口),没有任何网卡。
    • 完全孤立,既不能访问外网,也不能被外部访问,也不能连其他容器。
  • 适用场景
    • 极度安全的离线任务。
    • 不需要网络的加密计算任务。
    • 手动定制网络的基础层。
bash 复制代码
docker run -d --name nginx-none --network none nginx

4. Container(容器模式)

  • 原理
    • 共享网络栈 。新创建的容器与一个已存在的容器共享网络命名空间。
    • 它们共用 IP、端口资源(例如:A 容器暴露了 80 端口,B 容器也能直接用 80,且互通)。
  • 关键点
    • 两个容器之间几乎无损耗通信(通过 lo 接口)。
    • 但这两个容器只有网络共享,文件系统还是隔离的
bash 复制代码
# 先运行容器A
docker run -d --name container-a nginx
# 运行容器B,与A共享网络
docker run -d --name container-b --network container:container-a nginx

5. 自定义网络(推荐)🔥 生产首选

  • 原理
    • 用户手动创建的网络(docker network create)。
    • 可以创建 Bridge 网络Overlay 网络(Swarm 模式)。
  • 为什么推荐?
    1. 自动 DNS 解析:在自定义网络中,容器名可以直接互 ping(默认 bridge 网络不行,需 link)。
    2. 完全隔离 :不同的自定义网络之间,容器默认无法互通,安全可控。
    3. 多网段:可以指定子网段(Subnet)、网关(Gateway)。
bash 复制代码
# 1. 创建自定义网络
docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 my-net 

# 2. 运行容器加入该网络
docker run -d --name nginx-custom --network my-net nginx

网络实战命令

bash 复制代码
# 1. 查看所有网络
docker network ls

# 2. 查看网络详情
docker network inspect 网络名/ID

# 3. 创建自定义网络
docker network create my-bridge-net

# 4. 运行容器并指定网络
docker run -d --name web1 --network my-bridge-net nginx

# 5. 将运行中的容器连接到新网络
docker network connect my-bridge-net web1
相关推荐
Free Tester36 分钟前
如何判断 LeakCanary 报告的严重程度
java·jvm·算法
炘爚39 分钟前
C++ 右值引用与程序优化
开发语言·c++
si莉亚1 小时前
ROS2安装EVO工具包
linux·开发语言·c++·开源
清心歌1 小时前
CopyOnWriteArrayList 实现原理
java·开发语言
Java成神之路-1 小时前
通俗易懂理解 Spring MVC 拦截器:概念、流程与简单实现(Spring系列16)
java·spring·mvc
zhanghongbin011 小时前
AI 采集器:Claude Code、OpenAI、LiteLLM 监控
java·前端·人工智能
良木生香1 小时前
【C++初阶】C++入门相关知识(2):输入输出 & 缺省参数 & 函数重载
开发语言·c++
计算机毕设vx_bysj68691 小时前
【免费领源码】77196基于java的手机银行app管理系统的设计与实现 计算机毕业设计项目推荐上万套实战教程JAVA,node.js,C++、python、大屏数据可视化
java·mysql·智能手机·课程设计
忘梓.1 小时前
墨色规则与血色节点:C++红黑树设计与实现探秘
java·开发语言·c++
hhh3u3u3u1 小时前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1