正如标题所示,我需要能够检索docker托管的IP地址以及从主机到容器的portmap,并在容器内部完成这些工作。


当前回答

下面是在AWS中运行Docker的另一个选择。这个选项避免了使用apk来添加curl包,节省了宝贵的7mb空间。使用内置的wget (BusyBox二进制文件的一部分):

wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4

其他回答

下面是在AWS中运行Docker的另一个选择。这个选项避免了使用apk来添加curl包,节省了宝贵的7mb空间。使用内置的wget (BusyBox二进制文件的一部分):

wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4

如果你想要真实IP地址(不是网桥IP),并且你有docker 18.03(或最新的),执行以下操作:

在镜像名为nginx的主机上运行bash(适用于Alpine Linux发行版):

 docker run -it nginx /bin/ash

然后在容器内运行

/ # nslookup host.docker.internal

Name:      host.docker.internal
Address 1: 192.168.65.2

192.168.65.2是主机的IP,而不是spinus接受的应答中的网桥IP。

我在这里使用host.docker.internal:

主机有一个不断变化的IP地址(如果没有网络访问,则没有)。从18.03开始,我们的建议是连接到特殊的DNS名称host.docker.internal,它将解析为主机使用的内部IP地址。这是为了开发目的,不能在Docker for Windows之外的生产环境中工作。

唯一的方法是在创建容器时将主机信息作为环境传递

run --env <key>=<value>
/sbin/ip route|awk '/default/ { print $3 }'

正如@MichaelNeale注意到的,在Dockerfile中使用这个方法是没有意义的(除非我们只在构建时需要这个IP),因为这个IP在构建时是硬编码的。

Mac和Windows的TLDR

docker run -it --rm alpine nslookup host.docker.internal

... 打印主机的IP地址…

nslookup: can't resolve '(null)': Name does not resolve

Name:      host.docker.internal
Address 1: 192.168.65.2

细节

在Mac和Windows上,可以使用特殊的DNS名称host.docker.internal。

主机有一个不断变化的IP地址(如果没有网络访问,则没有)。从18.03开始,我们的建议是连接到特殊的DNS名称host.docker.internal,它将解析为主机使用的内部IP地址。这是为了开发目的,不能在Mac Docker Desktop以外的生产环境中工作。