首页 > 解决方案 > docker compose with services 和 mongo 数据库抛出错误打开套接字

问题描述

我有两个服务,它们是 application.yml 的:

category-service -> application.yml
spring:
  application:
    name: category-service

  data:
    mongodb:
      host: categoriesdb
      port: 27017
      database: categoriesdb

server:
  port: 8081
productcatalog-service -> application.yml
spring:
  application:
    name: productcatalog-service

  data:
    mongodb:
      host: productsdb
      port: 27018
      database: productsdb

server:
  port: 8080

和码头工人组成:

version: "3.8"
services:

  productcatalog-service:
    container_name: productcatalog-service
    image: productcatalog-service
    build:
      ./productcatalog-service
    ports:
      - 8080:8080
    links:
      - productsdb

  category-service:
    container_name: category-service
    image: category-service
    build:
      ./category-service
    ports:
      - 8081:8081
    links:
      - categoriesdb

  categoriesdb:
    container_name: categoriesdb
    image: mongo:latest
    volumes:
      - ./data/categories-db:/data/db"
    ports:
      - 27017:27017

  productsdb:
    container_name: productsdb
    image: mongo:latest
    volumes:
      - ./data/products-db:/data/db
    ports:
      - 27018:27017

而且我在运行时遇到问题,因为我在 docker-compose up 之后得到了:

productcatalog-service    |     at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:144) ~[mongodb-driver-core-4.1.1.jar!/:na]
productcatalog-service    |     at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]
productcatalog-service    | Caused by: java.net.UnknownHostException: productsdb: Name or service not known
productcatalog-service    |     at java.base/java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method) ~[na:na]
productcatalog-service    |     at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:932) ~[na:na]
productcatalog-service    |     at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1517) ~[na:na]
productcatalog-service    |     at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:851) ~[na:na]
productcatalog-service    |     at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1507) ~[na:na]
productcatalog-service    |     at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1366) ~[na:na]
productcatalog-service    |     at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1300) ~[na:na]
productcatalog-service    |     at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203) ~[mongodb-driver-core-4.1.1.jar!/:na]
productcatalog-service    |     ... 6 common frames omitted
productcatalog-service    | 
category-service          | 2020-12-05 23:41:05.335  INFO 1 --- [127.0.0.1:27017] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server 127.0.0.1:27017
category-service          | 
category-service          | com.mongodb.MongoSocketOpenException: Exception opening socket
category-service          |     at com.mongodb.internal.connection.AsynchronousSocketChannelStream$OpenCompletionHandler.failed(AsynchronousSocketChannelStream.java:124) ~[mongodb-driver-core-4.1.1.jar!/:na]
category-service          |     at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:129) ~[na:na]
category-service          |     at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishConnect(UnixAsynchronousSocketChannelImpl.java:285) ~[na:na]
category-service          |     at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.finish(UnixAsynchronousSocketChannelImpl.java:200) ~[na:na]
category-service          |     at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.onEvent(UnixAsynchronousSocketChannelImpl.java:215) ~[na:na]
category-service          |     at java.base/sun.nio.ch.EPollPort$EventHandlerTask.run(EPollPort.java:306) ~[na:na]
category-service          |     at java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112) ~[na:na]
category-service          |     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[na:na]
category-service          |     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[na:na]
category-service          |     at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]
category-service          | Caused by: java.net.ConnectException: Connection refused
category-service          |     at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.checkConnect(Native Method) ~[na:na]
category-service          |     at java.base/sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishConnect(UnixAsynchronousSocketChannelImpl.java:254) ~[na:na]

综上所述,我想使用一个 docker-compose 运行这两个服务,每个服务可以分配一个 mongodb。如果我对建筑的想法是错误的,请纠正我。

谢谢你的帮助!

标签: javaspringmongodbmicroservices

解决方案


似乎 productsdb 需要改变:

productsdb:
    container_name: productsdb
    image: mongo:latest
    volumes:
      - ./data/products-db:/data/db
    ports:
      - 27018:27018

推荐阅读