我有一个正在运行的Docker容器(来自this图片)。据我所知,容器似乎正在正常运行(日志文件看起来很好,可以通过SSH连接到容器并在其中使用SQLPlus)。但是,我无法从主机连接到容器。
我像这样启动容器:
sudo docker run -d -p 49160:22 -p 49161:1521 -p 49162:8080 alexeiled/docker-oracle-xe-11g
我通过这次检查了端口绑定:
$ sudo docker port <container> 8080
0.0.0.0:49162
当我做sudo docker inspect <container>
时,我得到了其他人:
"NetworkSettings": {
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"Gateway": "172.17.42.1",
"Bridge": "docker0",
"PortMapping": null,
"Ports": {
"1521/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "49161"
}
],
"22/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "49160"
}
],
"8080/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "49162"
}
]
}
},
当我尝试ping容器时,容器响应:
$ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_req=1 ttl=64 time=0.138 ms
64 bytes from 172.17.0.2: icmp_req=2 ttl=64 time=0.132 ms
但我无法从我的主机(Windows)连接到Docker容器。我在Ubuntu 12.04虚拟机中运行Docker(在Windows上的VirtualBox中)。我不确定Docker,Linux VM或VirtualBox是否存在问题。我在VirtualBox中转发了一堆端口:
这是sudo netstat -tpla
:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:sunrpc *:* LISTEN 542/rpcbind
tcp 0 0 *:ssh *:* LISTEN 1661/sshd
tcp 0 0 *:51201 *:* LISTEN 831/rpc.statd
tcp 0 80 docker:ssh 10.0.2.2:62220 ESTABLISHED 1902/sshd: vagrant
tcp6 0 0 [::]:49160 [::]:* LISTEN 2388/docker
tcp6 0 0 [::]:49161 [::]:* LISTEN 2388/docker
tcp6 0 0 [::]:56105 [::]:* LISTEN 831/rpc.statd
tcp6 0 0 [::]:49162 [::]:* LISTEN 2388/docker
tcp6 0 0 [::]:sunrpc [::]:* LISTEN 542/rpcbind
tcp6 0 0 [::]:ssh [::]:* LISTEN 1661/sshd
知道为什么我无法从Windows连接到我的(正在运行的)Docker容器吗?
答案 0 :(得分:12)
<强>更新强>
您的配置对我来说似乎没问题,但我认为端口49160-49162
应该绑定到IPv4接口而不是IPv6。我用Google搜索了,似乎你在docker中遇到了一个开放的bug:
我看到了两个问题的解决方案:
172.17.42.1:49162:8080
编辑前的答案:
您无法ping通端口。 Ping正在使用ICMP协议。
如果您无法连接到已发布的端口,则可以检查docker容器中的特定服务是否绑定到正确的网络接口(f.e。0.0.0.0
)而不是localhost
。您可以检查容器中的所有侦听端口:netstat -tpla
。
答案 1 :(得分:2)
当您在Windows中运行docker时,构造就像这样
Windows machine [
Docker Virtual Box VM [
Container1,
Container2,
...
]
]
因此,当您在容器中公开端口并将其绑定到主机中的所有地址时,请使用-p
参数,该端口实际上在docker虚拟机VM中公开,而不是在Windows计算机上公开。
比如说你跑
docker run --name MyContainerWithPortExpose -d -p 127.0.0.1:43306:3306 SomeImage:V1
从Windows命令提示符运行netstat
命令。奇怪的是,您无法在localhost:43306
模式
LISTEN
端口
现在从boot2docker ssh
控制台执行boot2docker
以登录docker虚拟机VM
运行netstat
命令。 Vola .....你会在docker虚拟机框上找到localhost:43306
解决方法:
进入Virtual Box VM后,运行ipconfig
命令并查找VM的IP地址。在run docker命令中使用此IP,而不是127.0.0.1
这项工作的不利之处在于,每次启动boot2docker
虚拟机虚拟机时,您的DHCP服务器都会通过分配不同的IP来进行严重破坏。