正如标题所说。 我需要能够检索来自主机的IP地址泊坞窗主机和portmaps的容器,和做容器里面。
Answer 1:
/sbin/ip route|awk '/default/ { print $3 }'
作为@MichaelNeale注意到,就没有必要使用这个方法Dockerfile
(除了当我们需要时只生成时此IP),因为这个IP将在编译时间被硬编码。
Answer 2:
在码头工人的Mac,为18.03版,您可以使用host.docker.internal
作为主机的IP。
注意,如在文档 “这是发展的目的,[S],并在生产环境中泊坞窗之外将无法正常工作的Mac。” 这是因为,在码头工人的Mac,“你看不到主机上的docker0接口,这个接口实际上是在虚拟机中。”
这是从更新docker.for.mac.localhost
,因为17.06版本,并提供docker.for.mac.host.internal
,因为17.12版本,这也可能仍然工作。
例如,我有我的主机上设置环境变量:
MONGO_SERVER=host.docker.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
Answer 3:
更新:在码头工人的Mac,为18.03版,您可以使用host.docker.internal作为主机的IP。 见allanberry的答案 。 对于泊坞窗之前的版本为Mac以下答案可能仍是有用的:
在码头工人的Mac docker0
桥不存在了,所以其他的答案在这里可能无法正常工作。 所有出站流量然而,通过你的父主机路由,所以只要你尝试连接到IP识别其为自身(和泊坞窗容器不认为是自己),你应该能够连接。 例如,如果你从母机运行运行以下命令:
ipconfig getifaddr en0
这将显示你的Mac的IP当前网络上和你的搬运工容器应该能够连接到该地址也是如此。 当然,这是一个痛苦,如果这个IP地址都没有改变,但你可以做这样的事情父机器上添加自定义的回送IP到你的Mac,容器并不认为是自己:
sudo ifconfig lo0 alias 192.168.46.49
然后,您可以从测试通过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
有一两件事要小心的是,如果它认为该业务的目的地是泊坞窗容器不会流量发送到父主机。 因此,检查环回接口的容器内,如果你有麻烦了:
sudo ip addr show lo
在我的情况,这表明inet 127.0.0.1/8
这意味着我无法在使用任何IP地址127.*
范围。 这就是为什么我使用192.168.*
在上面的例子。 请确保您使用不符合自己的网络上的东西相冲突的IP。
Answer 4:
对于那些在AWS上运行多克的实例元数据的主机仍然可以从容器内。
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
Answer 5:
唯一的办法是通过主机的信息环境,当你创建一个容器
run --env <key>=<value>
Answer 6:
该--add-host
可能是一个更清洁的解决方案(但没有接口部分,只有主机可以使用此解决方案来处理)。 所以,在你的docker run
命令,这样做:
docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print $3}'` [my container]
(从https://stackoverflow.com/a/26864854/127400 )
Answer 7:
码头工人的Mac我想从一个容器连接到服务的主机上
该主机具有不断变化的IP地址(或根本没有,如果你没有网络访问)。 从18.03开始我们的建议是连接到特殊的DNS名称host.docker.internal,其解析为主机所使用的内部IP地址。
网关也可到达的gateway.docker.internal。 https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
Answer 8:
如果你想真正的IP
地址(而不是桥IP
上) Windows
,你有泊坞窗18.03
(或更近)执行以下操作:
从主容器中运行bash的地方形象的名字是nginx
(适用于Alpine Linux distribution
):
docker run -it nginx /bin/ash
然后里面容器中运行
/ # nslookup host.docker.internal
Name: host.docker.internal
Address 1: 192.168.65.2
192.168.65.2
是主机的IP -没有桥IP像spinus
接受的答案。
我在这里使用host.docker.internal :
该主机具有不断变化的IP地址(或根本没有,如果你没有网络访问)。 从18.03开始我们的建议是连接到特殊的DNS名称host.docker.internal,其解析为主机所使用的内部IP地址。 这是发展的目的,并在生产环境中泊坞窗之外将无法正常工作的Windows。
Answer 9:
如果启用了泊坞窗远程API (通过-H
tcp://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'
)
第二行抓住从当地的容器ID /proc/self/cgroup
文件。
第三行卷发输出到主机(假设你使用4243作为码头工人的端口),然后使用节点来解析返回的JSON的DESIRED_PORT
。
Answer 10:
这里是为那些在AWS上运行泊坞窗的另一种选择。 此选项可避免使用APK添加卷曲包有和节省空间的珍贵7MB。 使用内置的wget(单片BusyBox的二进制文件的一部分):
wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4
Answer 11:
在Linux下,你可以运行
HOST_IP=`hostname -I | awk '{print $1}'`
在MacOS上您的主机不是泊坞主机。 泊坞窗将安装在VirtualBox中它的主机操作系统。
HOST_IP=`docker run busybox ping -c 1 docker.for.mac.localhost | awk 'FNR==2 {print $4}' | sed s'/.$//'`
Answer 12:
如果你正在运行一个服务织物集群在Windows容器,主机的IP地址是通过环境变量可用Fabric_NodeIPOrFQDN
。 服务织物环境变量
Answer 13:
下面是我如何做到这一点。 在这种情况下,增加了搬运工图像指向金牛座主机我的本地机器IP内的主机进入/ etc / hosts文件:
TAURUS_HOST=`ipconfig getifaddr en0`
docker run -it --rm -e MY_ENVIRONMENT='local' --add-host "taurus-host:${TAURUS_HOST}" ...
然后,从泊坞容器内,脚本可以使用主机名金牛座主机走出我的哪些主机泊坞窗容器本地机器。
Answer 14:
也许我所创建的容器是有用的https://github.com/qoomon/docker-host
你可以简单地使用容器名称的DNS访问主机系统如卷曲的http:// dockerhost:9200 ,因此无需使用任何IP地址的麻烦。
Answer 15:
我用的解决方案是基于返回当它接收一个HTTP请求中的主机多克尔的外部地址“服务器”上。
在“服务器”:
1)启动jwilder / nginx的代理
# docker run -d -p <external server port>:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
2)启动ipify容器
# 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>
所述多克尔主机的IP地址是由ipify通过http报头“X - 转发,对于”返回
示例(ipify服务器名称“ipify.example.com”,运行在80端口,搬运工主机具有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
Answer 16:
在Ubuntu上, hostname
命令可以与以下选项一起使用:
-
-i
,--ip-address
的主机名地址 -
-I
,--all-ip-addresses
的主机的所有地址
例如:
$ hostname -i
172.17.0.2
分配给变量,下面一行程序,可以使用:
IP=$(hostname -i)
Answer 17:
随着https://docs.docker.com/machine/install-machine/
一)$泊坞窗机IP
B)获得一个或多个机器的IP地址。
$ docker-machine ip host_name
$ docker-machine ip host_name1 host_name2