正如标题所示,我需要能够检索docker托管的IP地址以及从主机到容器的portmap,并在容器内部完成这些工作。
当前回答
更新:在Mac版Docker上,从18.03版本开始,你可以使用host. Docker .internal作为主机的IP。请看aljabear的回答。对于以前版本的Mac Docker,以下答案可能仍然有用:
在Docker for Mac上,docker0桥不存在,所以这里的其他答案可能不起作用。然而,所有流出的流量都是通过你的父主机路由的,所以只要你试图连接到一个它识别为自己的IP(而docker容器并不认为是自己),你应该能够连接。例如,如果你从父机器运行:
ipconfig getifaddr en0
这应该会显示你的Mac在当前网络上的IP地址,你的docker容器也应该能够连接到这个地址。如果这个IP地址发生了变化,这当然是一件痛苦的事情,但是你可以在你的Mac上添加一个自定义环回IP,通过在父机器上做这样的事情,容器不会认为它是自己:
sudo ifconfig lo0 alias 192.168.46.49
然后,您可以在docker容器内使用telnet测试连接。在我的例子中,我想连接到一个远程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与您自己网络上的某些内容不冲突。
其他回答
唯一的方法是在创建容器时将主机信息作为环境传递
run --env <key>=<value>
我使用的解决方案是基于一个“服务器”,它在接收到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 container
# 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>
Docker主机的IP地址由ipify通过http报头"X-Forwarded-For"返回
示例(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
从版本18.03开始,您可以使用host.docker.internal作为主机的IP。
适用于Mac的Docker, Windows的Docker,以及其他平台。
这是mac专用docker.for.mac的更新。Localhost(17.06版后可用)和docker.for.mac.host.internal(17.12版后可用),它们也可以在该平台上运行。
注意,在Mac和Windows文档中,这仅用于开发目的。
例如,我在主机上设置了环境变量:
MONGO_SERVER=host.docker.internal
在我码头式的写作中。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_NodeIPOrFQDN获得。服务Fabric环境变量
另一种方法是基于traceroute,它在Linux主机上为我工作,例如在一个基于Alpine的容器中:
traceroute -n 8.8.8.8 -m 4 -w 1 | awk '$1~/\d/&&$2!~/^172\./{print$2}' | head -1
它花了一点时间,但列出了第一跳的IP,该IP不是以172开头的。如果没有成功响应,则尝试使用-m 4参数增加测试跳数的限制。
推荐文章
- 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 -如何将文件从镜像复制到主机?