docker - docker-compose 主机名和本地解析
问题描述
hostname:
在使用指定主机名( )和 IP 地址( )的 docker-compose 文件创建 docker 容器时ipv4_address:
,我希望本地计算机(运行 docker 守护程序服务的计算机,也就是我的笔记本电脑)能够解析这些主机名,而无需需要(太多)人工干预。即,如果容器是一个带有 hostname 的网络服务器服务my_webserver
,我希望它my_werbserver
解析为我分配给该容器的 IP 地址。
实现这一目标的最佳方法是什么?有什么比手动维护笔记本电脑上的 /etc/hosts 更好的方法?
解决方案
正如@Kārlis Ābele 所提到的,我认为如果没有额外的服务,你就无法做你需要的事情。一种解决方案是在与其他 docker 容器相同的网络中的 docker 容器中运行dnsmasq 。请参阅使内部 DNS 服务器可从主机使用
docker run -d --name dns -p 53:53 -p 53:53/udp --network docker_network andyshinn/dnsmasq:2.76 -k -d
检查它是否可以localhost
用作 DNS
nslookup bar localhost
可选择设置localhost
为 DNS 服务器。例如,在 Ubutu 18.04 上,编辑/etc/resolvconf/resolv.conf.d/head
.
nameserver localhost
重新启动resolvconf
服务。
sudo service resolvconf restart
现在您应该可以按名称 ping 容器了。
已编辑:
另一种解决方案(基于@Kārlis Ābele 的回答)是收听 docker events 和 update /etc/hosts
。准系统实现:
#!/usr/bin/env bash
while IFS= read -r line; do
container_id=$(echo ${line}| sed -En 's/.*create (.*) \(.*$/\1 /p')
container_name=$(echo ${line}| sed -En 's/.*name=(.*)\)$/\1 /p')
ip_addr=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${container_id})
echo ${ip_addr} ${container_name} >> /etc/hosts
done < <(docker events --filter 'event=create')
推荐阅读
- javascript - 如何使用单击的选项卡设置 isActive 动态属性 React
- r - 闪亮应用中的多个 group_by
- .net - 没有这样的配置属性:“sasl.kerberos.kinit.cmd”
- json - 具有列表属性的杰克逊 JSON
- python - Tkinter OptionMenu 无法正确显示
- qt - QML PieSlice 渐变色
- prolog - 在 prolog 中编写一个程序,确定是否恰好存在三个值,使得它们的总和为 N
- reactjs - Socket.io 适用于 localhost 但不适用于 heroku 部署
- html - 为什么我对 CSS 网格布局的回退不起作用?
- c# - 从目录中检索选定的文件?