首页 > 解决方案 > docker-compose 主机名和本地解析

问题描述

hostname:在使用指定主机名( )和 IP 地址( )的 docker-compose 文件创建 docker 容器时ipv4_address:,我希望本地计算机(运行 docker 守护程序服务的计算机,也就是我的笔记本电脑)能够解析这些主机名,而无需需要(太多)人工干预。即,如果容器是一个带有 hostname 的网络服务器服务my_webserver,我希望它my_werbserver解析为我分配给该容器的 IP 地址。

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

标签: dockerdocker-compose

解决方案


正如@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')

推荐阅读