Docker 集装箱之间的连接被拒绝
我尝试将运行SpringBoot2应用程序的容器链接到运行mongo的容器,但连接被拒绝 docker compose文件为mongo提供了一个容器(稍后还会在此处为spring boot添加另一个容器) 弹簧靴的dockerfileDocker 集装箱之间的连接被拒绝,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
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
通信(或反之亦然),无需相同的“docker网络”api_b
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