Docker Mule服务器curl错误: (56) 接收失败: 连接被对等方重置

20

可能是我对Docker的初学知识不足,但我无法使网络连接正常工作。

我正在尝试通过pr3d4t0r/mule存储库运行Mule服务器。我可以运行它,热交换应用程序,但我无法访问它。

我可以在没有Docker的情况下运行本地服务器,并且它可以完美地工作。但是使用Docker时就不行了。

当我尝试执行简单的curl命令时,我会得到“curl: (56) Recv failure: Connection reset by peer”。

curl http://localhost:8090/Sven

我尝试过通过-P和单独使用-p 8090:8090来暴露端口,但没有成功。

当Docker正在运行时,它会阻塞端口(我尝试同时运行Docker和正常服务器,但正常服务器显示端口已被占用)。

当我尝试使用像jboss/wildfly这样的另一个镜像并使用-p 8080:8080时,没有问题,它可以完美地工作。

mule-server中的应用程序将记录并响应一个简单的“Hello World”,输出表明该应用程序已部署,但尝试访问时没有任何消息或日志。

有什么建议吗?

5个回答

51
在我的情况下,实际上是应用程序配置错误。它将localhost作为主机。它应该是0.0.0.0,否则它只在本地主机上运行,即docker容器内部而不是外部。
你不应该需要使用-net=host。
因此,请检查是否有配置。

3
这个方法也适用于我,但这个解决方法没有解释原因。 :( 有人知道为什么端口转发不起作用吗?在我的情况下,我正在使用Spring Boot,并收到错误消息“Recv failure: Connection reset by peer”。 - Trevor Allred
1
@TrevorAllred:我认为这是因为Docker网络使用它自己的网络命名空间,所以容器的127.0.0.1与主机的127.0.0.1不同。 - Giacomo Catenazzi
1
在哪里进行配置? - red-devil
太棒了,但你是怎么做到的? - Brian Wiley
一些背景信息,我正在将一个Angular应用程序进行Docker化。端口转发——- 4200:4200——在我的docker-compose.yml中已经存在,但我被迫配置我的Angular应用程序使用0.0.0.0而不是localhost。在这个微小的更改之后,它可以工作了。我不知道为什么Docker会这样工作。你知道为什么Docker没有进行端口转发吗? - Kasir Barati
这真的很令人沮丧,而且很难发现,我认为真正的挑战在于你是在localhost还是0.0.0.0上运行应用程序,无论哪种情况,docker都会在docker ps -a命令中显示映射的端口为0.0.0.0:8080->8080/tcp, :::8080->8080/tcp(或者你选择的任何端口)。 - undefined

4
在application.properties文件中,需要将ip地址设置为0.0.0.0而不是127.0.0.1。请注意,应保留HTML标记。

一些背景信息,我正在将一个Angular应用程序进行Docker化。端口转发——- 4200:4200——在我的docker-compose.yml中已经存在,但我被迫配置我的Angular应用程序使用0.0.0.0而不是localhost。在这个微小的更改之后,它可以工作了。我不知道为什么Docker会这样工作。你知道为什么Docker没有进行端口转发吗? - Kasir Barati

1
错误
"curl: (56) Recv failure: Connection reset by peer"

这意味着Docker镜像中没有进程监听端口。选项-p是主机系统和镜像之间端口的绑定。
-p <port in host os to be binded to>:<port in container>

因此,请检查您的图像,可能您的容器中的应用程序使用不同的端口,您需要
-p 8080:8090

0
如果你有这个,就在你的application.properties中注释或删除server.address=localhost

0
如果有其他人遇到和我一样的问题,即在Docker中运行Phoenix Web应用程序,你需要将应用程序更改为在0.0.0.0上运行http,而不是127.0.0.1,无论你正在定位的是哪个配置文件 .exs。当我在容器中执行时,Curl可以工作,但是从我的笔记本电脑上无法工作。我在dev.exs中进行了以下更改。
    config :reunion_v2, ReunionV2Web.Endpoint,
  # Binding to loopback ipv4 address prevents access from other machines.
  # Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
  http: [ip: {0, 0, 0, 0}, port: 4000],
  check_origin: false,
  code_reloader: true,
  debug_errors: true,
  secret_key_base: "my_secret_key_bas",
  watchers: [
    # Start the esbuild watcher by calling Esbuild.install_and_run(:default, args)
    esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]}
  ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接