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
相关推荐
测试员周周4 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
Mahir086 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
杜子不疼.6 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号36 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
sycmancia7 小时前
Qt——编辑交互功能的实现
开发语言·qt
RyFit7 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码7 小时前
C++ 内存分区 堆区
java·开发语言·c++
绝知此事8 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海8 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠8 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git