mariadb testcontainer未暴露给localhost

ltskdhd1  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(63)

我创建了以下mariadb测试容器

@Container
private static final @NotNull MariaDBContainer<?> mariadb = getMariaDBTestContainer(network);

private static MariaDBContainer<?> getMariaDBTestContainer(Network network) {

    MariaDBContainer mariadb = new MariaDBContainer<>(DockerImageName.parse("mariadb").withTag("10.5.8"))
            .withDatabaseName("db")
            .withUsername("user")
            .withPassword("pw")
            .withInitScript("database.sql")
            .withNetwork(network)
            .withNetworkAliases("mariadb")
            .withExposedPorts(3306)
    
    ;
    mariadb.start();
    mariadb.setPortBindings(Collections.singletonList(mariadb.getMappedPort(3306) +":3306"));
    return mariadb;
}

本人确认
mariadb.gethost()==“localhost”和mariadb.getMappedPort(3306)== 3306
然而,在加载测试容器之后,我可以通过使用mariadb容器id而不是通过localhost从同一网络中的另一个容器访问mariadb shell。这个命令给我mariadb shell
mariadb --host <MARIADBCONTAINER_NAME> --port 3306 --user user --password
但这个命令mariadb --host localhost --port 3306 --user user --password表示ERROR 2002 (HY000): Can't connect to server on 'localhost' (99)
我想知道为什么localhost不能连接到mariadbshell

7d7tgy0s

7d7tgy0s1#

MariaDB容器端口3306将被Map到主机上的随机空闲端口,也可以参见官方Testcontainers文档中关于主机和容器之间网络连接的部分。
要在容器启动后访问端口,请使用以下方法:

// access port
mariadb.getFirstMappedPort();

// get full JDBC URL
mariadb.getJDBCUrl();

由于您正在使用MariaDBContainer模块,因此不需要使用withExpostedPorts(),它已经自动配置。
此外,我不确定你想在这里实现什么,你应该删除这段代码:

mariadb.setPortBindings(Collections.singletonList(mariadb.getMappedPort(3306) +":3306"));

关于容器之间的联网,请查看这部分文档。

相关问题