Docker 警告:使用主机网络模式时,已发布的端口将被丢弃

2022-09-04 02:58:44

我有一个Springboot应用程序,我已经Dockerized了。我将其暴露在端口上,并且可以按预期访问它。8081

http://<ipaddress>:8081

问题

Docker 容器中的 Springboot 应用需要连接到同一主机(不在容器中)上的 postgres 数据库,但看起来它没有授予对主机网络的访问权限。

连接到本地主机:5432 被拒绝

Docker cmd:

docker run -t --rm -d -p 8081:8081 --name nexct-approval-service-container nexct-approval-service-image

所以我已经阅读了为了连接到网络,你可以使用:

--network host 

但是,然后它停止允许访问应用程序本身(端口 8081):

WARNING: Published ports are discarded when using host network mode

问题

如何允许访问端口 8081 上的 SpringBoot 应用程序,并允许 Springboot 应用程序访问主机网络,以便它可以连接到数据库?


更新

我的数据库连接是在 Spring Boot 中定义的:

应用程序.属性

spring.datasource1.driver-class-name=org.postgresql.Driver
spring.datasource1.jdbc-url=jdbc:postgresql://localhost:5432/pims
spring.datasource1.username=postgres
spring.datasource1.password=

多数据库配置.java

@Configuration
@ComponentScan(basePackages = "com.nexct")
public class MultipleDBConfig {

    @Bean(name = "datasource1")
    @ConfigurationProperties("spring.datasource1")
    @Primary
    public DataSource dataSource1(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "datasource2")
    @ConfigurationProperties("spring.datasource2")
    public DataSource dataSource2(){
        return DataSourceBuilder.create().build();
    }
}

答案 1

您不能在网络模式主机中发布端口。

注意: 假设容器在使用 时没有自己的容器,端口映射不会生效,并且 -p、--publish、-P 和 --publish-all 选项将被忽略,而是生成警告:IP-addresshost mode networking

主机网络

如何允许访问端口 8081 上的 SpringBoot 应用程序,并允许 Springboot 应用程序访问主机网络,以便它可以连接到数据库?

但是,无法通过将主机网络分配给容器来访问网络。要访问主机网络,您可以使用主机IP或使用Mac和窗口的特殊DNS。Host

host.docker.internal:DB_PORT

或者,如果您使用的是Linux,则可以使用Host IP。

HOST_IP:DB_PORT

或者你可以试试(在ubuntu上工作)

docker run -it --rm -e HOST_IP=$(ip -o route get to 8.8.8.8 | sed -n 's/.*src \([0-9.]\+\).*/\1/p') image_name

现在,在应用程序中用作主机名。HOST_IP


答案 2

在我的服务中,我将对 的引用替换为 ,并且我能够发布容器的端口并连接到 localhost 上的服务,而无需使用 。我的服务引用了具有主机名的 .env 文件,因此我刚刚使用更新的主机名创建了另一个 .env 文件。localhosthost.docker.internal-p--network host


推荐