Docker user defined Bridge DNS 不自动继承问题
因为在NAS上自托管了非常多的服务,而其中很多服务都依赖与Docker部署,但是很多服务需要使用代理服务器,于是学习一下docker的网络相关知识。
docker的网络大致是这样的,在docker中的每一个container都会默认分配到自己的本地网络ip,和宿主机器和其他的container是相互之间隔离的
在Linux中,有如下几种网络模式:
| Driver | Description |
|---|---|
| bridge | The default network driver. |
| host | Remove network isolation between the container and the Docker host. |
| none | Completely isolate a container from the host and other containers. |
| overlay | Swarm Overlay networks connect multiple Docker daemons together. |
| ipvlan | Connect containers to external VLANs. |
| macvlan | Containers appear as devices on the host's network. |
在这里介绍最常用的两种:
Bridge
分为用户自定义(user defined) 和 默认 (default) 两种bridge,一般用户自定义的bridge更加灵活,使用自定义bridge可以使得各个相互独立的容器之间可以通过内部的ip相互访问(是不需要暴露端口的)

AI总结的区别:
| 特性 | 默认 bridge 网络 | 用户自定义 bridge 网络 |
|---|---|---|
| DNS服务发现 | 不支持。容器间只能通过IP地址通信,但容器的IP可能会变化,导致连接不稳定。 | 支持。容器间可以直接用容器名称(如 db)或网络别名通信,由Docker内置DNS自动解析。 |
| 连接与断开 | 不灵活。容器一旦创建,网络即固定。要更换网络,必须停止、删除容器后,用新参数重建。 | 非常灵活。可以在容器运行期间,随时使用命令动态地连接或断开网络。 |
| 隔离性 | 较弱。所有未指定网络的容器都默认加入此网络,无关的服务间存在意外通信的风险。 | 强。每个用户网络都是独立的隔离环境,只有连接到同一个自定义网络的容器才能互相通信。 |
| 端口映射 | 需显式使用 -p 暴露端口。 | 同一网络内的容器默认互通所有端口;如需对外暴露,仍可用-p。 |
Host
容器和宿主之间共享网络空间命名空间,也就是容器没有自己的ip,容器的本地地址就是127.0.0.1,当然这会遇到很多问题,虽然有沙盒的隔离性但是对于端口管理上可能会出现冲突。

MyQuestion
实际配置的时候遇到了一个非常离谱的问题:在配置本地服务的时候DNS不会自动继承宿主机的dns服务器配置。
问题具体如下:
配置了一个docker服务,包含了frontend, backend, db, 和 redies 服务这几个服务通过 user defined bridge相互访问,而服务需要使用代理网络从国外的服务器api获取信息。
发现宿主机器可以访问代理服务器,可是容器内无法访问服务器,但是我的服务器是通过ip地址访问的,按理来说是不会触发DNS,但是经过查询有的时候ip地址也会自动强制触发DNS,需要配置DNS服务器。检查过后确实容器内没有自动继承宿主机的DNS服务器配置,需要在Docker-compose的配置中添加dns服务器:
dns:
- 8.8.8.8
- 114.114.114.114随后在代理服务器的后台看到了连接消息问题解决。
这个问题确实挺烦人的但是学到了
本文由 Leafking 原创
采用 CC BY-NC-SA 4.0 协议进行许可
转载请注明出处:http://blog.leafkingofficial.top/index.php/archives/14/
相关推荐
- 暂无相关推荐,看看别的吧。
0 评论