Docker 网络类型与容器通信
Docker 网络类型与容器通信
一、Docker 网络概述
Docker 在安装时会自动创建三种网络:
- none:无网络
- host:共享宿主机网络栈
- bridge:默认网络类型,通过
docker0
网桥连接
查看网络列表:
docker network ls
二、Docker 网络类型
1、None 网络
- 容器仅有一个
lo
回环接口,无外部网络连接 - 适用于高安全性、无需网络访问的场景。
[root@docker ~]# docker pull busybox
[root@docker ~]# docker run --name wil1 -it --rm --network=none busybox:latest
2、Host 网络
- 容器共享宿主机网络栈,性能最佳
- 存在端口冲突风险
[root@docker ~]# docker run --name wil1 -it --rm --network=host busybox:latest
3、Bridge 网络(默认)
- 容器通过
docker0
网桥连接 - 每个容器分配一个虚拟网卡(veth pair),一端在容器内,一端在
docker0
上
[root@docker ~]# docker run --name wil1 -it --rm busybox:latest
[root@docker ~]# docker network inspect bridge
三、自定义 Bridge 网络
1、创建自定义网络
[root@docker ~]# docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 wiltjer
[root@docker ~]# docker network ls
2、指定容器使用自定义网络和 IP
[root@docker ~]# docker run --name wil1 -it --rm --network=wiltjer busybox:latest
3、跨网络通信
- 默认不同网络的容器无法通信
[root@docker ~]# docker run --name wil1 -it --network=wiltjer busybox:latest
- 可通过
docker network connect
为容器添加多个网络
[root@docker ~]# docker network connect wiltjer wil2
[root@docker ~]# docker exec -it wil2 sh
四、容器间通信方式
1、基于 IP 地址
- 在同一网络中的容器可直接通过 IP 访问
- 案例如上
2、基于容器名(Docker DNS)
- 使用
--name
命名容器 - Docker 内嵌 DNS 服务自动解析容器名
- 仅支持自定义 bridge 网络,默认 bridge 不支持
[root@docker ~]# docker run --name wil1 -it --network=wiltjer busybox:latest
[root@docker ~]# docker run --name wil2 -it --network=wiltjer busybox:latest
3、Joined 容器
- 多个容器共享同一网络栈
- 可通过
127.0.0.1
互相访问
[root@docker ~]# docker run --name wil3 -it --network=wiltjer busybox:latest
[root@docker ~]# docker run --name wil4 -it --network=container:wil3 busybox:latest
五、容器与外部网络通信
1、容器访问外部(NAT)
- 容器通过
docker0
和宿主机 NAT 规则访问外网
2、外部访问容器
- 使用 host 网络:容器直接使用宿主机网络
- 端口映射:将容器端口映射到宿主机
[root@docker ~]# docker run --name tjer -itd -p 80:80 httpd:latest
六、总结
网络类型 | 特点 | 适用场景 |
---|---|---|
None | 无网络,只有 lo | 高安全、无需网络 |
Host | 共享宿主机网络栈,性能高 | 高性能、不介意端口冲突 |
Bridge(默认) | 通过 docker0 网桥连接 | 大多数容器场景 |
自定义 Bridge | 支持 DNS 解析、更灵活的网络管理 | 多容器协作、需名称解析 |