我想这样做,以便我启动的docker容器使用与我运行的主机上相同的/etc/hosts
设置。有没有办法做到这一点?
我知道有一个--add-host
选项与docker一起运行,但这并不是我想要的,因为主机的/etc/hosts
文件可能在不同的机器上有所不同所以对我来说硬编码确切的IP并不好/ --add-host
的主机。
答案 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)
答案 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容器使用主机DNS选项。 或者,您可以将其用于单个容器,命令行选项由this link解释。还支持docker-compose选项(您可以通过this link进行了解)。
答案 5 :(得分:1)
主机的/etc/hosts
无法装入容器。但是您可以将文件夹安装到容器中。您需要一个dnsmasq容器。
主机上的新文件夹
mkdir -p ~/new_hosts/
ln /etc/hosts ~/new_hosts/hosts
将〜/ new_hosts /装入容器
docker run -it -v ~/new_hosts/:/new_hosts centos /bin/bash
配置dnsmasq使用/new_hosts/hosts
来解析名称。
更改容器的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
对其他选项建议的更好选择,如其他答案所示:
答案 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)
这三个选项都对我有用。
--network=host
)