容器中使用 hostname 访问外部服务, 不需要配置 /etc/hosts
AWS 上有一个集群服务, VPS 之间使用 ip-xx-xx-xx-xx 是可以直接访问的.
现在有个需求, 要在某几台机器部署 docker, 在容器内访问集群内的服务. 并且使用 hostname 实现.
cat > Dockerfile << EOF
FROM alpine
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 ip-172-31-42-98
cat /etc/resolv.conf
docker-compose exec api cat /etc/resolv.conf
docker-compose exec mmm nslookup 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"]
service docker restart
docker-compose down
docker-compose up -d
docker-compose exec api cat /etc/resolv.conf
docker-compose exec api nslookup ip-172-31-42-98
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...