无法获得两个Docker容器之间的连接
我有一个分为两部分的应用程序:前端和后端。我的前端是React JS应用程序,后端是JavaSpring引导应用程序。这个项目在Docker中运行,有3个容器:前端、后端和db(数据库)。我的问题是,我不能使我的前端和发送任何请求到我的后端容器。下面是我的Docker配置文件: Docker compose:无法获得两个Docker容器之间的连接,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我有一个分为两部分的应用程序:前端和后端。我的前端是React JS应用程序,后端是JavaSpring引导应用程序。这个项目在Docker中运行,有3个容器:前端、后端和db(数据库)。我的问题是,我不能使我的前端和发送任何请求到我的后端容器。下面是我的Docker配置文件: Docker compose: version: "3" services: db: image: postgres:9.6 container_name: db ports:
version: "3"
services:
db:
image: postgres:9.6
container_name: db
ports:
- "5433:5432"
environment:
- POSTGRES_PASSWORD=123
- POSTGRES_USER=postgres
- POSTGRES_DB=test
backend:
build:
context: ./backend
dockerfile: Dockerfile
container_name: backend
ports:
- "8085:8085"
depends_on:
- db
frontend:
container_name: frontend
build:
context: ./frontend
dockerfile: Dockerfile
expose:
- "80"
ports:
- "80:80"
links:
- backend
depends_on:
- backend
Dockerfile前端:
# Stage 0, "build-stage", based on Node.js, to build and compile the frontend
FROM node:8.12.0 as build-stage
WORKDIR /app
COPY package*.json /app/
RUN yarn
COPY ./ /app/
RUN yarn run build
# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx
FROM nginx
RUN rm -rf /usr/share/nginx/html/*
COPY --from=build-stage /app/build/ /usr/share/nginx/html
# Copy the default nginx.conf provided by tiangolo/node-frontend
COPY --from=build-stage /app/nginx.conf /etc/nginx/conf.d/default.conf
Dockerfile后端:
FROM openjdk:8
ADD /build/libs/reurb-sj-13-11-19.jar reurb-sj-13-11-19.jar
EXPOSE 8085
ENTRYPOINT ["java", "-jar", "reurb-sj-13-11-19.jar", "--app.db.host=
是否前端我已尝试向以下Ip发送请求:
- 本地主机:8085
- 172.18.0.3:8085
- 172.18.0.3
- 0.0.0.0:8085
注:我已经阅读了所有的互联网,每个人都说要放EXPOSE、PORTS和链接(docker compose内部),我已经尝试过了,但仍然不起作用。你需要连接到
后端:8085
--
您不应该使用IP连接到您的服务,而应该使用docker compose文件中列出的服务名称
注意:如果使用localhost
,则表示前端容器本身。通常0.0.0.0
用于绑定到所有IP或表示任何IP地址,而不是连接到特定IP
因此,在前端代码中,需要使用后端
作为主机名(例如后端:8085
)
看起来你已经链接了你的服务,所以网络不应该是个问题。我的建议是始终在容器内使用以下内容进行测试:
docker-compose exec frontend bash
# You may need to install packages
ping backend
telnet backend 8085
您需要连接到
后端:8085
--
您不应该使用IP连接到您的服务,而应该使用docker compose文件中列出的服务名称
注意:如果使用localhost
,则表示前端容器本身。通常0.0.0.0
用于绑定到所有IP或表示任何IP地址,而不是连接到特定IP
因此,在前端代码中,需要使用后端
作为主机名(例如后端:8085
)
看起来你已经链接了你的服务,所以网络不应该是个问题。我的建议是始终在容器内使用以下内容进行测试:
docker-compose exec frontend bash
# You may need to install packages
ping backend
telnet backend 8085
我认为值得一提的是,
link
是遗留的,最终将被删除。
资料来源:
除非你真的需要它,否则你应该为你的应用创建自定义网络。这里提供了良好的文档:
例如:
version: "3"
services:
db:
image: postgres:9.6
container_name: db
ports:
- "5433:5432"
environment:
- POSTGRES_PASSWORD=123
- POSTGRES_USER=postgres
- POSTGRES_DB=test
networks:
- new
backend:
build:
context: ./backend
dockerfile: Dockerfile
container_name: backend
ports:
- "8085:8085"
depends_on:
- db
networks:
- new
frontend:
container_name: frontend
build:
context: ./frontend
dockerfile: Dockerfile
expose:
- "80"
ports:
- "80:80"
networks:
- new
depends_on:
- backend
networks:
new:
我认为值得一提的是,
link
是遗留的,最终将被删除。
资料来源:
除非你真的需要它,否则你应该为你的应用创建自定义网络。这里提供了良好的文档:
例如:
version: "3"
services:
db:
image: postgres:9.6
container_name: db
ports:
- "5433:5432"
environment:
- POSTGRES_PASSWORD=123
- POSTGRES_USER=postgres
- POSTGRES_DB=test
networks:
- new
backend:
build:
context: ./backend
dockerfile: Dockerfile
container_name: backend
ports:
- "8085:8085"
depends_on:
- db
networks:
- new
frontend:
container_name: frontend
build:
context: ./frontend
dockerfile: Dockerfile
expose:
- "80"
ports:
- "80:80"
networks:
- new
depends_on:
- backend
networks:
new:
1-我已经尝试使用容器主机的名称(对不起,我忘记在我的问题中添加该名称),但它不起作用。它试图发送请求,但大约10秒钟后,我得到了一个错误,我在我的问题中显示。2-如果我可以从前端容器ping到后端容器,这意味着它们之间的连接正在工作?那么我的要求就行了。使用服务名称是服务之间通信的正确方式。你一定还有别的问题。2.Ping会告诉你你找到了正确的主机。telnet将说明您是否可以在端口8085上连接到该主机。顺便说一下,我不认为您实际上显示了错误,而且您的后端入口点看起来被切断了。您还可以进入后端容器,确保它正在正确侦听。你能在浏览器中连接到localhost:8085吗?@leeman24我还要补充一点,
db
是数据库的正确连接。如果设置不正确(例如,连接到127.0.0.0.1而不是db
),后端应用程序将无法工作,甚至可能无法运行start@ChatterOne是的,很好。了解要使用的主机名很重要。一旦Davi解决了所有这些问题,我希望他的应用程序能够正常工作。1-我已经尝试使用容器主机的名称(对不起,我忘了在我的问题中添加该名称),但没有成功。它试图发送请求,但大约10秒钟后,我得到了一个错误,我在我的问题中显示。2-如果我可以从前端容器ping到后端容器,这意味着它们之间的连接正在工作?那么我的要求就行了。使用服务名称是服务之间通信的正确方式。你一定还有别的问题。2.Ping会告诉你你找到了正确的主机。telnet将说明您是否可以在端口8085上连接到该主机。顺便说一下,我不认为您实际上显示了错误,而且您的后端入口点看起来被切断了。您还可以进入后端容器,确保它正在正确侦听。你能在浏览器中连接到localhost:8085吗?@leeman24我还要补充一点,db
是数据库的正确连接。如果设置不正确(例如,连接到127.0.0.0.1而不是db
),后端应用程序将无法工作,甚至可能无法运行start@ChatterOne是的,很好。了解要使用的主机名很重要。一旦Davi解决了所有这些问题,我希望他的应用程序能够正常工作。是的,我本来打算建议他改用网络,但这仍然不能解决他眼前的问题。感谢您的回复,我眼前的问题现在已经解决了,所以我稍后会测试您的回复,因为我在容器之间的通信方面有问题,我已经改变了他们的沟通方式,我将请求从docker发送到容器中,我不想,这是一条更长的路,但它现在起作用。是的,我打算建议他改用网络,但这仍然不能解决他的直接问题。感谢您的回复,我的直接问题现在已经解决,所以我