除了使用环境变量之外,还有什么方法可以从该主机上运行的容器内获取docker主机的主机名? 我知道我可以在容器创建时将主机名作为环境变量传递给容器。我想知道如何在运行时查找它。
foo.example.com (docker host)
bar (docker container)
在docker host bar
中运行容器foo.example.com
是否有办法获取“foo.example.com”?
编辑以添加用例:
容器将为表单
的服务发现创建SRV记录_service._proto.name. TTL class SRV priority weight port target.
-----------------------------------------------------------------
_bar._http.example.com 60 IN SRV 5000 5000 20003 foo.example.com.
其中20003是docker主机上动态分配的端口,用于监听bar中某个固定端口的服务(docker处理从主机端口到容器端口的映射)。
我的容器将运行运行状况检查以确保它已成功创建该SRV记录,因为其他docker主机上还有许多其他bar容器也会创建自己的SRV记录。
_service._proto.name. TTL class SRV priority weight port target.
-----------------------------------------------------------------
_bar._http.example.com 60 IN SRV 5000 5000 20003 foo.example.com. <--
_bar._http.example.com 60 IN SRV 5000 5000 20003 foo2.example.com.
_bar._http.example.com 60 IN SRV 5000 5000 20003 foo3.example.com.
运行状况检查将遍历SRV记录,查找上面的第一个记录,因此需要知道其主机名。
预留
我正在使用Helios并且发现它添加了env var for me,我可以从中获取主机名。但我很好奇,以防我使用没有Helios的码头工具。
答案 0 :(得分:22)
您可以轻松地将其作为环境变量传递
docker run .. -e HOST_HOSTNAME=`hostname` ..
使用
-e HOST_HOSTNAME=`hostname`
将调用主机名并将其作为名为HOST_HOSTNAME
的环境变量使用,当然您可以根据需要自定义密钥。
请注意,这适用于bash shell,如果您使用不同的shell,则可能需要查看&#34; backtick&#34;的替代方法,例如fish
shell替代方案
docker run .. -e HOST_HOSTNAME=(hostname) ..
答案 1 :(得分:14)
您可以将主机名作为环境变量传递。你也可以挂载/ etc,这样你就可以使用/ etc / hostname。但我同意Vitaly,这不是IMO容器的预期用例。
答案 2 :(得分:10)
我正在添加这个,因为在任何其他答案中都没有提到。您可以使用-h指令在运行时为容器指定特定的主机名。
docker run -h=my.docker.container.example.com ubuntu:latest
您可以使用反引号(或shell使用的任何等效项)将hosthame的输出转换为-h参数。
docker run -h=`hostname` ubuntu:latest
有一点需要注意,hostname的值将从您运行命令的主机中获取,因此如果您想要运行docker容器的虚拟机的主机名,那么使用hostname作为参数可能不正确您正在使用主机在虚拟机上执行docker命令。
答案 3 :(得分:5)
另一个对我有用的选择是将主机的网络命名空间绑定到docker。
添加:
docker run --net host
答案 4 :(得分:5)
我认为我遇到同样问题的原因是bug in the latest Docker for Mac beta,但是在那里的评论中,我能找到一个对我有用的解决方案。我的团队。我们正在将其用于本地开发,在我们努力取代它时,我们需要我们的集装箱化服务与巨石交谈。这可能不是一种生产可行的解决方案。
在主机上,将已知的可用IP地址别名为loopback接口:
$ sudo ifconfig lo0 alias 10.200.10.1/24
然后将具有主机名的IP添加到docker配置中。就我而言,我使用的是docker-compose,所以我把它添加到了我的docker-compose.yml:
extra_hosts:
# configure your host to alias 10.200.10.1 to the loopback interface:
# sudo ifconfig lo0 alias 10.200.10.1/24
- "relevant_hostname:10.200.10.1"
然后,我通过附加到bash会话并使用wget
从主机的Web服务器请求页面来验证所需的主机服务(Web服务器)是否可从容器内部获得:
$ docker exec -it container_name /bin/bash
$ wget relevant_hostname/index.html
$ cat index.html
答案 5 :(得分:0)
您可以像这样将其作为环境变量传递。通常Node
是运行它的主机。主机名在创建时默认为节点的主机名。
docker service create -e 'FOO={{.Node.Hostname}}' nginx
然后您可以执行docker ps
来获取进程ID并查看环境
$ docker exec -it c81640b6d1f1 env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=c81640b6d1f1
TERM=xterm
FOO=docker-desktop
NGINX_VERSION=1.17.4
NJS_VERSION=0.3.5
PKG_RELEASE=1~buster
HOME=/root
使用metricbeats的例子是一个例子,因此您知道哪个节点出现了系统问题,我将其放在https://github.com/trajano/elk-swarm中:
metricbeat:
image: docker.elastic.co/beats/metricbeat:7.4.0
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro
- /proc:/hostfs/proc:ro
- /:/hostfs:ro
user: root
hostname: "{{.Node.Hostname}}"
command:
- -E
- |
metricbeat.modules=[
{
module:docker,
hosts:[unix:///var/run/docker.sock],
period:10s,
enabled:true
}
]
- -E
- processors={1:{add_docker_metadata:{host:unix:///var/run/docker.sock}}}
- -E
- output.elasticsearch.enabled=false
- -E
- output.logstash.enabled=true
- -E
- output.logstash.hosts=["logstash:5044"]
deploy:
mode: global
答案 6 :(得分:0)
我跑了
docker info | grep Name: | xargs | cut -d' ' -f2
在我的容器内。
答案 7 :(得分:-1)
我知道这是一个古老的问题,但是我也需要此解决方案,并且我也加入了另一个解决方案。
我使用 entrypoint.sh 执行以下行,并为该实例定义具有实际主机名的变量:
HOST=`hostname --fqdn`
然后,我在入口点脚本中使用了它:
echo "Value: $HOST"
希望这会有所帮助