Docker 默认网络和自定义网络区别

分类:Docker |

默认网络和自定义网络区别

默认的网卡的网卡驱动也是 bridge 模式的,用户自定义的网络也是 bridge 模式,但默认的网卡不可以使用别名进行 IP 地址解析呢

官方特意解释了这两个网卡的区别

User-defined bridges provide automatic DNS resolution between containers.
Containers on the default bridge network can only access each other by IP addresses, unless you use the --link option, which is considered legacy. On a user-defined bridge network, containers can resolve each other by name or alias.

翻译过来大意:就是用户自定义的网卡可以在容器之间提供自动的 DNS 解析,缺省的桥接网络上的容器只能通过 IP 地址互相访问,除非使用 --link 参数。在用户自定义的网卡上,容器直接可以通过名称或者别名相互解析。

文档中提到了 --link 参数,官方文档中已经不推荐使用 --link 参数,并且最终可能会被删除,所以最好不要使用 --link 参数来连接两个容器,并且它有多个缺点。

如果使用 --link 参数,需要在容器之间手动创建链接,这些链接需要双向创建,如果容器多于两个的话,将会很困难。或者也可以通过编辑 hosts 文件的方式来指定解析结果,但是这样将会非常难以调试。


image.png





别名:  

##释义
mysql.default.svc.cluster.local
mysql 是 service的名字  default 是命名空间  svc.cluster.local 是固定格式


参考: https://docs.orbstack.dev/docker/domains


以下转自 https://www.51cto.com/article/772521.html

云原生小技巧 :OrbStack — 本地 K8s 环境的域名映射优化,开发者的新宠


从传统的 DNS 解决方案,到现代的 OrbStack,我们见证了本地开发环境的巨大变革。通过 OrbStack,我们不仅提升了工作效率,还享受到了前所未有的便捷。无论是容器的即时访问,还是 Kind 集群的无缝连接,OrbStack 都展现了其强大的能力。

今天,我要介绍的这个新伙伴: OrbStack[2],它的 Slogan 是: Say goodbye to slow, clunky containers and VMs。不过,说实话,我最喜欢的还是它的 Local domain names 的能力,因为它是零配置的。

Container domain names

OrbStack 对待容器的态度可谓是亲(强)密(大)无间,它为每个容器赋予了一个独一无二的域名。

举个例子,假设我在本地启动了一个名为 getting-started 的容器,并将容器内的 80 端口映射到了本地的 3000 端口

复制

docker run -d -p 3000:80 --name getting-started docker/getting-started1.


下面是我本地容器运行的情况

图片图片

在以往,我需要通过 localhost + port 的方式来访问这个容器。

图片图片

现在呢?只需通过 OrbStack 分配的域名,我就可以畅通无阻地访问它,而且不需要指定端口,非常的丝滑。

图片图片

mDNS

通过一系列的命令和检查,我们可以看到 getting-started.orb.local 这个域名确实被解析到了容器的 IP 地址:192.168.215.3。

复制

➜ ping getting-started.orb.localPING getting-started.orb.local (192.168.215.3): 56 data bytes64 bytes from 192.168.215.3: icmp_seq=0 ttl=63 time=1.714 ms64 bytes from 192.168.215.3: icmp_seq=1 ttl=63 time=0.472 ms64 bytes from 192.168.215.3: icmp_seq=2 ttl=63 time=1.204 ms

➜ docker inspect getting-started \  -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'192.168.215.31.2.3.4.5.6.7.8.9.


我本机的 /etc/hosts 文件内容也没发生过变化,那么它是怎么做到的呢?我们先来看下系统的 DNS 配置信息。

复制

➜ scutil --dnsDNS configuration

resolver #1
  ...resolver #2
  domain   : local
  options  : mdns
  timeout  : 5
  flags    : Request A records
  reach    : 0x00000000 (Not Reachable)
  order    : 300000resolver #3
  ...1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.


在 scutil --dns 命令的输出中,resolver #2 部分的 options 字段包含 mdns,这表示该解析器配置用于处理 .local 域名的多播 DNS 查询。

mDNS 即多播 DNS(Multicast DNS[3])它是一种在本地网络上无需传统 DNS 服务器即可解析主机名的协议。这是 Bonjour(Apple 的实现)用来在本地网络上发现服务和主机名的一种机制。

复制

# 获取本地 getting-started.orb.local 域名的地址➜ dns-sd -G v4v6 getting-started.orb.localDATE: ---Sat 04 Nov 2023---
 9:52:21.350  ...STARTING...Timestamp     A/R  Flags         IF  Hostname                               Address                                      TTL 9:52:21.351  Add  40000003      18  getting-started.orb.local.             FD07:B51A:CC66:0000:A617:DB5E:C0A8:D703%<0>  300
 9:52:21.352  Add  40000002      18  getting-started.orb.local.             192.168.215.3                                300# 再查看特定主机的解析信息➜ dns-sd -Q getting-started.orb.localDATE: ---Sat 04 Nov 2023---
 9:55:31.664  ...STARTING...Timestamp     A/R  Flags         IF  Name                          Type   Class  Rdata 9:55:31.668  Add  40000002      18  getting-started.orb.local.    Addr   IN     192.168.215.31.2.3.4.5.6.7.8.9.10.11.12.13.14.


Cool...有了这个能力就非常赞了,我可以轻松地将我的本地 Mysql 连接调整成这个样子。

图片图片

自定义域名

OrbStack 允许用户自定义容器的域名,在启动容器时通过标签的方式方便的注入。

复制

docker run --rm -l dev.orbstack.domains=foobar.local docker/getting-started1.

正如上面提到的 OrbStack 是通过 mDNS 来实现域名到 IP 的解析,所以它只对 .local 这个 TLD 有效,在做自定义域名的时候需要注意下。

图片图片

Domain names

通过访问 http://orb.local 我们可以看到所有正在运行的容器链接。

图片图片

甚至可以在它的客户端上查看容器列表,单击信息图标获取。

图片图片

OrbStack + Kind

接下来,我们利用 Local domain names 的能力,重新部署下自签 TLS 证书的流程,看下和上次的分享有什么区别?

1. 获取集群的域名

通过 UI,获取到 Kind 集群的域名:local-control-plane.orb.local

图片图片

2. 创建 K8s TLS Secret

然后,我们利用 mkcert[4] 创建了一个通配符证书

复制

➜ mkcert '*.local-control-plane.orb.local'Created a new certificate valid for the following names