如何在Docker容器内部获取Docker主机的IP地址

545

正如标题所述,我需要能够在容器内部检索Docker主机的IP地址和主机到容器的端口映射。


1
您能详细说明一下您想如何使用这些信息吗?您说“docker主机”--您在多个主机上运行Docker吗?一旦您的容器知道了主机的IP地址和端口映射,它将会做什么? - Andy
将Docker主机IP地址传递给Docker容器的最简单方法,我认为是在容器内部使用“docker container exec”进行调用。假设您想从busybox容器内部ping主机,请使用以下命令: $ IP = '8.8.8.8' && docker container busybox ping $IP ' 找出主机IP的方法,使用您喜欢的任何方式即可。 - SauloAlessandre
28个回答

1
这是一个在 Node.js 中的简洁实现,适用于在 AWS EC2 实例 上运行主机的用户,使用上述 EC2 Metadata instance
const cp = require('child_process');
const ec2 = function (callback) {
    const URL = 'http://169.254.169.254/latest/meta-data/local-ipv4';
    // we make it silent and timeout to 1 sec
    const args = [URL, '-s', '--max-time', '1'];
    const opts = {};
    cp.execFile('curl', args, opts, (error, stdout) => {
        if (error) return callback(new Error('ec2 ip error'));
        else return callback(null, stdout);
    })
        .on('error', (error) => callback(new Error('ec2 ip error')));
}//ec2

和被用作

ec2(function(err, ip) {
        if(err) console.log(err)
        else console.log(ip);
    })

1
如果您正在使用Rancher服务器运行容器,Rancher v1.6(不确定2.0是否有此功能)的容器可以访问http://rancher-metadata/,其中包含许多有用的信息。从容器内部可以在此处找到IP地址:curl http://rancher-metadata/latest/self/host/agent_ip。更多详细信息请参见:https://rancher.com/docs/rancher/v1.6/en/rancher-services/metadata-service/

0
在Ubuntu上,可以使用hostname命令并带有以下选项:
  • -i--ip-address 主机名的地址
  • -I--all-ip-addresses 主机的所有地址
例如:
$ hostname -i
172.17.0.2

可以使用以下一行代码将值分配给变量:

IP=$(hostname -i)

3
这将为您提供Docker容器的IP地址,而不是主机的IP地址。 - Mario Camou

0

如果您正在Service Fabric集群上运行Windows容器,则可以通过环境变量Fabric_NodeIPOrFQDN获取主机的IP地址。Service Fabric环境变量


0

0
我使用的解决方案基于一个“服务器”,当它接收到HTTP请求时,返回Docker主机的外部地址。
在“服务器”上:
1)启动jwilder/nginx-proxy。
# docker run -d -p <external server port>:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

2) 启动 ipify 容器

# docker run -e VIRTUAL_HOST=<external server name/address> --detach --name ipify osixia/ipify-api:0.1.0

现在,当容器向服务器发送HTTP请求时,例如:

# curl http://<external server name/address>:<external server port>

通过 http header "X-Forwarded-For",ipify 返回 Docker 主机的 IP 地址

示例(ipify 服务器名为 "ipify.example.com",运行在端口 80 上,Docker 主机的 IP 是 10.20.30.40):

# docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
# docker run -e VIRTUAL_HOST=ipify.example.com --detach --name ipify osixia/ipify-api:0.1.0

现在你可以在容器内调用:

# curl http://ipify.example.com
10.20.30.40

-1
另一种方法是基于traceroute,对我来说在Linux主机上运行良好,例如在基于Alpine的容器中:
traceroute -n 8.8.8.8 -m 4 -w 1 | awk '$1~/\d/&&$2!~/^172\./{print$2}' | head -1

它需要一点时间,但会列出第一个不以172.开头的IP跳点。如果没有成功响应,请尝试使用-m 4参数增加测试跳数上限。


-7

10
这将检索运行Docker容器的虚拟机的IP地址,而不是容器所在主机的IP地址。 - Spencer Williams
2
这仅适用于在docker-machine上运行的docker。新的Mac版docker不在docker-machine上运行。 - thomas.han

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接