无法获得两个Docker容器之间的连接

无法获得两个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:

我有一个分为两部分的应用程序:前端和后端。我的前端是React JS应用程序,后端是JavaSpring引导应用程序。这个项目在Docker中运行,有3个容器:前端、后端和db(数据库)。我的问题是,我不能使我的前端和发送任何请求到我的后端容器。下面是我的Docker配置文件:

Docker compose:

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
当我尝试从前端发送请求时,它“启动”并等待大约10秒,然后返回一个错误。奇怪的是,我的请求没有返回任何状态


注:我已经阅读了所有的互联网,每个人都说要放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发送到容器中,我不想,这是一条更长的路,但它现在起作用。是的,我打算建议他改用网络,但这仍然不能解决他的直接问题。感谢您的回复,我的直接问题现在已经解决,所以我