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


当前回答

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 我想从容器连接到主机上的服务

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

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

docker network inspect bridge -f '{{range .IPAM.Config}}{{.Gateway}}{{end}}'

可以使用docker网络inspect来检索它

更新:在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与您自己网络上的某些内容不冲突。

从版本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

这是一个在Node.js中使用前面提到的EC2元数据实例在AWS EC2实例上运行主机的最简单实现

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);
    })