Docker 高级管理 —— 容器通信技术与数据持久化

本文基于官方文档与生产实践整理,包含原文全部命令 ,并补充底层原理、生产坑点、最佳实践、扩展命令,内容不与原文重复,适合学习与面试。


一、Docker 容器通信核心基础(补充知识点)

  1. **网络命名空间(NetNS)**Docker 每个容器默认拥有独立网络命名空间,实现网卡、IP、路由、iptables 完全隔离,是容器网络安全的底层基石。
  2. veth pair成对出现的虚拟网卡,一端在容器内为 eth0,一端挂在网桥,是容器与网桥通信的 "虚拟网线"。
  3. **虚拟网桥(Bridge)**相当于虚拟二层交换机,负责同一主机容器间转发,默认网桥名为 docker0。
  4. NAT 转发 容器访问外网用 SNAT,外部访问容器用 DNAT,必须开启宿主机 net.ipv4.ip_forward=1
  5. 服务发现 自定义 bridge 网络自带 DNS,容器可直接用容器名互相访问,无需记住 IP。

二、Docker 七大网络模式(含全部命令 + 原理 + 补充)

1. Bridge 模式(默认)

原理容器连接到 docker0 或自定义网桥,分配独立内网 IP,通过 NAT 访问外部,端口映射暴露服务。

命令(原文完整)

bash

运行

复制代码
# 查看默认网络
docker network ls

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

# 运行容器并加入自定义网络
docker run -itd --rm --name busybox1 --network my-net busybox sh -c 'while true;do echo hello;done'
docker run -it --rm --name busybox2 --network my-net busybox sh

# 容器内互访(直接用容器名)
ping busybox1

补充知识点

  • 默认网桥不支持 DNS,自定义网桥才支持 DNS 解析。
  • 端口映射 -p 本质是 iptables DNAT 规则,可用 iptables -t nat -vnL 查看。
  • 生产必须用自定义 bridge,不要用默认 docker0。

2. Host 模式

原理容器与宿主机共享网络命名空间,无独立 IP,无 NAT 损耗,性能最高,但隔离性差。

命令(原文完整)

bash

运行

复制代码
docker run -tid --net=host --name docker_host1 busybox
docker exec -it docker_host1 sh
ifconfig

补充知识点

  • 优点:网络性能接近物理机,适合高并发网关、监控代理。
  • 缺点:端口会冲突,容器无网络隔离,生产慎用
  • 适用:不需要多实例、追求极致性能的组件。

3. Container 模式

原理新容器共享指定容器的网络命名空间,IP、端口完全一致,通过 lo 通信。

命令(原文完整)

bash

运行

复制代码
# 创建 host1 容器
docker run -tid --name host1 busybox

# host2 共享 host1 网络
docker run -itd --net=container:host1 --name host2 busybox

# 验证网络一致
docker exec -it host1 ifconfig
docker exec -it host2 ifconfig

补充知识点

  • 典型场景:Sidecar 模式(业务容器 + 日志 / 监控 / 代理容器)。
  • 仅共享网络,文件系统、进程依然隔离。
  • 适合强耦合、本地通信的组件。

4. None 模式

原理仅拥有 lo 回环接口,无任何网络配置,最高安全隔离。

命令(原文完整)

bash

运行

复制代码
docker run -itd --net=none --name none01 busybox sh
docker exec -it none01 sh
ifconfig

补充知识点

  • 适用:离线加密计算、安全审计、不需要网络的批处理任务。
  • 可手动添加网卡、配置 IP,适合高度定制网络场景。

5. Overlay 模式(跨主机)

原理基于 VXLAN 封装,构建跨宿主机虚拟网络,用于 Swarm/K8s 集群容器互通。

命令(原文完整)

bash

运行

复制代码
# Swarm 集群中创建 overlay 网络
docker network create -d overlay my_overlay_network

# 创建服务并使用 overlay
docker service create --name my_service --network my_overlay_network nginx

补充知识点

  • 自带服务发现与负载均衡。
  • 跨主机通信无需端口映射,容器直接互通。
  • 性能略低(有封装损耗),是分布式架构标准方案。

6. Macvlan 模式

原理容器拥有独立 MAC 地址,直接连接物理网络,像真实物理机一样存在,无网桥转发。

命令(原文完整)

bash

运行

复制代码
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=ens33 \
my_macvlan_network

docker run -d --name my_macvlan_container --network my_macvlan_network nginx

补充知识点

  • 性能接近物理机,适合传统应用迁移、网络设备管理场景。
  • 宿主机与容器默认不能通信,需子接口或桥接 workaround。
  • 需要物理交换机开启混杂模式。

7. 自定义网络(高级)

命令(原文完整)

bash

运行

复制代码
# 指定子网、网关
docker network create \
--subnet=172.21.0.0/16 \
--gateway=172.21.0.1 \
my_custom_network

# 容器加入自定义网络
docker run -d --name my_container --network my_custom_network nginx

补充高级参数

bash

运行

复制代码
# 内部网络(禁止访问外网)
docker network create --internal my_internal_net

# 可附加网络(运行后容器也能加入)
docker network create --attachable my_attachable_net

# 指定 IP 范围
docker network create \
--subnet=172.30.0.0/16 \
--gateway=172.30.0.1 \
--ip-range=172.30.1.0/24 \
my_ip_range_net

三、端口映射(完整命令 + 补充)

1. 两种映射方式

-P(大写,随机映射)

bash

运行

复制代码
docker run --rm -d -P nginx
docker ps  # 查看宿主机随机端口 32768+
  • 自动映射 EXPOSE 端口,适合测试,生产不推荐

-p(小写,指定映射)

bash

运行

复制代码
# 固定映射
docker run --rm -d -p 8080:80 nginx

# 宿主机随机端口
docker run --rm -d -p 80 nginx

# 多端口映射
docker run -d -p 80:80 -p 443:443 nginx

补充知识点

  • 格式:[宿主机IP]:宿主机端口:容器端口
  • 宿主机端口范围建议:32768~61000
  • 端口冲突会导致容器启动失败
  • 可加 /udp 指定 UDP 端口:-p 53:53/udp

四、容器互联(弃用方案 + 推荐方案)

1. --link(已弃用,原文命令)

bash

运行

复制代码
docker run -dit --name web01 centos:7
docker run -dit --name web02 --link web01:myweb01 centos:7
docker exec -it web02 cat /etc/hosts
ping myweb01

补充知识点

  • 单向连接,重启容器 IP 变化会失效
  • Docker 官方已明确废弃,不要在生产使用

2. 自定义网络互联(官方推荐)

bash

运行

复制代码
# 创建网络
docker network create my_net

# 容器加入同一网络即可互通
docker run -dit --name pc01 --net my_net centos:7
docker run -dit --name pc02 --net my_net centos:7

# 测试互通(直接用容器名)
docker exec -it pc01 ping pc02

五、Docker 数据持久化 ------ 数据卷(全部命令 + 深度补充)

1. 数据卷核心原理(补充)

  • 容器可写层删除即丢数据,数据卷绕过 UnionFS,直接映射宿主机目录。
  • 生命周期独立于容器,容器删了卷还在。
  • 支持多容器共享、高性能 I/O、方便备份迁移。

2. 匿名数据卷(原文命令)

bash

运行

复制代码
docker run -dit -v /data1 -v /data2 --name web04 centos:7
docker exec -it web04 /bin/bash
  • 宿主机路径:/var/lib/docker/volumes/xxx/_data
  • 适合临时缓存,管理不便

3. 具名数据卷(生产推荐,原文命令)

bash

运行

复制代码
docker volume create my_volume
docker run -d -v my_volume:/data --name nginx01 nginx

补充命令

bash

运行

复制代码
# 查看卷列表
docker volume ls

# 查看卷详情
docker volume inspect my_volume

# 删除卷
docker volume rm my_volume

4. 共享数据卷 --volumes-from(原文命令)

bash

运行

复制代码
docker run -dit --volumes-from web04 --name web05 centos:7
  • 继承另一容器所有挂载,适合数据共享、备份容器。

5. 挂载宿主机目录(Bind Mount,原文命令)

bash

运行

复制代码
# 目录挂载
docker run -dit -p 8081:80 -v /data1:/usr/local/apache2/htdocs --name web06 httpd
echo "ni hao" > /data1/index.html
curl 宿主机IP:8081

# 多目录+文件挂载
mkdir -p /www/{conf,html,log}
docker run -d -p 9090:80 \
-v /www/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /www/html:/usr/share/nginx/html \
-v /www/log:/var/log/nginx \
--name web07 nginx

补充知识点

  • 必须用绝对路径,相对路径会创建成匿名卷。
  • 挂载文件时宿主机必须先存在,否则会被创建成目录。
  • 生产建议:配置文件只读挂载 :ro,防止容器篡改。

六、数据卷高级补充(生产必备)

1. 三种挂载方式对比

表格

方式 管理方 路径 适用场景
数据卷 Volume Docker /var/lib/docker/volumes 生产数据库、持久数据
绑定挂载 Bind 用户 任意绝对路径 开发调试、配置文件
tmpfs 挂载 内存 内存 临时机密数据、高吞吐

2. 权限与安全(补充)

bash

运行

复制代码
# 只读挂载(关键配置)
docker run -d -v my_volume:/data:ro nginx

# 指定用户权限(避免权限异常)
docker run -d --user 1000 -v /host/path:/container/path nginx

3. 备份与恢复(补充)

bash

运行

复制代码
# 备份卷
docker run --rm -v my_volume:/src -v $(pwd):/backup busybox tar -czf /backup/vol.tar.gz /src

# 恢复卷
docker run --rm -v my_new_volume:/dst -v $(pwd):/backup busybox tar -xzf /backup/vol.tar.gz -C /dst

4. 卷清理(补充)

bash

运行

复制代码
# 查看无用卷
docker volume ls -f dangling=true

# 清理无用卷
docker volume prune

# 全盘清理
docker system prune --volumes

七、生产最佳实践总结(独家补充)

  1. 网络最佳实践
  • 单主机用自定义 bridge ,跨主机用 Overlay
  • 高性能用 Macvlan ,高安全用 None
  • 永远不用 --link,永远不用默认 docker0。
  1. 数据持久化最佳实践
  • 数据库、用户上传用具名数据卷
  • 配置文件用绑定挂载 + 只读
  • 临时敏感数据用 tmpfs
  • 定期备份卷,禁止依赖容器存储。
  1. 安全与运维
  • 宿主机开启 ip_forward,配置 iptables 规则。
  • 端口只映射必要端口,避免大范围暴露。
  • 日志使用卷挂载或日志驱动,防止磁盘爆满。

八、本章核心速记

  • 网络:命名空间隔离 + 网桥转发 + NAT 访问外网 + 自定义网络实现服务发现。
  • 模式:Bridge/Host/Container/None/Overlay/Macvlan 六大模式各司其职。
  • 端口-p 固定映射,-P 随机映射,生产用 -p
  • 持久化:数据卷独立生命周期,Volume 生产首选,Bind 开发首选。
  • 互联:自定义网络 > --link,容器名直接访问。
相关推荐
乐hh1 小时前
DM8配置SSL
数据库·docker·ssl
极客先躯2 小时前
高级java每日一道面试题-2025年12月05日-实战篇[Dockerj]-Docker 安装后的默认存储路径是什么?如何修改?
java·docker·默认存储路径在不同系统上的区别·linux overlay2·修改存储路径的理论方法·修改流程中的关键理论点
凤舞飘伶2 小时前
windows安装docker-desk
windows·docker·容器
运维全栈笔记2 小时前
Docker一键部署Immich:自建私有云相册,照片视频备份无忧
linux·服务器·网络·docker·容器
bukeyiwanshui4 小时前
20260508 docker教案
运维·docker·容器
zhuxiaohai686 小时前
ubuntu24.04安装docker(国内加速方法)
运维·docker·容器
用户6757049885026 小时前
90%的人都不知道:Docker 容器 apt 报错 404 的幕后黑手竟是它!
后端·docker·容器
leoZ2316 小时前
项目改造为 Docker 容器使用指南
运维·docker·容器
灰灰老师6 小时前
Ubuntu 24.04 使用 Nginx + Docker Tomcat9 + HTTPS 完整部署教程
nginx·ubuntu·docker