docker - Docker-compose 服务器无法访问
问题描述
我正在用这个目录方案开发一个网站:
.
├── 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 using ,前端和后端都会启动,但是前端无法访问后端。你能帮我看看有什么问题吗?为什么?
谢谢
解决方案
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
推荐阅读
- node.js - 在函数内设置类属性
- android - 测试未能完成。原因:“由于 'keyDispatchingTimedOut',仪器运行失败”。检查设备 logcat 以获取详细信息
- pandas - 加快 pandas 中行的逻辑合并(基于条件)
- apache - 带有appache httpd服务器的websocket url抛出404错误
- angular - Angular `ng-content` 在 primeNg 表中没有按预期工作
- stripe-payments - 如何区分经常性金额与 Stripe 中的初始金额
- python - 该函数输入一个字符串列表 x 并返回一个整数 ptr
- powershell - 在 Powershell 中生成带有 X.509 证书签名的 JWT
- node.js - NodeJs 用 jsPDF 说“ReferenceError: window is not defined”
- listview - 通过 Adopter 和自定义布局项在 ListView 中显示关联数组