查看docker - 获取docker的ip




如何从码头集装箱内获取码头主机的IP地址 (8)

--add-host可能是一个更清洁的解决方案(但没有端口部分,只有主机可以使用此解决方案进行处理)。 因此,在您的docker run命令中,执行如下操作:

docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print  $3}'` [my container]

(从https://stackoverflow.com/a/26864854/127400 )

正如标题所述。 我需要能够检索Docker主机的IP地址和从主机到容器的portmaps,并在容器内部执行此操作。


Docker for Mac我想从容器连接到主机上的服务

主机有一个不断变化的IP地址(如果你没有网络访问权限,则为无)。 从18.03开始,我们的建议是连接到特殊的DNS名称host.docker.internal,它解析为主机使用的内部IP地址。

网关也可以作为gateway.docker.internal访问。 https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds


Docker for Mac上docker0网桥不存在,所以其他答案可能无效。 但是,所有传出流量都会通过您的父级主机进行路由,因此只要您尝试连接到自己识别的IP(并且Docker容器不认为是自己),您应该可以进行连接。 例如,如果您从父机器运行中运行:

ipconfig getifaddr en0

这应该会向您显示您的Mac在其当前网络上的IP,并且您的Docker容器也应该能够连接到此地址。 如果这个IP地址有变化,这当然是一个痛苦,但是你可以在你的Mac上添加一个自定义的回送IP,这个容器在父机器上做的事情并不像它自己想的那样:

sudo ifconfig lo0 alias 192.168.46.49

然后,您可以使用telnet从Docker容器中测试连接。 在我的情况下,我想连接到远程xdebug服务器:

telnet 192.168.46.49 9000

现在,当流量进入您的Mac地址为192.168.46.49(并且所有流量离开您的容器时都会通过您的Mac),您的Mac会认为IP本身。 当你完成使用这个IP时,你可以像这样删除环回别名:

sudo ifconfig lo0 -alias 192.168.46.49

需要注意的一件事是,如果Docker容器认为流量的目的地本身,则不会将流量发送到父级主机。 因此,如果遇到问题,请检查容器内的环回接口:

sudo ip addr show lo

在我的情况下,这表明inet 127.0.0.1/8 ,这意味着我不能在127.*范围内使用任何IP。 这就是为什么我在上面的例子中使用了192.168.* 。 确保您使用的IP与您自己的网络上的某些东西没有冲突。


Docker for Mac上 ,从版本17.12开始,可以使用docker.for.mac.host.internal作为主机的IP。

这是一个来自docker.for.mac.localhost的更新,从17.06版开始提供,显然它仍然有效。

Docs

例如,我在主机上设置了环境变量:

MONGO_SERVER=docker.for.mac.host.internal

在我docker-compose.yml文件中,我有这样的:

version: '3'

services:
  api:
    build: ./api
    volumes:
      - ./api:/usr/src/app:ro
    ports:
      - "8000"
    environment:
      - MONGO_SERVER
    command: /usr/local/bin/gunicorn -c /usr/src/app/gunicorn_config.py -w 1 -b :8000 wsgi

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


对于在AWS中运行Docker的用户,主机的实例元数据仍可从容器内使用。

curl http://169.254.169.254/latest/meta-data/local-ipv4

例如:

$ docker run alpine /bin/sh -c "apk update ; apk add curl ; curl -s http://169.254.169.254/latest/meta-data/local-ipv4 ; echo"
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz
v3.3.1-119-gb247c0a [http://dl-cdn.alpinelinux.org/alpine/v3.3/main]
v3.3.1-59-g48b0368 [http://dl-cdn.alpinelinux.org/alpine/v3.3/community]
OK: 5855 distinct packages available
(1/4) Installing openssl (1.0.2g-r0)
(2/4) Installing ca-certificates (20160104-r2)
(3/4) Installing libssh2 (1.6.0-r1)
(4/4) Installing curl (7.47.0-r0)
Executing busybox-1.24.1-r7.trigger
Executing ca-certificates-20160104-r2.trigger
OK: 7 MiB in 15 packages
172.31.27.238

$ ifconfig eth0 | grep -oP 'inet addr:\K\S+'
172.31.27.238


/sbin/ip route|awk '/default/ { print $3 }'

正如@MichaelNeale所注意到的那样,在Dockerfile使用这个方法是没有意义的(除非我们只在Dockerfile期间需要这个IP),因为这个IP将在Dockerfile期间被硬编码。





ip