如何使docker容器使用主机的/ etc/hosts文件?

d3m*_*ing 43 docker

我想这样做,以便我启动的docker容器使用与/etc/hosts我运行的主机上相同的设置.有没有办法做到这一点?

我知道--add-hostdocker run 有一个选项,但这并不是我想要的,因为主机的/etc/hosts文件在不同的机器上可能会有所不同,因此对我来说硬编码确切的IP /主机并不好--add-host.

d3m*_*ing 62

使用--network=host在泊坞窗运行命令.这告诉Docker使容器使用主机的网络堆栈.您可以在此处了解更多信息:https://docs.docker.com/engine/userguide/networking/

  • 在许多情况下,主机网络(堆栈,群组......)根本不是一个选项. (7认同)
  • 虽然 --network=host 显然有助于解决这个问题,但每个使用此方法的人都应该**意识到**其他后果,例如一个简单的示例,它将映射并**打开 Dockerfile 中提到的所有端口到互联网**。 (6认同)
  • 如何在没有"主机"网络的Mac或Windows上运行? (2认同)
  • 强调 @OndraŽižka 的评论,“主机网络驱动程序仅适用于 Linux 主机,并且在 Docker Desktop for Mac、Docker Desktop for Windows 或 Docker EE for Windows Server 上不受支持。” (2认同)

PRI*_*LOP 16

您还可以通过以下命令将 dnsmasq 安装到主机:

sudo apt-get install dnsmasq
Run Code Online (Sandbox Code Playgroud)

然后您需要添加文件/etc/docker/daemon.json内容:

{
    "dns": ["host_ip_address", "8.8.8.8"],
}
Run Code Online (Sandbox Code Playgroud)

其中host_ip_address是启动 dnsmasq 的主机地址(例如 localhost)。

之后需要通过命令重启Docker服务sudo service docker restart

此选项强制对每个 Docker 容器使用主机 DNS 选项。或者您可以将其用于单个容器,并且此链接解释了命令行选项。还支持 docker-compose 选项(您可以通过此链接了解它)。


Vin*_*esh 14

添加标准主机文件 -

docker run -it ubuntu cat /etc/hosts
Run Code Online (Sandbox Code Playgroud)

添加服务器'foo'的映射 -

docker run -it --add-host foo:10.0.0.3 ubuntu cat /etc/hosts
Run Code Online (Sandbox Code Playgroud)

添加多个服务器的映射

docker run -it --add-host foo:10.0.0.3 --add-host bar:10.7.3.21 ubuntu cat /etc/hosts
Run Code Online (Sandbox Code Playgroud)

参考 - http://jasani.org/2014/11/19/docker-now-supports-adding-host-mappings/

  • 参考:在 docker-compose 文件中使用 `extra_hosts` https://docs.docker.com/compose/compose-file/#extra_hosts (2认同)

120*_*DEV 14

extra_hosts(在 docker-compose.yml 中)

https://docs.docker.com/compose/compose-file/

添加主机名映射。使用与 docker 客户端 --add-host 参数相同的值。

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"
Run Code Online (Sandbox Code Playgroud)


use*_*097 7

将其添加到您的运行命令中:

-v /etc/hosts:/etc/hosts
Run Code Online (Sandbox Code Playgroud)

  • 从一开始看起来这应该可行,但 Docker 容器的“/etc/hosts”文件是针对容器定制的,因此替换该文件会产生后果。 (16认同)
  • 这个对我有用。但是,当外部“/etc/hosts”更改时,容器内部不会自动更新。它需要重新启动才能更新。 (2认同)

161*_*903 7

如果使用docker-compose.yml,则相应的属性为:

services:
  xxx:
    network_mode: "host"
Run Code Online (Sandbox Code Playgroud)

资源


mar*_*olz 5

如果受信任的用户启动您的容器,您可以使用 shell 函数轻松“复制”/etc/hosts您需要的条目:

add_host_opt() { awk "/\\<${1}\\>/ {print \"--add-host $1:\" \$1}" /etc/hosts; }
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

docker run $(add_host_opt host.name) ubuntu cat /etc/hosts
Run Code Online (Sandbox Code Playgroud)

这样您就不必对 IP 地址进行硬编码。