【问题标题】:Springboot and Mongo containers are not connectingSpring Boot 和 Mongo 容器未连接
【发布时间】:2020-08-06 04:08:44
【问题描述】:

我正在使用 docker compose 在本地机器上运行 2 个容器。第一个是 mongo 容器,第二个是 spring boot 应用程序。

这是我的 Spring Boot 的 Dockerfile

VOLUME /tmp
ADD target/app.jar app.jar
EXPOSE 8080
RUN bash -c "touch /app.jar"
ENTRYPOINT ["java","-Dspring.data.mongodb.uri=mongodb://mongo/test", "-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

这是我的 Spring Boot 的应用程序属性

# mongodb configuration0
dockerspring.data.mongodb.uri= mongodb://mongo:27000/test

这是我的 docker-compose.yml

version: '3.1'

services: 

  level-2-springboot:
    image: level-2:latest
    restart: always
    container_name: level_2_microservice
    ports:
      - 8081:8080
    working_dir: /tmp
    depends_on: 
      - mongo

  mongo:
    image: mongo
    container_name: mongo
    ports: 
      - 27000:27017
    restart: always

这是我的 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yash</groupId>
    <artifactId>spring-sync-ms</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-sync</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>            
        </dependency>       
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <finalName>app</finalName>
    </build>

</project>

我执行这个来为我的 Spring Boot 应用程序创建映像

docker build -t level-2 .

看到我的图像后,我执行docker-compose up,它们工作得很好,没有错误

这是正在运行的容器

但是当我向 localhost:8081/api/employees/localhost:8080/api/employees/ 发出 POST 或 GET 请求时,我会从 Postman 那里收到这条消息

无法得到任何回应

下面是我的项目结构

如果我在 eclipse 和 mongo 上手动运行应用程序并执行 POST/GET 请求,我会得到 201 OK,但是当我在容器中使用 docker 执行此操作时,它们不会相互通信。有人知道这是什么原因吗?

【问题讨论】:

  • 尝试在 docker 容器外运行你的app.jar,确保它被正确打包
  • 你的意思是把 docker-compose.yml 带到 spring 同步之外,然后 docker-compose up 在 spring 同步之外?
  • Could not get any response 这听起来像是你的 @Controller 类的问题
  • @Gewure 这就是我的想法,但是当我在没有容器和 docker 的情况下执行此操作时(意味着将其作为 Spring Boot 应用程序手动运行),它没有问题,这有意义吗?

标签: spring mongodb docker containers


【解决方案1】:

这个:
# mongodb configuration0 dockerspring.data.mongodb.uri= mongodb://mongo:27000/test

应该是:
# mongodb configuration0 dockerspring.data.mongodb.uri= mongodb://mongo:27017/test

docker-compose.yml 中的两个服务将端口 8081 和 27000 暴露给 主机
但是在 docker-compose 创建的网络中,它们会暴露端口 8080 和 27017。 由于您的 Mongo-Container 在 docker-compose 网络中运行,它必须使用端口 27017 连接到数据库。

【讨论】:

  • 我更改了 uri,但在发布或获取请求时仍然无法正常工作
【解决方案2】:

我已经咨询了互联网,我想我得到了你需要的东西。

接下来的问题是“我们的服务容器如何与 Mongo 容器?”为此,我们进入容器链接。 当你运行一个容器时,你可以传递一个可选的–link参数, 指定新容器需要运行的容器 name 能够与之交流。

所以用我们的命令

docker run -P -d --name employee --link mongodb microservicedemo/employee 

我们启动新的容器镜像,在后台公开其端口 (-P) (-d),将其命名为雇员 (-name),并告诉它链接到 名为“mongodb”(--link)的容器。链接这些会执行以下操作:

在员工容器中创建一个主机文件条目,指向 MongoDB容器的运行位置插入了一些 员工容器中的环境变量,以协助任何 需要其他编程访问。

看到他们运行:docker exec employee bash -c 'env |grep MONGODB' 允许容器直接通过暴露的端口进行通信,因此无需 担心软管机器零件映射。

见: https://www.3pillarglobal.com/insights/building-a-microservice-architecture-with-spring-boot-and-docker-part-iii

https://www.3pillarglobal.com/insights/building-a-microservice-architecture-with-spring-boot-and-docker-part-ii

【讨论】:

  • 如果我运行这个 不会破坏使用 docker compose 的目的吗?
猜你喜欢
  • 2019-06-02
  • 2019-03-14
  • 2019-11-18
  • 2019-01-29
  • 2018-06-23
  • 2020-07-21
  • 2020-07-19
  • 2021-06-04
  • 2019-11-25
相关资源
最近更新 更多