本文基于官方文档与生产实践整理,包含原文全部命令 ,并补充底层原理、生产坑点、最佳实践、扩展命令,内容不与原文重复,适合学习与面试。
一、Docker 容器通信核心基础(补充知识点)
- **网络命名空间(NetNS)**Docker 每个容器默认拥有独立网络命名空间,实现网卡、IP、路由、iptables 完全隔离,是容器网络安全的底层基石。
- veth pair成对出现的虚拟网卡,一端在容器内为 eth0,一端挂在网桥,是容器与网桥通信的 "虚拟网线"。
- **虚拟网桥(Bridge)**相当于虚拟二层交换机,负责同一主机容器间转发,默认网桥名为 docker0。
- NAT 转发 容器访问外网用 SNAT,外部访问容器用 DNAT,必须开启宿主机
net.ipv4.ip_forward=1。 - 服务发现 自定义 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
七、生产最佳实践总结(独家补充)
- 网络最佳实践
- 单主机用自定义 bridge ,跨主机用 Overlay。
- 高性能用 Macvlan ,高安全用 None。
- 永远不用
--link,永远不用默认 docker0。
- 数据持久化最佳实践
- 数据库、用户上传用具名数据卷。
- 配置文件用绑定挂载 + 只读。
- 临时敏感数据用 tmpfs。
- 定期备份卷,禁止依赖容器存储。
- 安全与运维
- 宿主机开启
ip_forward,配置 iptables 规则。 - 端口只映射必要端口,避免大范围暴露。
- 日志使用卷挂载或日志驱动,防止磁盘爆满。
八、本章核心速记
- 网络:命名空间隔离 + 网桥转发 + NAT 访问外网 + 自定义网络实现服务发现。
- 模式:Bridge/Host/Container/None/Overlay/Macvlan 六大模式各司其职。
- 端口 :
-p固定映射,-P随机映射,生产用-p。 - 持久化:数据卷独立生命周期,Volume 生产首选,Bind 开发首选。
- 互联:自定义网络 > --link,容器名直接访问。