我需要从windows server机器中的linux容器连接到docker主机。但docker dns无法解析docker.host.internal。我已尝试添加host.docker。docker中的内部compose extra_hosts标记,并尝试用它映射我的机器ip。但这些都不起作用。
额外主机:
额外主机:
我还尝试检查容器中的/etc/hosts文件,但它不在那里。因为主机文件不在那里,所以docker dns无法解析host.docker.internal。
docker exec my_container_id cat /etc/hosts
/etc/hosts: No such file or directory
我的环境:
我还尝试将我的docker版本更新到20.10.11,这在我的windows 10机器上运行良好。
PS C:\Windows\system32> docker version
Client:
Version: 20.10.11
API version: 1.41
Go version: go1.16.10
Git commit: dea9396
Built: Thu Nov 18 00:42:51 2021
OS/Arch: windows/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.11
API version: 1.41 (minimum version 1.24)
Go version: go1.16.9
Git commit: 847da18
Built: Thu Nov 18 00:38:11 2021
OS/Arch: windows/amd64
Experimental: true
我不明白为什么docker不能创建/etc/hosts文件。
我通过在/etc/hosts文件中添加一个手动条目来完成这项工作。因为我没有使用docker desktop,所以docker deamon无法在我的容器中创建/etc/hosts文件。由于缺少此文件,我的容器无法连接到host.docker.internal。在做这件事之前,我确定了一些事情。
我检查了是否创建了网桥网络(从我的主机):
PS C:\Windows\system32> docker network ls
NETWORK ID NAME DRIVER SCOPE
9f3ee06eaa1f nat nat local
1b17a917b877 none null local
56f23d8f2228 talflow_code-default nat local
然后我检查了nat网络,这是docker deamon创建的默认桥接网络:
PS C:\Windows\system32> docker network inspect nat
[
{
"Name": "nat",
"Id": "9f3ee06eaa1f3ec923e734b18228d08b2cda9242293a2b71fd82c7a413109609",
"Created": "2022-08-11T12:18:01.4356971-07:00",
"Scope": "local",
"Driver": "nat",
"EnableIPv6": false,
"IPAM": {
"Driver": "windows",
"Options": null,
"Config": [
{
"Subnet": "172.31.80.0/20",
"Gateway": "172.31.80.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.windowsshim.hnsid": "9C6F07F8-D106-4CD4-B3B7-C303886D4815",
"com.docker.network.windowsshim.networkname": "nat"
},
"Labels": {}
}
]
这里的网桥IP是172.31.80.1
接下来,我验证了此 IP 是否可以在我的容器内访问。请注意,我必须使用 ubuntu 容器来验证这一点。由于容器只有基本命令,所以我从dockerhub中提取最新的ubuntu映像,并在其上安装了ping,ip和路由命令,以验证容器与主机的连接性。
在我的ubuntu容器中,我输入了route命令来检查IP表
root@8a7d33102d90:/# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.31.80.1 0.0.0.0 UG 1 0 0 eth0
172.31.80.0 * 255.255.0.0 U 0 0 0 eth0
在IP路由表中,我可以将网桥IP视为默认路由。此条目验证我的容器可以与docker网桥网络通信。我可以使用此IP访问我的主机或主机IP上的任何服务(我使用主机IP,因为这是静态的,在动态IP的情况下更喜欢使用网桥网络IP或dns)
现在在我的ubuntu容器中,我可以ping桥接IP和我的主机IP:
root@8a7d33102d90:/# ping 172.31.80.1
PING 172.31.80.1 (172.31.80.1) 56(84) bytes of data.
64 bytes from 172.31.80.1: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.31.80.1: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 172.31.80.1: icmp_seq=3 ttl=64 time=0.116 ms
root@8a7d33102d90:/# ping 10.25.241.37
PING 10.25.241.37 (10.25.241.37) 56(84) bytes of data.
64 bytes from 10.25.241.37: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 10.25.241.37: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 10.25.241.37: icmp_seq=3 ttl=64 time=0.116 ms
请注意,10.25.241.37是我的Ethernet0适配器的IPv4地址,您可以通过在powershell中键入ipconfig命令来检查:
PS C:\Windows\system32
Windows IP Configuration
Ethernet adapter Ethernet0:
Connection-specific DNS Suffix . :
IPv4 Address. . . . . . . . . . . : 10.25.241.37
Subnet Mask . . . . . . . . . . . : 255.255.255.240
Default Gateway . . . . . . . . . : 10.25.241.33
Ethernet adapter vEthernet (nat):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::81af:fd91:a6cf:6158%15
IPv4 Address. . . . . . . . . . . : 172.31.80.1
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . :
Ethernet adapter vEthernet (56f23d8f2228039):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::7453:b5f6:e090:b8a4%22
IPv4 Address. . . . . . . . . . . : 172.20.0.1
Subnet Mask . . . . . . . . . . . : 255.255.0.0
Default Gateway . . . . . . . . . :
一旦我确认网络没有问题。我只是在我想要访问docker主机的实际容器中创建了 /etc/hosts文件。
PS C:\Windows\system32> docker exec -it a027f718c24e /bin/bash
root@a027f718c24e:/usr/local/airflow# echo '10.25.241.37 host.docker.internal' | tee -a /etc/hosts
添加此条目后,我可以从我的容器访问host.docker.internal。并不是说我添加此条目只是为了测试目的。因为我必须在正在运行的容器中添加它。因此,一旦容器停止,此文件将消失,您将需要再次创建不正确的文件。因此,我将使用计算机的 staic IP (10.25.241.37) 而不是 host.docker.internal 来向主机上托管的服务发出请求。
这是我的Docker-compose.yml 当我运行:docker-compose up时,日志错误显示: MySQL连接错误:(2002)php_network_getaddress:getaddrinfo失败:名称或服务不知道 警告:mysqli::mysqli():php_network_getaddress:getaddrinfo失败:名称或服务未知-第19行 警告:mysqli::my
问题内容: 我的机器位于具有专用DNS服务器和用于DNS解析的专用区域的专用网络上。我可以从主机上解析此区域中的主机,但不能从主机上运行的容器中解析主机。 主持人 : 集装箱 : 很明显,Google的公共DNS服务器不会解决我的私有DNS请求。我知道我可以使用或在中设置强制设置,但是我的笔记本电脑经常切换网络。似乎应该有系统的方法来解决此问题。 问题答案: Docker 通过复制主机的,并过滤掉
我试图运行在通过包含文件()在虚拟机中,但我无法连接到,并且在尝试连接失败时收到的消息如下所示: 如果您注意到,docker能够连接到docker compose文件中提到的其他服务,其中一个是前两行显示的。在docker compose文件中调用kibana的命令如下: 如果我做了,它会给我以下信息: 在这里发布这个问题之前,我在google上广泛搜索了这个问题,并尝试了人们对这个问题的各种建议
问题内容: 我在Mac OS 10.8.5上安装了docker-machine 0.1.0和docker-compose 1.1.0。 Docker-machine正常运行,并且能够通过docker-machine ssh连接。 但是无法从docker-compose连接。 无法通过http + unix://var/run/docker.sock连接到Docker守护程序-它正在运行吗? 如果它
问题内容: 我收到一条错误消息,提示我无法连接到Docker守护程序。我调查了其他人遇到类似问题的答案,但没有帮助。我正在运行Ubuntu 15.10版本。我将尝试提供我所有的信息。 Docker版本 Docker-Compose版本 如果我尝试停止或启动服务,就会发生这种情况。 如果我跑步 任何帮助将不胜感激。让我知道您是否需要更多信息。 问题答案: 我发现了这个问题,似乎可以解决我的问题。 G