docker 的镜像是令人称道的地方,但网络功能还是相对薄弱的部分
docker 安装后会自动创建 3 种网络: bridge 、 host 、 none
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8449dcc26e5e bridge bridge local
0bb7a7894546 host host local
882e4785cc3b none null local
NETWORK ID NAME DRIVER SCOPE
8449dcc26e5e bridge bridge local
0bb7a7894546 host host local
882e4785cc3b none null local
docker 原生 bridge 网路
docker 安装时会创建一个名为 docker0 的 Linux bridge ,新建的容器会自动桥接到这个接口。
# 这里不止一个IP是因为我额外添加了。

- bridge模式下容器没有一个公有ip(所有容器通过docker0上网),只有宿主机可以直接访问,外部主机是不可见的。
- 容器通过宿主机的NAT规则后可以访问外网。
[root@docker ~]# docker run -d --name web -p 80:80 nginx:1.23
46ab6a919212a9b7a69967233495d2d0b4872a550823030363f6283a755f2152
[root@docker ~]# ifconfig
46ab6a919212a9b7a69967233495d2d0b4872a550823030363f6283a755f2152
[root@docker ~]# ifconfig
## 为容器的网卡

docker0 -->Docker的桥接接口,相当于一个路由器对容器开放的接口;容器的网络要和docker0进行通信,docker0把数据都收进来,在从宿主机IP的接口出去。宿主机就相当于一个路由器,docker0对内网(这里指容器)的接口,宿主机的桥接接口为外网接口。
docker0 通过内核路由net.ipv4.ip_forward=1 与宿主机IP的接口通信。
grubby --update-kernel ALL --args iptables=true #做这个实验建议:意图是在所有已安装的 Linux 内核的启动参数中添加
iptables=true
这个参数。rhel9默认参数是nftables。 # 查看火墙规则 [root@docker harbor]# nft list ruleset / iptables -nL

## 运行一个容器并指定网络模式为桥接

##没ping通,一看发现docker0没有IP
[root@docker ~]# vim /etc/docker/daemon.json
[root@docker ~]#
[root@docker ~]# cat /etc/docker/daemon.json
{
"registry-mirrors":["https://reg.folian.org"]
}
[root@docker ~]#
[root@docker ~]#
[root@docker ~]# cat /etc/docker/daemon.json
{
"registry-mirrors":["https://reg.folian.org"]
}
[root@docker ~]#
[root@docker ~]# systemctl restart docker ## 暂时不太明白,但是进过这个操作,docker0有了IP


## 查看网关:docker0的IP

## 把172.17.0.0/16网段做地址伪装 masquerade

# bridge网络:把宿主机当做路由器,docker0负责接收所有容器的请求,通过内核路由功能到达宿主机ens160(在这个实验中),然后做地址伪装,伪装成ens160的IP(在这个实验中为172.25.254.5)。
## 如果把 masquerade停了容器还能上网吗?---能。因为docker有一个代理。后续说!
【docker 原生网络 host】
host 网络模式需要在容器创建时指定 --network=host
host 模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。

【docker 原生网络 none】
none 模式是指禁用网络功能,只有 lo 接口,在容器创建时使用
--network=none 指定。

docker 的自定义网络
自定义网络模式, docker 提供了三种自定义网络驱动:
bridge
overlay
macvlan
bridge 驱动类似默认的 bridge 网络模式,但增加了一些新的功能,
overlay 和 macvlan 是用于创建跨主机网络
建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动 DNS 解析容器名称到 IP 地址。
【自定义桥接网络】
在建立自定以网络时,默认使用桥接模式
自定义桥接与原生桥接区别:自定义桥接有DNS模块,默认桥接没有。作用?
有原生桥接为什么还有设置自定桥接?因为docker容器开启的顺序会影响IP,IP在变化的,所以用IP通信是有问题的,那只能用容器的名字name进行通信,因为容器名指定了就不会自动变,但是原生bridge网络没有DNS解析。
# 默认通过这个方式创建网络是桥接,也可以指定其他模式,需要添加参数 -d
[root@docker ~]# docker network create mynet1

## 创建容器,指定用自定义桥接模式

