如何访问 Docker 容器中的节点 API
How to Access Node API within Docker Container
我在 Docker 上有一个三层应用程序,它包含以下内容:
1. Adonis 应用程序作为应用程序的 api 服务器
2. MongoDB 数据库
3. 用于客户端应用程序的 NuxtJS 应用程序。
当我 运行 在本地使用 docker-compose up
应用程序时,它似乎启动得很好。但是,当我尝试使用邮递员 (localhost:3333) 访问 api 或尝试在我的浏览器 (localhost:3000/) 上访问 Next 应用程序时,我收到 "Could not get any response" 错误和 "Cannot open the page error" 分别.
除了在 docker-compose.yml 文件中指定端口映射外,我还尝试在每个组件的 Docker 文件中公开端口。
这是我的 DockerAPI 应用程序文件
# The API application
FROM node:alpine
WORKDIR home/api
COPY ./server-api/package.json .
RUN npm install
COPY ./server-api .
EXPOSE 3333
CMD ["npm", "start"]
这是 NuxtJS 应用程序的Docker文件
# The Web application
FROM node:latest
WORKDIR home/app
COPY ./web-client/package.json .
RUN npm install
COPY ./web-client .
EXPOSE 3000
CMD ["npm", "start"]
这是我的 docker-compose.yml 文件
version: '3'
services:
api:
build: ./server
restart: always
ports:
- "3333:3333"
mongodb:
image: 'mongo'
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: NoneOfYourBusiness
web:
build: ./web
restart: always
ports:
- "3000:3000"
当我向 "localhost:3333/" 发送 GET 请求时,我希望得到 "test" 的响应。但是,我从 Postman 收到 "Could not get any response" 错误。
当我通过浏览器访问 "localhost:3000/" 时,我希望得到一个页面。相反,它说它无法连接到服务器。
如果您想使用本地主机访问,您应该与码头工人共享您的主机网络接口。否则,lo iface 是不同的。
毫无疑问,试试这个 docker-compose:
version: '3'
services:
api:
build: ./server
restart: always
network_mode: "host"
ports:
- "3333:3333"
mongodb:
image: 'mongo'
restart: always
network_mode: "host"
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: NoneOfYourBusiness
web:
build: ./web
restart: always
network_mode: "host"
ports:
- "3000:3000"
来自您的机器:
您应该可以使用 localhost:3333
当前的设置。您可以仔细检查程序是否正在侦听端口 3333(lsof -i:3333
on linux)。
从你的内部 docker:
设置网络并使用容器名称调用它们,示例
version: '3'
networks:
back:
services:
api:
build: ./server
restart: always
ports:
- "3333:3333"
networks:
- back
mongodb:
image: 'mongo'
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: NoneOfYourBusiness
networks:
- back
web:
build: ./web
restart: always
ports:
- "3000:3000"
networks:
- back
从 web
容器中,您可以为 api 调用 api:3333
。
顺便说一句,您不需要 Dockerfile 中的 EXPOSES 3333
,因为它已经在 docker-compose 文件中完成。
我在 Docker 上有一个三层应用程序,它包含以下内容: 1. Adonis 应用程序作为应用程序的 api 服务器 2. MongoDB 数据库 3. 用于客户端应用程序的 NuxtJS 应用程序。
当我 运行 在本地使用 docker-compose up
应用程序时,它似乎启动得很好。但是,当我尝试使用邮递员 (localhost:3333) 访问 api 或尝试在我的浏览器 (localhost:3000/) 上访问 Next 应用程序时,我收到 "Could not get any response" 错误和 "Cannot open the page error" 分别.
除了在 docker-compose.yml 文件中指定端口映射外,我还尝试在每个组件的 Docker 文件中公开端口。
这是我的 DockerAPI 应用程序文件
# The API application
FROM node:alpine
WORKDIR home/api
COPY ./server-api/package.json .
RUN npm install
COPY ./server-api .
EXPOSE 3333
CMD ["npm", "start"]
这是 NuxtJS 应用程序的Docker文件
# The Web application
FROM node:latest
WORKDIR home/app
COPY ./web-client/package.json .
RUN npm install
COPY ./web-client .
EXPOSE 3000
CMD ["npm", "start"]
这是我的 docker-compose.yml 文件
version: '3'
services:
api:
build: ./server
restart: always
ports:
- "3333:3333"
mongodb:
image: 'mongo'
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: NoneOfYourBusiness
web:
build: ./web
restart: always
ports:
- "3000:3000"
当我向 "localhost:3333/" 发送 GET 请求时,我希望得到 "test" 的响应。但是,我从 Postman 收到 "Could not get any response" 错误。
当我通过浏览器访问 "localhost:3000/" 时,我希望得到一个页面。相反,它说它无法连接到服务器。
如果您想使用本地主机访问,您应该与码头工人共享您的主机网络接口。否则,lo iface 是不同的。 毫无疑问,试试这个 docker-compose:
version: '3'
services:
api:
build: ./server
restart: always
network_mode: "host"
ports:
- "3333:3333"
mongodb:
image: 'mongo'
restart: always
network_mode: "host"
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: NoneOfYourBusiness
web:
build: ./web
restart: always
network_mode: "host"
ports:
- "3000:3000"
来自您的机器:
您应该可以使用 localhost:3333
当前的设置。您可以仔细检查程序是否正在侦听端口 3333(lsof -i:3333
on linux)。
从你的内部 docker:
设置网络并使用容器名称调用它们,示例
version: '3'
networks:
back:
services:
api:
build: ./server
restart: always
ports:
- "3333:3333"
networks:
- back
mongodb:
image: 'mongo'
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: NoneOfYourBusiness
networks:
- back
web:
build: ./web
restart: always
ports:
- "3000:3000"
networks:
- back
从 web
容器中,您可以为 api 调用 api:3333
。
顺便说一句,您不需要 Dockerfile 中的 EXPOSES 3333
,因为它已经在 docker-compose 文件中完成。