Docker 网络

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
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 
## 为容器的网卡
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 ~]# 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
## 创建容器,指定用自定义桥接模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值