You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

40 lines
2.1 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# docker
## Docker四种网络模式?
Docker网络模式 | 配置 | 说明
--- | --- | ---
host模式 | net=host | 容器和宿主机共享Network namespace。该模式下容器是不会拥有自己的ip地址而是**使用宿主机的ip地址和端口**。这种模式的好处就是**网络性能比桥接模式的好**。**缺点就是会占用宿主机的端口,网络的隔离性不太好**。
container模式 | net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。kubernetes中的pod就是多个容器共享一个Network namespace。
none模式 | net=none | 容器有独立的Network namespace但并没有对其进行任何网络设置如分配veth pair 和网桥连接配置IP等。没有IP地址无法连接外网一般用于测试
bridge模式 | net=bridge | (默认为该模式)
## Docker的bridge网络是如何工作的以及如何进行内外网络通信的
Docker容器创建时候默认会连接到docker0这个虚拟网桥(172.17.0.1)并从docker0子网中分配一个IP给容器使用并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备Docker将veth pair设备的一端放在新创建的容器中并命名为eth0容器的网卡另一端放在主机中以vethxxx这样类似的名字命名并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
![](https://static.cyub.vip/images/202107/docker-bridge.webp)
**如何与外部通信?**
![](https://static.cyub.vip/images/202107/docker-bridge-flow.png)
1. busybox 发送 ping 包172.17.0.2 > www.baidu.com。
docker0 收到包,发现是发送到外网的,交给 NAT 处理。
2. NAT 将源地址换成 enp0s3 的 IP10.0.2.15 > www.bing.com。
3. ping 包从 enp0s3 发送出去,到达 www.bing.com。
**外部世界如何访问容器?**
一句话就是**端口映射**。
1. docker-proxy 监听 host 的 32773 端口。
2. 当 curl 访问 10.0.2.15:32773 时docker-proxy转发给容器 172.17.0.2:80。
3. httpd 容器响应请求并返回结果。