【问题标题】:Fail to obtain connection between two Docker containers无法获取两个 Docker 容器之间的连接
【发布时间】:2020-03-23 08:25:11
【问题描述】:

我有一个分为两部分的应用程序:前端和后端。我的前端是一个 React JS 应用程序,我的后端是一个 Java Spring 启动应用程序。该项目在 Docker 中运行,有 3 个容器:前端、后端和 db(数据库)。我的问题是我不能做我的前端并向我的后端容器发送任何请求。以下是我的 Docker 配置文件:

Docker 撰写:

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 秒,然后返回错误。奇怪的是我的请求没有返回任何状态。

PS.:我已经阅读了所有互联网,每个人都说要放置 EXPOSE、PORTS 和 LINKS(在 docker-compose 中),我已经尝试过但仍然无法正常工作。

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    您需要连接到backend:8085

    --

    您不应该使用 IP 连接到您的服务,而是使用 docker-compose 文件中列出的服务名称。

    注意:如果使用localhost,则指的是前端容器本身。通常0.0.0.0 用于绑定到所有 IP 或代表任何 IP 地址,而不是连接到特定 IP。

    因此,在您的前端代码中,您需要使用 backend 作为主机名(例如,backend:8085)。

    您似乎已经链接了您的服务,因此网络应该不是问题。我的建议是始终使用以下方法在容器内进行测试:

    docker-compose exec frontend bash
    # You may need to install packages 
    ping backend
    telnet backend 8085
    

    【讨论】:

    • 1 - 我已经尝试使用容器主机的名称(抱歉,我忘了在我的问题中添加它),但它不起作用。它尝试发送请求,但大约 10 秒后,我收到了我在问题中显示的错误。 2 - 如果我可以从我的前端容器 ping 到我的后端容器,这意味着它们之间的连接正常吗?所以我的请求会奏效吗?
    • 1.使用服务名称是服务之间通信的正确方式。你一定有另一个问题。 2. Ping 会告诉你你打对了主机。 telnet 会说您是否可以在端口 8085 上连接到该主机。顺便说一下,我认为您实际上并没有显示错误,并且您的后端入口点看起来被切断了。您还可以进入您的后端容器并确保它正在正确侦听。你能在浏览器中连接到 localhost:8085 吗?
    • @leeman24 我还要补充一点,db 是数据库的正确连接。如果设置不正确(例如,连接到 127.0.0.0.1 而不是 db),后端应用程序将无法工作,甚至可能无法启动
    • @ChatterOne,是的,好点。了解要使用的主机名很重要。一旦 Davi 解决了所有这些问题,我希望他的应用程序能够正常工作。
    【解决方案2】:

    我认为值得一提的是link 是遗留的,最终将被删除。 来源:https://docs.docker.com/network/links/

    除非您真的需要它,否则您应该为您的应用创建自定义网络。好的文档在这里:https://docs.docker.com/compose/compose-file/#networks

    还有例子:

    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:
    

    【讨论】:

    • 是的,我打算建议他改用网络,但这仍然不能解决他的直接问题。
    • 感谢您的回复,我的直接问题现在已经解决了,所以我稍后会测试您的回复,因为我遇到了容器之间的通信问题,我已经改变了他们的方式通信,我正在从 docker 发送请求,并且它进入我不想要的容器中,这是一条更长的路,但它现在正在工作。
    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2018-03-01
    • 2021-03-10
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多