java - 主机无法访问 Docker 端口

标签 java linux curl docker spring-boot

我有一个新的 Spring Boot 应用程序,我刚刚完成并尝试将其部署到 Docker。在容器内,应用程序运行良好。它使用端口 9000 处理面向用户的请求,使用端口 9100 处理运行状况检查等管理任务。当我启动一个 docker 实例并尝试访问端口 9000 时,我收到以下错误:

curl: (56) Recv failure: Connection reset by peer

经过大量实验(通过 curl),我通过几种不同的配置确认应用程序在容器内运行良好,但是当我尝试将端口映射到主机时,它无法连接。我尝试使用以下命令启动它。它们都不允许我从主机访问端口。

docker run -P=true my-app
docker run -p 9000:9000 my-app

解决方法

works 的唯一方法正在使用 --net host option ,但这不允许我在该主机上运行多个容器。

docker run -d --net=host my-app

端口和暴露实验

我使用了各种版本的 Dockerfile,暴露了不同的端口,例如 9000 和 9100 或仅 9000。这些都没有帮助。这是我的最新版本:

FROM ubuntu
MAINTAINER redacted

RUN apt-get update
RUN apt-get install openjdk-7-jre-headless -y
RUN mkdir -p /opt/app

WORKDIR /opt/app

ADD ./target/oauth-authentication-1.0.0.jar /opt/app/service.jar
ADD config.properties /opt/app/config.properties

EXPOSE 9000
ENTRYPOINT java -Dext.properties.dir=/opt/app -jar /opt/app/service.jar

Hello World 有效

为了确保我可以运行 Spring Boot 应用程序,我尝试了 Simplest-Spring-Boot-MVC-HelloWorld而且效果很好。

Netstat 结果

我使用 netstat 从主机和容器进行端口扫描:

来自主机

root@my-docker-host:~# nmap 172.17.0.71 -p9000-9200

Starting Nmap 6.40 ( http://nmap.org ) at 2014-11-14 19:19 UTC Nmap
scan report for my-docker-host (172.17.0.71)
Host is up (0.0000090s latency).
Not shown: 200 closed ports
PORT     STATE SERVICE
9100/tcp open  jetdirect
MAC Address: F2:1A:ED:F4:07:7A (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 1.48 seconds

来自容器

root@80cf20c0c1fa:/opt/app# nmap 127.0.0.1 -p9000-9200

Starting Nmap 6.40 ( http://nmap.org ) at 2014-11-14 19:20 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000070s latency).
Not shown: 199 closed ports
PORT     STATE SERVICE
9000/tcp open  cslistener
9100/tcp open  jetdirect

Nmap done: 1 IP address (1 host up) scanned in 2.25 seconds

容器正在使用 Ubuntu 我复制的主机是 Centos 和 Ubuntu。

This SO question看起来很相似,但细节很少而且没有答案,所以我想我会尝试更多地记录我的场景。

最佳答案

我遇到了类似的问题,将主机 IP 地址指定为“127.0.0.1”不会正确地将端口转发到主机。

将 Web 服务器的 IP 设置为“0.0.0.0”可以解决问题

例如 - 对于我的 Node 应用 - 以下不起作用工作

app.listen(3000, '127.0.0.1')

以下是否起作用:

app.listen(3000, '0.0.0.0')

我猜这意味着 docker 默认公开 0.0.0.0:containerPort -> 本地端口

关于java - 主机无法访问 Docker 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26937810/

相关文章:

Linux:文本文件中第 'x' 行到 'y' 行的字符数

php - 如果一个 url 是 404,curl_multi_exec 将停止,我该如何更改它?

java - pig 错误 : Failed to Parse Query

java - 比较 Storm bolt 中的上一个和下一个元组

linux - 如何在Linux上检测RAID?

linux - sendto() 数据包被内核丢弃

javascript - 如何从curl命令转换为ajax请求

php - 无法将 Azure ML API 与 PHP 集成

java - 如果最终确定,公共(public) getter 和 setter 是否适用于 Android? Java 中的最终正确性与 C++ 中的常量正确性一样重要吗?

java - 在应用程序更新无法正常工作时,下载过程已成功完成但应用程序未安装