【问题标题】:Docker-compose server unreachableDocker-compose 服务器无法访问
【发布时间】:2021-04-10 16:36:00
【问题描述】:

我正在使用这个目录方案开发一个网站:

.
├── api
│   ├── here is my backend application
│   └── Dockerfile,
├── client
│   ├── here is my frontend application
│   └── Dockerfile
├── docker-compose

我在 NuxtJS 中有这个 Dockerfile 的前端:

FROM node:10

# Create app directory
WORKDIR /app

COPY package.json /app

RUN npm install

COPY . /app

RUN npm run build

ENV HOST 0.0.0.0
EXPOSE 3000

# start command
CMD [ "npm", "start"]

我的后端是带有这个 Dockerfile 的strapi:

FROM strapi/base:latest

# Create app directory
WORKDIR /app

COPY package.json /app

# install
RUN npm install

COPY . /app

# RUN rm yarn.lock
# RUN npm
RUN npm run build

ENV HOST 0.0.0.0
EXPOSE 1337

# start command
CMD [ "npm", "start"]

最后这是我的 docker-compose.yaml 文件:

version: '3'

services:
  frontend:
    build:
      context: ./client
      dockerfile: Dockerfile
    volumes:
      - ./client:/app
      - /app/node_modules
      - /app/.nuxt
    stdin_open: true
    tty: true
    environment:
      - HOST=0.0.0.0
      - CHOKIDAR_USEPOLLING=true
    ports:
      - 3000:3000
    depends_on:
      - "backend"

  backend:
    build:
      context: ./api
      dockerfile: Dockerfile
    volumes:
      - ./api:/app
      - /app/node_modules
    stdin_open: true
    tty: true
    environment:
      - HOST=0.0.0.0
      - CHOKIDAR_USEPOLLING=true
    ports:
      - 1337:1337

当我尝试分别构建两个图像然后运行它们时,一切正常,前端能够调用后端。但是,如果我尝试使用 docker-compose up 使用 docker-compose,前端和后端都会启动,但前端无法访问后端。你能帮我看看有什么问题吗?为什么?

谢谢

【问题讨论】:

  • 你得到的错误到底是什么,你在哪里看到的?后端服务器的位置如何配置?
  • 您的前端使用哪个主机名来尝试访问后端?在 Compose 中,它可以在 backend:1337(= 容器名称)下访问。您在前端应用程序中使用了什么以及仅通过 docker 运行时如何启动它们,它在哪里工作?
  • 这是错误我得到服务器错误:应用程序中发生错误,无法提供您的页面。如果您是应用程序所有者,请查看您的日志以了解详细信息。
  • 是的,后端可以通过我的浏览器在 localhost:1337 下访问
  • 这是我前端页面的屏幕,我向后端发送请求。 imgur.com/a/fbDJb7V其他没有使用axios请求的页面也可以正常使用

标签: docker


【解决方案1】:

Compose 将启动两个不同的 Docker 容器加入网络(请参阅https://docs.docker.com/compose/networking/)。

他们可以通过您在撰写文件中使用的名称相互访问:

  • 后端容器可以通过 http://frontend:3000 访问前端
  • 通过 http://backend:1337 为前端容器提供后端

这与您从运行 docker 的主机访问它们的方式不同。在那里你可以使用本地主机。从每个容器中,您需要使用正确的网络名称。 因为在前端容器中只有前端在运行和监听,所以没有人在 localhost:1337 上监听。

通常,您可以通过环境变量配置后端 url,并使用 localhost 作为默认值,以便在没有 docker 的情况下在本地运行它们。 在 Docker Compose 中,您需要像使用 HOST 一样通过 environment 部分覆盖配置参数。

检查您的前端框架应该如何做到这一点: https://nuxtjs.org/docs/2.x/configuration-glossary/configuration-env

【讨论】:

  • 如果这有帮助,请将答案标记为解决方案。所以它没有被列为未回答的问题,其他人直接看到这是解决方案。我也得到了一些积分:)。
  • 奇怪的是:Strapi 使用路径 /auth/local 进行登录。 localhost:1337/auth/local -----> 有效 backend:1337/auth/local ------> 无效
  • 也许 Strapi 仅配置为侦听/响应 localhost 或存在一些 CORS 问题。但我不知道斯特拉皮。当网络解决并且一个容器可以与另一个容器通信时,您最好的尝试是检查 Strapi 的配置以获取有关代理、其他主机名的提示或打开一个新问题。
  • 或者您是否使用本地主机的后端:1337/auth/local?
猜你喜欢
  • 1970-01-01
  • 2020-09-12
  • 2019-11-22
  • 2019-10-22
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
相关资源
最近更新 更多