容器之间的连接被拒绝

Cla*_*uja 7 docker docker-compose

我尝试将运行 spring boot 2 应用程序的容器链接到运行 mongo 的容器,但连接被拒绝

docker-compose 文件有一个 mongo 容器(稍后也会在此处添加另一个用于 spring boot 的容器)

version: '3.1'

services:
  mongo:
    image: mongo
    container_name: springboot-mongo
    ports:
      - 27017:27017
    volumes:
      - $HOME/data/springboot-mongo-data:/data/db
      - $HOME/data/springboot-mongo-bkp:/data/bkp
    restart: always
Run Code Online (Sandbox Code Playgroud)

用于 Spring Boot 的 dockerfile

FROM openjdk:11
RUN apt-get update && apt-get install bash
RUN mkdir -p /opt/app
ENV PROJECT_HOME /opt/app
COPY build/libs/recipe-book.jar $PROJECT_HOME/recipe-book.jar
WORKDIR $PROJECT_HOME
CMD ["java", "-Dspring.data.mongodb.uri=mongodb://springboot-mongo:27017/recipes", "-jar","./recipe-book.jar"]
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的方式发送命令行 mongo uri:使用 localhost 而不是 springboot-mongo,我还尝试了这里的描述https://www.baeldung.com/spring-boot-command-line-arguments,更多具体来说-Dspring-boot.run.arguments=--spring.data.mongodb.uri=mongodb://springboot-mongo:27017/recipes。每次似乎都会遇到连接被拒绝的情况。

如何让 spring 容器连接到 mongo?

谢谢

更新,我还尝试将第二个容器添加到 docker-compose 文件中,如此

version: '3.1'

services:
  springboot:
    build: .
    restart: always
    container_name: springboot
    ports:
      - 8182:8080
    working_dir: /opt/app
    depends_on:
      - mongo

  mongo:
    image: mongo
    container_name: springboot-mongo
    ports:
      - 27017:27017
    volumes:
      - $HOME/data/springboot-mongo-data:/data/db
      - $HOME/data/springboot-mongo-bkp:/data/bkp
    restart: always
Run Code Online (Sandbox Code Playgroud)

更新2:

我设法部分解决了这个问题,首先在我的计算机上本地构建图像,然后在 docker-compose 文件中使用创建的图像,并作为-Dspring.data.mongodb.uri=mongodb://springboot-mongo:27017/recipes参数,但仍然没有运气直接在 docker-compose 文件中构建它

shu*_*304 5

如果你想让两个容器相互通信,那么你需要将它们放在同一个 docker 网络中

像这样更新你的 docker-compose.yml 文件:

version: '3.1'
services:
  springboot:
    build: .
    restart: always
    container_name: springboot
    ports:
      - 8182:8080
    working_dir: /opt/app
    depends_on:
      - mongo
    networks:
      - local

  mongo:
    image: mongo
    container_name: springboot-mongo
    ports:
      - 27017:27017
    volumes:
      - $HOME/data/springboot-mongo-data:/data/db
      - $HOME/data/springboot-mongo-bkp:/data/bkp
    restart: always
    networks:
      - local
networks:
  local:
    driver: bridge
Run Code Online (Sandbox Code Playgroud)

  • 我的所有容器都有相同的网络,但我仍然收到“连接被拒绝”的消息 (41认同)
  • @hldev 那是两年前的事了,我什么都不记得了。但我可以说,如果你使用 docker 网络,你应该指定 docker 服务名称(而不是容器名称)作为连接中的主机名或任何你拥有的主机名。在这种情况下,这将是“mongo”而不是 localhost。 (5认同)

小智 5

您实际上并不需要使用 docker-compose。

让我们一步一步地工作:

创建一个网络,例如:

docker network create network-labolida
Run Code Online (Sandbox Code Playgroud)

启动两个容器:

docker run --hostname=www1 -p 81:8080  --net=network-labolida --name=www1  -t www1 
Run Code Online (Sandbox Code Playgroud)
docker run --hostname=www2 -p 82:8080  --net=network-labolida --name=www2  -t www2 
Run Code Online (Sandbox Code Playgroud)

验证一下:

docker network inspect network-labolida
Run Code Online (Sandbox Code Playgroud)

这将告诉您与该网络关联的容器名称。

然后,诀窍是:使用容器名称!

不要使用暴露的端口,而应使用内部端口:8080!

我是说:

如果您想从主机访问包含的服务,例如使用 PostMan,请使用:

http://127.0.0.1:81/api/mymicroservice/

http://127.0.0.1:89/api/mymicroservice/
Run Code Online (Sandbox Code Playgroud)

如果您想要的是让您的contanier-01访问contanier-02,那么使用:

http://www2:8080/api/mymicroservice/
Run Code Online (Sandbox Code Playgroud)

(主机名+内部端口) 来自container-01。