docker编写主机名和本地解析

docker编写主机名和本地解析,docker,docker-compose,Docker,Docker Compose,当使用指定主机名(hostname:)和ip地址(ipv4\u地址:)的docker compose文件创建docker容器时,我希望本地计算机(运行docker daemon服务的计算机,也称为我的笔记本电脑)能够解析这些主机名,而无需(过多)手动干预。也就是说,如果容器是主机名为my_webserver的Web服务器服务,我希望该my_webserver解析为我分配给该容器的IP地址 实现这一目标的最佳方式是什么?有什么比在我的笔记本电脑上手动维护/etc/hosts更好的吗?如果没有一些自

当使用指定主机名(
hostname:
)和ip地址(
ipv4\u地址:
)的docker compose文件创建docker容器时,我希望本地计算机(运行docker daemon服务的计算机,也称为我的笔记本电脑)能够解析这些主机名,而无需(过多)手动干预。也就是说,如果容器是主机名为my_webserver的Web服务器服务,我希望该
my_webserver
解析为我分配给该容器的IP地址


实现这一目标的最佳方式是什么?有什么比在我的笔记本电脑上手动维护/etc/hosts更好的吗?

如果没有一些自定义服务正在侦听Docker守护进程上的事件,这似乎是不可能的

我将如何做到这一点,是编写一个简单的服务来侦听Docker事件()并相应地更新/etc/hosts文件


除此之外,如果不手动更新hosts文件,我认为没有其他选择。

正如@KārlisĀbele所提到的,如果没有额外的服务,我不认为您可以做您需要的事情。一种解决方案是在与其他docker容器相同的网络中的docker容器中运行。看

检查它是否使用
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事件并更新
/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')
#/usr/bin/env bash
而IFS=读取-r行;做
容器id=$(echo${line}sed-En的/*create(.*)\(.*$/\1/p'))
容器名称=$(echo${line}sed-En的/*名称=(.*)\)$/\1/p')
ip_addr=$(docker inspect-f'{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}'${container_id})
echo${ip\u addr}${container\u name}>>/etc/hosts

完成<我想你需要检查分解器>谢谢Matthieu。这看起来并不能帮助我从笔记本电脑本身解决问题。这些选项有助于控制如何从容器中解析主机名。您只需在
/etc/hosts
exp:
my_werbserver localhost
中输入一个条目,就可以连接任何ip,当然你需要用你的本地端口调用
my_werbserver
。@LinSel谢谢,我正在尝试实现这一点,而不需要手动编辑/etc/hosts,因为如果我重命名服务或更改IP地址,我不想手动更新。这听起来很有希望,我会尝试一下,稍后再报告,谢谢@b0gusbYou将无法通过定义的
主机名:
访问容器。使用服务名称或设置
容器名称:
。看,是的,我让它开始工作了。使用NetworkManager在Fedora上有点麻烦,我最终在/etc/NetworkManager/dispatcher.d中编写了一个自定义脚本,以确保/etc/resolv.conf中的第一个条目是127.0.0.1,因为头文件似乎没有被考虑在内;然后我不得不对dnsmasq图像进行了更多的修改(最终我自己写了),但大部分都成功了。谢谢@KārlisĀbele,这听起来是一个非常有趣的方法,我没想到会不会。。我将首先尝试b0gusb的dns解决方案建议,但您的解决方案是我的用例的一个可靠的方案B。@KārlisĀbele这是一个非常有趣的方法。但是,
docker事件
似乎没有显示任何与IP地址或名称分配相关的事件。您能详细介绍一下吗?@b0gusb假设您需要在新容器启动后执行一些特定操作。您可以创建一个在后台运行的服务(如果在容器中装入docker套接字,甚至可以在容器中运行),并检查容器创建事件。与事件一起,您可以检索容器ID,从中可以获得关于容器的任何必要信息,甚至可以对容器本身进行更改。一旦你有了容器ID,你就可以使用内置的docker命令来检索你需要的任何网络信息,并根据需要使用它。我认为这可能是一个很好的替代方案,而且很容易实现@KārlisĀbele。我添加了一个基本的脚本。
#!/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')