我希望能够使我的Docker容器使用与运行主机相同的 /etc/hosts
设置。有没有方法可以做到这一点?
我知道有一个 --add-host
选项可用于 docker run
,但这并不是我想要的,因为不同的主机可能有不同的 /etc/hosts
文件,所以使用 --add-host
硬编码精确的IP地址/主机名称并不理想。
我希望能够使我的Docker容器使用与运行主机相同的 /etc/hosts
设置。有没有方法可以做到这一点?
我知道有一个 --add-host
选项可用于 docker run
,但这并不是我想要的,因为不同的主机可能有不同的 /etc/hosts
文件,所以使用 --add-host
硬编码精确的IP地址/主机名称并不理想。
在docker run
命令中使用--network=host
。这会告诉Docker让容器使用主机的网络堆栈。您可以在这里了解更多。
添加一个标准的hosts文件 -
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
参考资料 - Docker现在支持添加主机映射
--add-host
选项与 docker run
命令 https://docs.docker.com/engine/reference/commandline/run/#add-entries-to-container-hosts-file---add-host - nakamumeextra_hosts
https://docs.docker.com/compose/compose-file/#extra_hosts - nakamumeextra_hosts
(在docker-compose.yml中)
https://github.com/compose-spec/compose-spec/blob/master/spec.md#extra_hosts
添加主机名映射。使用与docker客户端--add-host
参数相同的值。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
将以下内容添加到您的运行命令中:
-v /etc/hosts:/etc/hosts
/etc/hosts
文件是为容器量身定制的,因此替换该文件会产生影响。 - StampyCode/etc/hosts
被更改时,容器内部不会自动更新。需要重新启动才能更新。 - dashohoxha/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地址了。
/etc/hosts
文件无法挂载到容器中。但是您可以将一个文件夹挂载到容器中。并且您需要一个dnsmasq容器。"最初的回答"
A new folder on host machine
mkdir -p ~/new_hosts/
ln /etc/hosts ~/new_hosts/hosts
mount the ~/new_hosts/ into container
docker run -it -v ~/new_hosts/:/new_hosts centos /bin/bash
Config dnsmasq use /new_hosts/hosts
to resolve name.
Change your container's DNS server. Use the dnsmasq container's IP address.
/etc/hosts
文件,则dnsmasq容器的/new_hosts/hosts
将随之更改。"最初的回答"dnsmasq容器中的文件
/new_hosts/hosts
可能会更改。但是新的主机无法解析。因为dnsmasq
使用inotify
监听更改事件。当您在主机上修改文件时,dnsmasq
无法接收到信号,因此不会更新配置。因此,您需要编写守护进程来读取/new_hosts/hosts
文件内容并将其每次写入另一个文件。并更改dnsmasq
配置以使用新文件。
-v /etc/hosts:/etc/hosts:ro
。 - Akom
/etc/hosts
(间接地)。我曾经遇到过同样的情况,我的解决方案是编辑/etc/docker/daemon.json
以指向一个简单的DNS代理,该代理读取/etc/hosts
。 - Ondra Žižka