Docker 集装箱之间的连接被拒绝

Docker 集装箱之间的连接被拒绝,docker,docker-compose,Docker,Docker Compose,我尝试将运行SpringBoot2应用程序的容器链接到运行mongo的容器,但连接被拒绝 docker compose文件为mongo提供了一个容器(稍后还会在此处为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/r

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

docker compose文件为mongo提供了一个容器(稍后还会在此处为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"]
我尝试了发送命令行mongo uri的不同方法:使用localhost而不是springboot mongo,我还尝试了这里对它的描述,更具体地说是
-dsspring 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
更新2:


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

如果希望两个容器相互通信,那么需要将它们放在同一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
如果你是

  • 尝试在两个容器之间通信时,连接被拒绝
  • 尝试在来自不同docker compose项目的两个容器之间进行通信和不希望使用相同的网络(因为假设它们在同一端口上有PostgreSQL或Redis容器,您更希望不更改这些端口,也不在同一网络上使用它)
  • 在本地开发并希望模仿两个docker compose项目之间的沟通
  • 在本地主机上运行两个docker compose项目
  • 专门开发Django应用程序或Django Rest Framework(drf)API,并在某些公开端口上的容器内运行应用程序
你想

  • 容器
    api_a
    api_b
    通信(或反之亦然),无需相同的“docker网络”
(以下示例)

您可以使用第二个容器的“主机”作为计算机的IP和从Docker容器内部映射的端口。您可以使用此脚本获取计算机的IP(从:):

例如:

project\u api\u a/docker compose.yml

networks:
  app-tier:
    driver: bridge

services:
  api:
    container_name: api_a
    image: api_a:latest
    depends_on:
      - postgresql
    networks:
      - app-tier
在运行Django应用程序的
api_a
容器内:
manage.py运行服务器0.0.0.0:8000

和其他项目的第二个docker-compose.yml:

project\u api\u b/docker compose yml

networks:
  app-tier:
    driver: bridge

services:
  api:
    container_name: api_b
    image: api_b:latest
    depends_on:
      - postgresql
    networks:
      - app-tier
在运行Django应用程序的
api_b
容器内:
manage.py运行服务器0.0.0.0:8001

并尝试从容器
api_a
连接到
api_b
,则
api_b
容器的URL将为:
http://:8001/


如果您使用的docker compose项目超过两个(三个或更多),并且很难为所有项目提供公共网络,那么它可能特别有价值—这是一个很好的解决方案和解决方案

如果您在容器内使用对
localhost
的引用,请使用
--network=“host”
运行docker时。

您实际上不需要使用docker compose

让我们一步一步地工作:

创建一个网络,如:

docker network create network-labolida
从两个容器开始:

docker run --hostname=www1 -p 81:8080  --net=network-labolida --name=www1  -t www1 
验证它:

docker network inspect network-labolida
这将告诉您与该网络关联的容器名称

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

不要使用暴露端口,而是使用内部端口:8080

我的意思是:

如果要从主机访问包含的服务(例如使用邮递员),请使用:

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

http://127.0.0.1:89/api/mymicroservice/
但是

如果您想让container-01访问contanier-02,请使用:

http://www2:8080/api/mymicroservice/

(主机名+内部端口)从container-01中删除。

除了@shushu304的答案外,这对有问题的容器也很有效

networks:
  - local
  - default

您是否尝试过
CMD[“java”,“-Dspring.data.mongodb.uri?”=mongodb://mongo:27017/recipes“,”-jar“,”/recipe book.jar“]
?(将springboot mongo替换为mongo)您如何运行第二个容器?您是将其添加到
docker compose.yml
文件中,还是单独运行
docker run
mongo
服务的名称:
块)有效吗?您必须将另一个添加到docker compose文件中,以在另一个文件中解析其名称。我已尝试将springboot mongo替换为just mongo,但不起作用。我正在用
docker run
调用第二个容器。我尝试将第二个容器添加到docker compose文件中,它似乎也没有任何功能effect@DavidMaze,如果我尝试
mongolocalhost:27017
它可以工作,但不
mongospringboot mongo:27017
它确实可以工作。不过,我们需要进一步研究docker及其网络是如何工作的。非常感谢您无需指定具有v2和v3组合文件语法的网络。docker compose和swarm模式都为项目/堆栈创建默认网络,但不指定网络。如果您尝试在swarm模式下运行同一个compose文件,则尝试跨多个节点通信时会中断,因为将创建的默认覆盖网络已被禁用。我对所有容器都有相同的网络,但仍然会收到“连接被拒绝”
http://127.0.0.1:81/api/mymicroservice/

http://127.0.0.1:89/api/mymicroservice/
http://www2:8080/api/mymicroservice/
networks:
  - local
  - default