简体   繁体   English

容器之间的通信在 docker 网络中不起作用

[英]communication between containers does not work in docker network

I'm trying to connect two containers(spring boot app and mongo db) through docker network.我正在尝试通过 docker 网络连接两个容器(spring boot app 和 mongo db)。

I created the docker network:我创建了 docker 网络:

docker network create springmongo

Then, I create the docker db container:然后,我创建 docker 数据库容器:

docker run --network=springmongo --name=mongocontainer mongo

Then, I created the spring boot app contianer:然后,我创建了 spring 启动应用程序容器:

docker run --network=springmongo --name=mongo-client-api mongo-client-api

docker ps command show this: docker ps命令显示:

CONTAINER ID        IMAGE                  COMMAND                  CREATED              STATUS              PORTS               NAMES
213526cf2bd4        mongo-client-api       "/bin/sh -c 'exec ja…"   31 seconds ago       Up 29 seconds       8080/tcp            mongo-client-api
8f3e19c3b631        mongo                  "docker-entrypoint.s…"   About a minute ago   Up About a minute   27017/tcp           mongocontainer

My configuraion in my spring boot app is:我的 spring 启动应用程序中的配置是:

spring.data.mongodb.uri=mongodb://mongocontainer:27017/test

When spring boot container start, it can't connect to mongo db: spring启动容器启动时,无法连接mongo db:

2020-04-14 08:15:20.525  INFO 1 --- [           main] p.c.e.m.MongoClientApiApplication        : Starting MongoClientApiApplication v0.0.1-SNAPSHOT on 213526cf2bd4 with PID 1 (/opt/app.jar started by root in /opt)
2020-04-14 08:15:20.536  INFO 1 --- [           main] p.c.e.m.MongoClientApiApplication        : No active profile set, falling back to default profiles: default
2020-04-14 08:15:21.923  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data MongoDB repositories in DEFAULT mode.
2020-04-14 08:15:22.036  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 105ms. Found 1 MongoDB repository interfaces.
2020-04-14 08:15:23.015  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-04-14 08:15:23.033  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-04-14 08:15:23.035  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.33]
2020-04-14 08:15:23.156  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-04-14 08:15:23.157  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2436 ms
2020-04-14 08:15:23.523  INFO 1 --- [           main] org.mongodb.driver.cluster               : Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
2020-04-14 08:15:23.617  INFO 1 --- [localhost:27017] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server localhost:27017

com.mongodb.MongoSocketOpenException: Exception opening socket
        at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[mongodb-driver-core-3.11.2.jar!/:na]
        at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:128) ~[mongodb-driver-core-3.11.2.jar!/:na]
        at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) ~[mongodb-driver-core-3.11.2.jar!/:na]
        at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
        at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]

Why I can't connect these two containers?为什么我不能连接这两个容器?

Thanks in advance提前致谢

UPDATE 1更新 1

I add logs from mongo container:我从 mongo 容器添加日志:

2020-04-14T08:14:30.464+0000 I  CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2020-04-14T08:14:30.467+0000 W  ASIO     [main] No TransportLayer configured during NetworkInterface startup
2020-04-14T08:14:30.467+0000 I  CONTROL  [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=8f3e19c3b631
2020-04-14T08:14:30.467+0000 I  CONTROL  [initandlisten] db version v4.2.5
2020-04-14T08:14:30.467+0000 I  CONTROL  [initandlisten] git version: 2261279b51ea13df08ae708ff278f0679c59dc32
2020-04-14T08:14:30.467+0000 I  CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.1.1  11 Sep 2018
2020-04-14T08:14:30.467+0000 I  CONTROL  [initandlisten] allocator: tcmalloc
2020-04-14T08:14:30.467+0000 I  CONTROL  [initandlisten] modules: none
2020-04-14T08:14:30.467+0000 I  CONTROL  [initandlisten] build environment:
2020-04-14T08:14:30.467+0000 I  CONTROL  [initandlisten]     distmod: ubuntu1804
2020-04-14T08:14:30.467+0000 I  CONTROL  [initandlisten]     distarch: x86_64
2020-04-14T08:14:30.467+0000 I  CONTROL  [initandlisten]     target_arch: x86_64
2020-04-14T08:14:30.467+0000 I  CONTROL  [initandlisten] options: { net: { bindIp: "*" } }
2020-04-14T08:14:30.468+0000 I  STORAGE  [initandlisten]
2020-04-14T08:14:30.468+0000 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2020-04-14T08:14:30.468+0000 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2020-04-14T08:14:30.468+0000 I  STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=556M,cache_overflow=(file_max=0M),session_max=33000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000,close_scan_interval=10,close_handle_minimum=250),statistics_log=(wait=0),verbose=[recovery_progress,checkpoint_progress],
2020-04-14T08:14:31.134+0000 I  STORAGE  [initandlisten] WiredTiger message [1586852071:134123][1:0x7f8c32783b00], txn-recover: Set global recovery timestamp: (0, 0)
2020-04-14T08:14:31.677+0000 I  RECOVERY [initandlisten] WiredTiger recoveryTimestamp. Ts: Timestamp(0, 0)
2020-04-14T08:14:31.697+0000 I  STORAGE  [initandlisten] Timestamp monitor starting
2020-04-14T08:14:31.703+0000 I  CONTROL  [initandlisten]
2020-04-14T08:14:31.703+0000 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-04-14T08:14:31.704+0000 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2020-04-14T08:14:31.704+0000 I  CONTROL  [initandlisten]
2020-04-14T08:14:31.705+0000 I  STORAGE  [initandlisten] createCollection: admin.system.version with provided UUID: b82de6d0-72bb-4387-b456-79827a0bc50c and options: { uuid: UUID("b82de6d0-72bb-4387-b456-79827a0bc50c") }
2020-04-14T08:14:31.742+0000 I  INDEX    [initandlisten] index build: done building index _id_ on ns admin.system.version
2020-04-14T08:14:31.743+0000 I  SHARDING [initandlisten] Marking collection admin.system.version as collection version: <unsharded>
2020-04-14T08:14:31.743+0000 I  COMMAND  [initandlisten] setting featureCompatibilityVersion to 4.2
2020-04-14T08:14:31.744+0000 I  SHARDING [initandlisten] Marking collection local.system.replset as collection version: <unsharded>
2020-04-14T08:14:31.744+0000 I  STORAGE  [initandlisten] Flow Control is enabled on this deployment.
2020-04-14T08:14:31.745+0000 I  SHARDING [initandlisten] Marking collection admin.system.roles as collection version: <unsharded>
2020-04-14T08:14:31.745+0000 I  STORAGE  [initandlisten] createCollection: local.startup_log with generated UUID: 51de49e8-f4fc-4873-a5ed-ddc3ecedbec4 and options: { capped: true, size: 10485760 }
2020-04-14T08:14:31.782+0000 I  INDEX    [initandlisten] index build: done building index _id_ on ns local.startup_log
2020-04-14T08:14:31.786+0000 I  SHARDING [initandlisten] Marking collection local.startup_log as collection version: <unsharded>
2020-04-14T08:14:31.794+0000 I  FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
2020-04-14T08:14:31.801+0000 I  SHARDING [LogicalSessionCacheRefresh] Marking collection config.system.sessions as collection version: <unsharded>
2020-04-14T08:14:31.802+0000 I  STORAGE  [LogicalSessionCacheRefresh] createCollection: config.system.sessions with provided UUID: 4e27e6b9-10d2-457c-ac54-b34d9bae09c9 and options: { uuid: UUID("4e27e6b9-10d2-457c-ac54-b34d9bae09c9") }
2020-04-14T08:14:31.802+0000 I  NETWORK  [listener] Listening on /tmp/mongodb-27017.sock
2020-04-14T08:14:31.802+0000 I  NETWORK  [listener] Listening on 0.0.0.0
2020-04-14T08:14:31.802+0000 I  NETWORK  [listener] waiting for connections on port 27017
2020-04-14T08:14:31.815+0000 I  INDEX    [LogicalSessionCacheRefresh] index build: done building index _id_ on ns config.system.sessions
2020-04-14T08:14:31.825+0000 I  INDEX    [LogicalSessionCacheRefresh] index build: starting on config.system.sessions properties: { v: 2, key: { lastUse: 1 }, name: "lsidTTLIndex", ns: "config.system.sessions", expireAfterSeconds: 1800 } using method: Hybrid
2020-04-14T08:14:31.825+0000 I  INDEX    [LogicalSessionCacheRefresh] build may temporarily use up to 200 megabytes of RAM
2020-04-14T08:14:31.825+0000 I  INDEX    [LogicalSessionCacheRefresh] index build: collection scan done. scanned 0 total records in 0 seconds
2020-04-14T08:14:31.827+0000 I  INDEX    [LogicalSessionCacheRefresh] index build: inserted 0 keys from external sorter into index in 0 seconds
2020-04-14T08:14:31.828+0000 I  INDEX    [LogicalSessionCacheRefresh] index build: done building index lsidTTLIndex on ns config.system.sessions
2020-04-14T08:14:31.830+0000 I  SHARDING [LogicalSessionCacheReap] Marking collection config.transactions as collection version: <unsharded>
2020-04-14T08:14:32.003+0000 I  SHARDING [ftdc] Marking collection local.oplog.rs as collection version: <unsharded>

you are using the name of the Docker container ( mongocontainer ) as hostname in the SpringBoot app.您在 SpringBoot 应用程序中使用 Docker 容器 ( mongocontainer ) 的名称作为主机名。

Use instead host.docker.internal which resolves to the host internal IP.改用host.docker.internal解析为主机内部 IP。 Port number is fine as this is the one exposed by the Mongo container.端口号很好,因为这是 Mongo 容器公开的端口号。

I could resolve my problem.我可以解决我的问题。

I didn't notice that when spring boot container run, it tries to connect to localhost when it should connect to host mongocontainer.我没有注意到当 spring 启动容器运行时,它会在应该连接到主机 mongocontainer 时尝试连接到 localhost。 It is due to Spring Dat Mongo connects to localhost by default.这是由于 Spring Dat Mongo 默认连接到 localhost。 So, I have to create a custom configuration to mongo database:所以,我必须为 mongo 数据库创建一个自定义配置:

spring.data.mongodb.uri=mongodb://mongocontainer:27017/test

Config class:配置 class:

@Configuration
public class MongoConfig {

    @Value("${spring.data.mongodb.uri}")
    private String uri;

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {
        return new MongoTemplate(new SimpleMongoClientDbFactory(new ConnectionString(this.uri)));
    }
}

And exclude some autoconfiguration classes:并排除一些自动配置类:

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
public class MongoClientApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(MongoClientApiApplication.class, args);
    }

}

Then I again run my mongo and spring boot container:然后我再次运行我的 mongo 和 spring 引导容器:

docker run --network=springmongo --name=mongocontainer mongo (I was not necessary specify ports) docker run --network=springmongo --name=mongocontainer mongo (我没有必要指定端口)

Before run spring boot container, I had to create the image again for update my spring boot app with last changes (very important):在运行 spring 引导容器之前,我必须再次创建映像以更新我的 spring 引导应用程序和最后的更改(非常重要):

docker build -t mongo-client-api .

Then run spring boot container:然后运行 spring 引导容器:

docker run --network=springmongo -p 8080:8080 --rm --name=mongo-client-api mongo-client-api

Now, for getting the IP of my spring boot app I run this command:现在,为了获取我的 spring 启动应用程序的 IP,我运行以下命令:

minikube ip (I'm using minikube) minikube ip (我正在使用 minikube)

As additional data: when I use host.docker.internal instead of mongocontainer I never can connect to my mongo container.作为附加数据:当我使用host.docker.internal而不是mongocontainer时,我永远无法连接到我的 mongo 容器。 I ran ping from spring boot container to host.docker.internal but I neither could connect我从 spring 引导容器运行 ping 到host.docker.internal但我都无法连接

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM