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

时间:2015-08-18 17:51:28

标签: docker

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

我知道有一个--add-host选项与docker一起运行,但这并不是我想要的,因为主机的/etc/hosts文件可能在不同的机器上有所不同所以对我来说硬编码确切的IP并不好/ --add-host的主机。

10 个答案:

答案 0 :(得分:12)

添加标准主机文件 -

docker run -it ubuntu cat /etc/hosts

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

docker run -it --add-host foo:10.0.0.3 ubuntu cat /etc/hosts

为多台服务器添加映射

docker run -it --add-host foo:10.0.0.3 --add-host bar:10.7.3.21 ubuntu cat /etc/hosts

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

答案 1 :(得分:4)

将此添加到您的运行命令:

-v /etc/hosts:/etc/hosts

答案 2 :(得分:4)

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

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

然后你可以这样做:

docker run $(add_host_opt host.name) ubuntu cat /etc/hosts

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

答案 3 :(得分:3)

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

services:
  xxx:
    network_mode: "host"

Source

答案 4 :(得分:3)

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

df %>% 
  group_by(a) %>%
  mutate(d = first(c[b==1])) %>%
  ungroup()

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

sudo apt-get install dnsmasq

然后,您需要通过命令{ "dns": ["host_ip_address", "8.8.8.8"], }

重新启动Docker服务。

此选项强制为每个Docker容器使用主机DNS选项。 或者,您可以将其用于单个容器,命令行选项由this link解释。还支持docker-compose选项(您可以通过this link进行了解)。

答案 5 :(得分:1)

主机的/etc/hosts无法装入容器。但是您可以将文件夹安装到容器中。您需要一个dnsmasq容器。

  1. 主机上的新文件夹

    mkdir -p ~/new_hosts/
    
    ln  /etc/hosts ~/new_hosts/hosts
    
  2. 将〜/ new_hosts /装入容器

    docker run -it -v ~/new_hosts/:/new_hosts centos /bin/bash
    
  3. 配置dnsmasq使用/new_hosts/hosts来解析名称。

  4. 更改容器的dns服务器,使用dnsmasq容器的ip地址。

如果您在主机上更改/etc/hosts,则dnsmasq容器的/new_hosts/hosts将会更改。

我发现了一个问题:

  

dnsmasq容器/new_hosts/hosts中的文件可以更改。但是新主机无法解析。因为dnsmasq使用inotify监听更改事件。在主机上修改文件时。 dnsmasq无法收到    信号,所以它不更新配置。因此,您可能需要编写一个守护进程,以将/new_hosts/hosts的内容读取到另一个文件传输时间。并更改dnsmasq的配置以使用新文件。

答案 6 :(得分:0)

如果您正在运行用于运行docker容器的虚拟机,如果有您希望容器知道的主机(VM等),则根据您使用的VM软件,您必须确保存在主机上的条目(托管VM),用于您希望容器能够解析的任何机器。这是因为VM及其容器将在其resolv.conf中拥有(VM的)主机的IP

答案 7 :(得分:0)

IMO,在运行码头工具时传递--network=host选项是d3ming对其他选项建议的更好选择,如其他答案所示:

  1. 主机&etc / hosts中的任何更改都可立即使用 容器,这可能是你想要的,如果你有这样的 首先要求。
  2. 使用-v选项挂载主机&etc / hosts可能不是一个好主意,因为容器的任何意外更改都会破坏主机配置。

答案 8 :(得分:0)

额外的主机(在docker-compose.yml中)

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

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

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

答案 9 :(得分:-2)

这三个选项都对我有用。

  1. 使用主机的网络(--network=host
  2. 在Docker选项中使用 extra_hosts
  3. 将文件 / etc / hosts 从主机映射到容器