正如标题所示,我需要能够检索docker托管的IP地址以及从主机到容器的portmap,并在容器内部完成这些工作。
当前回答
下面是在AWS中运行Docker的另一个选择。这个选项避免了使用apk来添加curl包,节省了宝贵的7mb空间。使用内置的wget (BusyBox二进制文件的一部分):
wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4
其他回答
所以…如果你使用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/
对于大多数希望自动执行此操作的应用程序来说,标准的最佳实践是:你不需要这样做。相反,你让运行容器的人注入一个外部主机名/ip地址作为配置,例如作为一个环境变量或配置文件。允许用户注入这个可以提供最可移植的设计。
为什么会这么难?因为容器在设计上将应用程序与宿主环境隔离。默认情况下,网络的命名空间仅用于该容器,并且主机的详细信息不受容器内运行的进程的影响,这些进程可能不完全受信任。
根据您的具体情况,有不同的选择:
如果容器在主机网络下运行,则可以直接查看主机上的路由表,以查看默认路由输出。从这个问题来看,以下几点对我有用。
ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
一个在容器中显示主机网络的示例如下:
docker run --rm --net host busybox /bin/sh -c \
"ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'"
对于当前版本的Docker Desktop,他们在嵌入式虚拟机中注入了一个DNS条目:
getent hosts host.docker.internal | awk '{print $1}'
在20.10版本中,host.docker.internal别名也可以在Linux上运行,前提是你的容器有一个额外的选项:
docker run --add-host host.docker.internal:host-gateway ...
如果你在云环境中运行,你可以检查云提供商的元数据服务,例如AWS:
curl http://169.254.169.254/latest/meta-data/local-ipv4
如果你想要你的外部/互联网地址,你可以查询远程服务,如:
curl ifconfig.co
每种方法都有局限性,并且只适用于特定的场景。最可移植的选项仍然是运行容器时将IP地址作为配置注入,例如,这里有一个选项,在主机上运行之前的IP命令并将其作为环境变量注入:
export HOST_IP=$(ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p')
docker run --rm -e HOST_IP busybox printenv HOST_IP
也许我创建的容器也很有用https://github.com/qoomon/docker-host
你可以简单地使用容器名称dns访问主机系统,例如curl http://dockerhost:9200,所以不需要任何IP地址的麻烦。
唯一的方法是在创建容器时将主机信息作为环境传递
run --env <key>=<value>
我有Ubuntu 16.03。对我来说
docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print $3}'` [image]
不工作(错误的ip正在生成)
我的解决方案是:
docker run --add-host dockerhost:`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' bridge` [image]
推荐文章
- Docker -绑定0.0.0.0:4000失败:端口已经分配
- 将Python诗歌与Docker集成
- 如何在系统启动时运行docker-compose up -d ?
- 如何确定一个进程是否运行在lxc/Docker内部?
- 在docker容器上挂载多个卷?
- Kubernetes如何使部署更新映像
- Docker-compose up vs Docker-compose up -build vs Docker-compose build -no-cache
- 在Docker Alpine容器中启动一个shell
- 允许docker容器连接到本地/主机postgres数据库
- 在Docker Desktop中定位数据卷(Windows)
- 如何通过docker运行传递参数到Shell脚本
- 我的码头集装箱没有网络
- 如何从私有docker注册表中删除图像?
- 创建多个标签码头镜像
- Docker -如何将文件从镜像复制到主机?