当前位置: 首页 > 知识库问答 >
问题:

无法使用外部ip连接到容器优化操作系统(使用docker运行Spring启动应用程序)

方梓
2023-03-14

我已经用容器优化的操作系统映像创建了一个Google compute实例。

我已将防火墙配置为允许超文本传输协议和https。

我将docker镜像与连接到cloudsql的spring boot应用程序一起使用。当我在计算引擎实例ssh上使用run命令时,即(docker run--rm name),spring boot应用程序成功启动。

当我尝试通过计算引擎实例外部ip访问Web服务时,它不起作用。

我检查了一个不同的问题,发现我应该先在实例cli上尝试使用sudo wgethttp://localhost命令,如果它很好,那么一切都应该很好。但是我在127.0.0.1:80收到连接拒绝消息。

我还尝试了从容器优化操作系统打开端口的命令,即sudo iptables-w-A INPUT-p TCP-dport 80-j ACCEPT,但没有任何效果。

共有3个答案

宗政楚
2023-03-14

在你的帮助下,我能够建立正确的解决方案(John Hanley和Cyac)。我将两种解决方案结合起来,以帮助下一个面对这个问题的人。

正如 John 所说,默认情况下,Spring boot 使用端口 8080,而不是 80,并且按照 Cyac 的指定,您需要在 application.properties 文件中显式指定端口为 80,使用

server.port=80
  1. Make sure you expose the port 80 in docker image
  2. On GCP Contaier optimized OS make sure you have allowed traffic for HTTP and HTTPs
  3. Run command:
    sudo iptables -w -A INPUT -p tcp --dport 80 -j ACCEPT
    

    使用以下命令运行 Docker:

    docker run -p 80:80 SPRING_IMAGE.
    

    其中SPRING_IMAGE是带有spring boot build的docker映像的名称。

    使用curl http://localhost/ENDPOINT _ NAME进行测试,例如http://localhost/shops/all

冯宏放
2023-03-14

首先,确认您的 Springboot 应用程序使用的端口 - 如果是 8080 还是 80。这取决于您在 application.properties 文件中配置的内容。此端口在以下步骤中称为 ContainerPort。

  1. 执行docker运行

除非您的Spring启动应用程序存在应用程序问题,否则这些步骤应该会让您继续前进。

梁渊
2023-03-14

Spring Boot的默认端口是8080,而不是80。

在实例容器中运行此命令以查看哪些端口处于LISTENING状态:

sudo netstat -tulpn | grep LISTEN

您可以使用以下命令将端口80重定向到端口8080:

sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

注意:此< code>iptables命令仅将网络接口上的端口80重定向到8080。这对< code>localhost或< code>127.0.0.1没有影响。

对于Google Compute Engine实例,您不需要使用iptables启用端口。这是通过Google VPC防火墙规则完成的。您可以同时使用两者,但请确保您准确了解您正在配置的内容和副作用。

注意:您的Spring Boot应用程序需要监听0.0.0,而不是127.0.1localhost。最后两个是仅内部地址0.0.0.表示监听所有网络接口。

注意:不要在wget前面使用sudo。这是不必要的。

 类似资料:
  • 我有一个react-app,它简单地显示hello-world消息,但我喜欢运行应用程序通过docker-container,但有这个问题。在此消息之后,进程停止,没有运行应用程序。 我不能理解我应该做什么,因为我有一个很小的应用程序,在Dockerfile中有基本代码 我需要安装webpack-dev-server吗,我尝试了,但得到了版本错误,如“手动添加服务器”的版本比已经安装的服务器低。所

  • 无法使用maven运行spring启动应用程序。当我运行命令mvn spring boot:run时,我收到:,但在pom中。我写的xml,其中是使用该示例的主要类: 我有这个项目结构: 我希望使用spring boot和maven运行我的应用程序。但现在它不起作用了。

  • 我创建了一个SpringBoot的示例项目,以了解外部客户机功能,运行时会出现以下错误。 com.example.demo.RestClient中的字段Remote teCallClient需要一个类型为com.example.demo.Remote teCallClient的bean,但找不到。操作:考虑在配置中定义类型为com.example.demo.远程呼叫客户端的bean。 我尝试了各种

  • 我需要某种方式来启动我的Java应用程序,而不强制用户手动运行应用程序。我不完全确定我将如何做到这一点,有人能提供任何帮助吗?

  • 并运行相同的命令,它可以工作。 我如何才能从容器外部登录到MySQL服务器而不会得到任何错误?

  • 我已经运行了MYSQL容器,我能够执行它,并且能够使用“MYSQL-h 172.17.0.2-u root-p”从主机连接。我已经执行“docker run--name=mysql-host-e mysql_root_password=root-d mysql:5.7.32”来运行docker映像。 但是,当我试图通过spring boot应用程序访问时,它会拒绝以下应用程序中的属性。proper