从桥接模式切换到主机模式然后返回时,Docker 是否会保留容器中物理 /etc/resolv.conf 中的 resolv.conf?
Does Docker persist the resolv.conf from the physical /etc/resolv.conf in the container when switching from bridge mode to host mode and then back?
我正在做一个测试,我安装了 Docker 版本 20.10.8,在一台没有安装 Docker 的机器上构建 3967b7d,然后部署了一个 .tar Docker 容器的文件到这台新机器。
我然后 运行 Docker 容器,但没有在“docker 运行”命令行中包含“--network”参数,当dockerized 应用程序 tarted,它无法解析它使用的一些主机名,我在 dockerized 应用程序日志中看到“UnknownHostException”异常。
因此,为了让 docker 化的应用程序达到 运行,我执行了相同的“docker 运行”命令,但这次,我添加了一个“ --网络主机”参数。当应用程序运行时tar,它就能够 DNS 解析主机名,我再也没有遇到“UnknownHostException”异常。
随后,我多次执行“docker stop”、“docker rm”和“docker 运行”命令进行其他测试,但我想尝试调查“UnknownHostException”问题,所以我最终做了“docker stop”、“docker rm”,然后是“docker 运行”命令,但是没有“--network”参数,我期待再次看到“UnknownHostException”,但“UnknownHostException”异常不再出现,即使容器正在使用 Docker BRIDGE 网络!!!
我一直在努力 understand/figure 弄清楚“为什么?”有一段时间,但后来我检查了 /var/lib/containers/ 并注意到该目录中有一个“resolv.conf”,并发现该“[=46”的内容=]" 文件与物理机 /etc/resolv.conf!!
的内容相同
所以我的理论是:
a) 当我最初执行没有 "--network" 参数的 "docker 运行" 时,容器内的 "resolv.conf" 是空的(或一些默认),然后
b) 当我使用“--network host”执行“docker 运行”时,Docker 将物理 /etc/resolv.conf 复制到容器的“resolv.conf”,但是
c) 当我执行“docker 运行”但没有任何“--network”参数(即桥接网络)时,容器的“resolv.conf”retained/persisted/didn没有被清除。
任何人都可以确认上述行为是否正在发生?
此外,正如我之前提到的,在我执行“docker 运行”之前,我一直在执行“docker stop”和“docker rm”,但是我应该使用其他一些命令(或参数)来防止容器“resolv.conf”在从桥接模式切换到主机模式然后返回桥接模式时持续存在吗?
对于这个较长的问题,我深表歉意,但我正在努力尽可能清楚地解释我的问题。
提前致谢!!!
吉姆
Docker 完全管理容器内的 /etc/resolv.conf
,以及网络环境的大部分其他细节。如果图像中有 resolv.conf
文件,则它已隐藏且未被使用。如果您需要覆盖 DNS 解析器,可以使用 docker run --dns
option。
您应该几乎总是使用与您 docker network create
d 的网络名称相匹配的 --net
来调用 docker run
。省略 --net
选项会使用非常有限的 first-generation Docker 网络设置; --net=host
完全禁用 Docker 网络。网络本身没有任何 DNS-related 设置。
# does not need any options but does need to be created
docker network create a-network
docker run --net=a-network --dns=8.8.8.8 ...
我正在做一个测试,我安装了 Docker 版本 20.10.8,在一台没有安装 Docker 的机器上构建 3967b7d,然后部署了一个 .tar Docker 容器的文件到这台新机器。
我然后 运行 Docker 容器,但没有在“docker 运行”命令行中包含“--network”参数,当dockerized 应用程序 tarted,它无法解析它使用的一些主机名,我在 dockerized 应用程序日志中看到“UnknownHostException”异常。
因此,为了让 docker 化的应用程序达到 运行,我执行了相同的“docker 运行”命令,但这次,我添加了一个“ --网络主机”参数。当应用程序运行时tar,它就能够 DNS 解析主机名,我再也没有遇到“UnknownHostException”异常。
随后,我多次执行“docker stop”、“docker rm”和“docker 运行”命令进行其他测试,但我想尝试调查“UnknownHostException”问题,所以我最终做了“docker stop”、“docker rm”,然后是“docker 运行”命令,但是没有“--network”参数,我期待再次看到“UnknownHostException”,但“UnknownHostException”异常不再出现,即使容器正在使用 Docker BRIDGE 网络!!!
我一直在努力 understand/figure 弄清楚“为什么?”有一段时间,但后来我检查了 /var/lib/containers/
所以我的理论是:
a) 当我最初执行没有 "--network" 参数的 "docker 运行" 时,容器内的 "resolv.conf" 是空的(或一些默认),然后
b) 当我使用“--network host”执行“docker 运行”时,Docker 将物理 /etc/resolv.conf 复制到容器的“resolv.conf”,但是
c) 当我执行“docker 运行”但没有任何“--network”参数(即桥接网络)时,容器的“resolv.conf”retained/persisted/didn没有被清除。
任何人都可以确认上述行为是否正在发生?
此外,正如我之前提到的,在我执行“docker 运行”之前,我一直在执行“docker stop”和“docker rm”,但是我应该使用其他一些命令(或参数)来防止容器“resolv.conf”在从桥接模式切换到主机模式然后返回桥接模式时持续存在吗?
对于这个较长的问题,我深表歉意,但我正在努力尽可能清楚地解释我的问题。
提前致谢!!!
吉姆
Docker 完全管理容器内的 /etc/resolv.conf
,以及网络环境的大部分其他细节。如果图像中有 resolv.conf
文件,则它已隐藏且未被使用。如果您需要覆盖 DNS 解析器,可以使用 docker run --dns
option。
您应该几乎总是使用与您 docker network create
d 的网络名称相匹配的 --net
来调用 docker run
。省略 --net
选项会使用非常有限的 first-generation Docker 网络设置; --net=host
完全禁用 Docker 网络。网络本身没有任何 DNS-related 设置。
# does not need any options but does need to be created
docker network create a-network
docker run --net=a-network --dns=8.8.8.8 ...