正如标题所示,我需要能够检索docker托管的IP地址以及从主机到容器的portmap,并在容器内部完成这些工作。
当前回答
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以外的生产环境中工作。
其他回答
如果你启用了docker远程API(例如通过-Htcp://0.0.0.0:4243),并且知道主机的主机名或IP地址,这可以通过大量的bash来完成。
在容器的用户bashrc中:
export hostIP=$(ip r | awk '/default/{print $3}')
export containerID=$(awk -F/ '/docker/{print $NF;exit;}' /proc/self/cgroup)
export proxyPort=$(
curl -s http://$hostIP:4243/containers/$containerID/json |
node -pe 'JSON.parse(require("fs").readFileSync("/dev/stdin").toString()).NetworkSettings.Ports["DESIRED_PORT/tcp"][0].HostPort'
)
第二行从本地/proc/self/cgroup文件中获取容器ID。
第三行卷曲到主机(假设您使用4243作为docker的端口),然后使用node解析返回的JSON为DESIRED_PORT。
——add-host可能是一个更简洁的解决方案(但没有端口部分,只能使用该解决方案处理主机)。所以,在你的docker运行命令中,做如下的事情:
docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print $3}'` [my container]
(来自https://stackoverflow.com/a/26864854/127400)
与https://docs.docker.com/machine/install-machine/
A) $ docker-machine IP
b)获取一台或多台机器的IP地址。
$ docker-machine ip host_name
$ docker-machine ip host_name1 host_name2
这是一个在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);
})
从版本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
推荐文章
- 如何从私有docker注册表中删除图像?
- 创建多个标签码头镜像
- Docker -如何将文件从镜像复制到主机?
- 如何防止docker在系统启动时自动启动容器?
- 什么是Docker映像“层”?
- 无法从docker-compose连接到docker
- Docker错误无法删除Docker容器,冲突:无法删除存储库引用
- 如何让容器在Kubernetes上运行?
- 如何备份docker容器的数据卷?
- Docker入口点运行bash脚本被“拒绝权限”
- 我如何复制Docker作为非根?
- 如何禁用容器上的自动重启?
- 如何传递参数到Dockerfile?
- 如何知道docker是否已经登录到docker注册服务器
- 为什么安装了Docker而没有安装Docker Compose?