云中~头像
关注
Docker 网络详解:四大网络模式、端口映射、自定义网桥封面图

Docker 网络详解:四大网络模式、端口映射、自定义网桥

Docker :Docker 网络详解

适配 CSDN / 掘金博客,基于 CentOS 实验环境,实操 + 原理结合,承接上一章容器内容

0 本章学习总览

本章重点掌握 Docker 四大网络模式:bridgehostnonecontainer,理解默认网桥原理、自定义网桥、端口映射、容器之间互通、容器访问外网、外网访问容器。 核心命令:docker network系列命令、-p/-P端口映射参数。

一、Docker 网络基础概念

Docker 网络本质是在宿主机上创建虚拟网卡、网桥,实现容器之间、容器与外网之间通信。

  • 每启动一个容器,容器会分配独立 IP;
  • 宿主机上会生成veth虚拟网卡,一端在容器内,一端挂在 docker 网桥上;
  • 网桥相当于虚拟交换机,负责转发各个容器之间数据包。

docker network 常用命令

#查看所有docker网络
docker network ls

#查看网络详细信息
docker network inspect 网络名/网络ID

#创建自定义网桥
docker network create 网桥名

#删除网络
docker network rm 网络ID

#将容器连接到指定网络
docker network connect 网络名 容器名

#断开容器与网络
docker network disconnect 网络名 容器名

二、Docker 四种网络模式

表格

网络模式参数特点使用场景
bridge(默认网桥)--network bridgedocker 默认模式;容器独立 IP;宿主机创建 docker0 网桥;NAT 访问外网大部分普通容器,默认使用
host 模式--network host直接复用宿主机网络栈,没有独立隔离网络;容器 IP = 宿主机 IP;端口直接占用宿主机端口需要占用大量端口、追求网络性能
none 模式--network none关闭所有网络,容器无网卡无 IP,完全隔离安全场景,不需要网络访问的容器
container 模式--network container:容器ID复用另外一个容器的网络栈,共享 IP 和端口;两个容器网卡 IP 完全一样日志收集、代理容器,共享网络

1. bridge 默认网桥(docker0)

  • 启动容器不指定--network,默认使用 bridge,挂载到docker0网桥。
  • 原理:
  1. 创建一对 veth 虚拟网卡对;
  2. 一端放到容器内部,命名 eth0;
  3. 另一端挂接到宿主机 docker0 网桥;
  4. 通过 iptables 做 NAT,实现容器访问外网;

缺点:默认 docker0 网桥不支持容器名直接解析通信,不能用容器名字互相访问,只能靠 IP。

2. host 模式

容器直接使用宿主机网卡、IP、端口、路由表,没有网络隔离。 ⚠️注意:host 模式不需要做端口映射,容器监听端口直接就是宿主机端口。

docker run -d --name nginx-host --network host nginx

3. none 模式

容器内部只有 lo 回环网卡,没有外网网卡,完全断网。

docker run -it --network none ubuntu bash

4. container 共享网络模式

新容器复用已有容器的网络栈,两者 IP、端口完全一致,端口不能冲突

#先启动容器A
docker run -d --name c1 nginx
#容器c2复用c1的网络
docker run -it --name c2 --network container:c1 ubuntu bash

三、端口映射 -p /-P

实现外网访问容器内部服务,把宿主机端口映射到容器端口。

  1. -P(大写):随机宿主机端口映射容器 EXPOSE 声明的端口
docker run -d -P --name nginx1 nginx
  1. -p(小写)手动指定映射,支持多种格式
#宿主机8080端口映射容器80端口
docker run -d -p 8080:80 --name nginx2 nginx

#指定宿主机IP,只监听本机回环地址
docker run -d -p 127.0.0.1:8081:80 nginx

#指定协议udp
docker run -d -p 8082:80/udp nginx

查看端口映射:docker port 容器ID

四、自定义网桥(重点)

默认 docker0 网桥不支持 DNS 容器名解析;自定义网桥自带 DNS 服务,可以直接使用容器名字互相通信

创建自定义网桥

#创建自定义网桥my-bridge
docker network create my-bridge

特性:

  1. 同一自定义网桥下的容器,可以直接用容器名称互相访问;
  2. 支持自动 DNS 解析;
  3. 可以自定义网段;
  4. 容器可以同时加入多个网络。

示例:测试自定义网桥通信

#启动两个容器,指定使用自定义网桥
docker run -d --name web1 --network my-bridge nginx
docker run -it --name web2 --network my-bridge ubuntu bash

#在web2容器内,直接ping web1容器名字,能够解析通
ping web1

容器可以运行后再接入自定义网络:docker network connect my-bridge web1

五、容器通信场景总结

  1. 同一自定义网桥容器之间:直接容器名通信 ✅支持 DNS
  2. 同一默认 docker0 网桥容器之间:只能 IP 互通,不支持容器名 ❌
  3. 不同网桥的容器:默认不能直接互通;需要把容器同时加入同一个网桥
  4. 容器访问外网:bridge 模式下 iptables NAT 转发,宿主机能上网容器就可以上网
  5. 外网访问容器:做端口映射-p,或者 host 模式
  6. 宿主机访问容器:可以直接访问容器 IP,或者映射的宿主机端口

六、常见问题排错思路

  1. 容器能 ping 外网 IP,不能 ping 域名 → DNS 问题,可以给容器指定--dns
  2. 外部机器访问不了映射端口 → 检查防火墙、安全组、监听地址
  3. 容器之间 ping 不通 → 确认是否在同一个网桥,docker0 网桥不能用容器名访问
  4. host 模式端口冲突 → host 模式共享宿主机端口,不能端口重复占用

📝本章小结

  1. Docker 四种网络模式:bridge、host、none、container,默认 bridge;
  2. bridge 依靠 docker0 网桥 + veth pair 虚拟网卡实现容器网络;
  3. -p手动端口映射,-P随机端口映射;
  4. 自定义网桥最大优势:自带 DNS,支持容器名称直接通信
  5. host 模式无网络隔离,直接复用宿主机网络栈;none 完全断网;container 共享别的容器网络栈。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/Wzh5452830/article/details/165487726

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--