添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

容器中使用 hostname 访问外部服务, 不需要配置 /etc/hosts

AWS 上有一个集群服务, VPS 之间使用 ip-xx-xx-xx-xx 是可以直接访问的.

现在有个需求, 要在某几台机器部署 docker, 在容器内访问集群内的服务. 并且使用 hostname 实现.

# 创建 Dockerfile
cat > Dockerfile << EOF
FROM alpine
# 创建 docker-compose.yml
cat > docker-compose.yml << EOF
version: '3'
services:
    build: .
    container_name: "api"
    working_dir: /root
    command: tail -f /dev/null
# 启动容器
docker-compose up -d
# 在容器内尝试连接宿主机, 提示解析不到主机
docker-compose exec api nslookup `hostname`
# nslookup: can't resolve '(null)': Name does not resolve
# nslookup: can't resolve 'ip-172-31-42-98': Name does not resolve
#  在宿主机内解析自己
nslookup ip-172-31-42-98
#Server:		172.31.0.2
#Address:	172.31.0.2#53
#Non-authoritative answer:
#Name:	ip-172-31-42-98.us-west-2.compute.internal
#Address: 172.31.42.98
# 查看宿主机 DNS 设置
cat /etc/resolv.conf 
# nameserver 172.31.0.2
# search us-west-2.compute.internal
# nameserver 8.8.8.8
# nameserver 8.8.8.8
# 查看容器内 DNS 设置
docker-compose exec api cat /etc/resolv.conf
# search us-west-2.compute.internal
# nameserver 127.0.0.11
# options ndots:0
# 尝试将 `nameserver 172.31.0.2` 加入容器内 DNS 设置后再尝试, 依旧解析失败.
# 直接解析完整路径,  是可以解析到内容的
docker-compose exec mmm nslookup ip-172-31-42-98.us-west-2.compute.internal
#nslookup: can't resolve '(null)': Name does not resolve
#Name:      ip-172-31-42-98.us-west-2.compute.internal
#Address 1: 172.31.42.98 ip-172-31-42-98.us-west-2.compute.internal

容器内 DNS 有一行设置是 options ndots:0, 只需要将 ndots 改成 1 就可以解决这个问题.

ndots:n.
sets a threshold for the number of dots which must appear in a name given to res_query(3) (see resolver(3)) before an initial absolute query will be made. The default for n is 1, meaning that if there are any dots in a name, the name will be tried first as an absolute name before any search list elements are appended to it. The value for this option is silently capped to 15.

以解析的域名ip-172-31-42-98为例, 里面最少需要有1个 ., 依次和search配置的列表拼接解析, 直到解析成功. linux 默认是 1. docker 容器默认是 1, 应该是为了安全考虑.

所以只需要修改 DNS ndots:1 即可.

如何让容器启动后默认就是 ndots:1? 只需要配置 /etc/docker/daemon.json 即可.

"dns-opts": ["ndots:1"]
# 修改 daemon 后重启 docker
service docker restart
# 重新创建容器
docker-compose down
docker-compose up -d
# 查看配置 ndots 是否有变化
docker-compose exec api cat /etc/resolv.conf
# search us-west-2.compute.internal
# nameserver 127.0.0.11
# options ndots:1
# 解析成功了
docker-compose exec api nslookup ip-172-31-42-98
# Name:      ip-172-31-42-98
# Address 1: 172.31.42.98 ip-172-31-42-98.us-west-2.compute.internal
# 访问其他主机的服务
docker-compose exec mmm curl ip-172-31-41-9:31267/echo/

man/5/resolv.conf - https://linux.die.net/man/5/resolv.conf

moby/moby - ndots:0 #32093 - https://github.com/moby/moby/issues/32093#issuecomment-313887120

所有平台的 。 use gethostname :: gethostname; println! ( "Hostname: {:?}" , gethostname ()); 还提供gethostname() ,但从2019年起将。此板条箱改善了。 根据Apache许可证2.0版(“许可证”)获得许可; 除非遵守许可,否则您不得使用此文件。 您可以在处获得许可证的副本。 除非适用法律要求或以书面形式同意,否则根据“许可”分发的软件将按“原样”分发,没有任何形式的明示或暗示担保或条件。 有关许可下特定的语言管理权限和限制,请参阅许可。 /etc/hosts, /etc/resolv.conf和/etc/hostname容器的这三个文件不存在于镜像,在启动容器的时候,通过mount的形式将这些文件挂载到容器内部。因此,如果在容器修改这些文件的话,修改部分不会存在于容器的top layer,而是直接写入这三个物理文件。 为什么重启后修改内容不存在了?原因是:每次Docker在启动容器的时候,通过重新构建新的/etc/hosts文件,这又是为什么呢?原因是:容器重启,IP地 最近收到Hyperledger社区的一些朋友反馈在阿里云环境上部署开源区块链项目Hyperledger Fabric的过程遇到了和SIGSEV相关的fatal error,正好笔者此前也遇到并解决过类似的问题,因此这里分享一下当时问题的分析过程和解决的经验,希望能为大家带来一点启发和帮助。 在部署Hyperledger Fabric过程,... 前言: 在之前的实验,有在deployment的部署遇到了,在pod pod之间无法相互的解析,甚至不能识别对应的域名的问题,那么也是遇到了很多种自己设想的可能性( 在filebeat种的 无法识别 以为是没有安装redis 而后安装了也没有成功) 后来在pod内部的nslookup也无法验证成功,后来使用dig验证的时候也是失败的,就在想这是为什么? 而后查看镜像,在查看名称空间ku... kubernetes hostNetwork: true 网络这是一种直接定义Pod网络的方式。如果在POD使用hostNetwork:true配置网络,pod运行的应用程序可以直接看到宿主主机的网络接口,宿主主机所在的局域网上所有网络接口都可以访问到该应用程序。POD定义样例:$ cat nginx.yaml apiVersion: extensions/v1beta1 kind: Depl... 作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,这就是需要一个集群范围内的DNS服务来完成从服务名到ClusterIP 地址的解析。DNS服务在Kubernetes 的发展经历了3个阶段,这里我只讲以CoreDNS 为例,说明KUbernetes 集群DNS 服务的搭建过程。 1. 修改每个Node 上Kubelet 的DNS 启动参数 修改每个Node 上kubelet 的启动参数,在其加上以下两个参数。 (1)–cluster-dns=169.169.0.100 : 为DNS 在K8S定义的存储卷主要包含了四种类型。(1)本地存储卷:主要适用于Pod容器之间的数据共享,或者实现Pod与Node数据存储和共享(2)网络存储卷:主要是用于多个Pod之间或者多个Node之间的数据存储和共享。(3)持久存储卷:基于网络存储卷,用户无需关心存储卷所使用的存储系统,只需要定义所需要消费的资源,可以将Pod与具体的存储系统解耦。(4)配置存储卷:用于向各个Pod注入配置信息。1.本地存储卷。 1.使用 --link 参考 docker run --link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量。 --link的格式: --link <name or id>:alias 其,name和id是源容器的name和id,alias是源容器 一、Headless Services介绍 Headless Services是一种特殊的service,其spec:clusterIP表示为None,这样在实际运行时就不会被分配ClusterIP。也被称为无头服务。 1、headless Service和普通Service的区别 headless不分配clusterIP headless service可以通过解析service的DNS,返回... 一、Init Container简介 Pod能够包含多个容器,也可能包含一个或多个先于应用容器启动的init容器。init容器和普通容器非常像,除了以下四点: 它们只运行到完成 每个init容器都必须在下一个启动之前成功完成 init容器不支持Readiness Probe,因为它们必须在pod启动之前完成 如果一个pod指定了多个init容器,则init容器会按顺序启动,每个... 最近迁移一台hyper-v的windows域的虚拟机到别的物理主机上,迁移后,发现了一个问题,再域别的机器上,通过Nslookup命令,查询DNS时,提示如下错误:D:\Documents and Settings\sysadmin>nslookup*** Can't find server name for address 192.168.0.160: Non-existentdomai... 1 DNS 基础知识 互联网基于 TCP/IP 协议。为了方便管理网络内的主机,整个互联网分为若干个域 (domain),每 个域又可以再分为若干个子域,例如,.com,.org,.edu...