首页 > 解决方案 > 我在从 Docker 容器到本地运行的 API 的 API 调用中映射端口是否错误?

问题描述

更多上下文:我有一个简单的 dotnetcore API 端点(简单的 GET 端点,目前只响应 HTTP 200 状态码)。我想从运行在 Docker 容器内的 NodeJs 脚本调用该端点。然后从 Visual Studio 运行时的端点是: https://localhost:44350/api/commands

NodeJs 脚本:

const axios = require('axios');
axios.get('https://localhost:8080/api/commands')
.then(response => {
    console.log(response.status)
    console.log(response.data);
})
.catch(error => {
    console.log(error);
});

Dockerfile:

FROM node:14
WORKDIR /usr/src/app

RUN npm install
RUN npm install axios

COPY . .

EXPOSE 8080

CMD [ "node", "script.js" ]

我这样构建图像:

docker build -t <mydockerid>/jsscriptexecution . --no-cache

并这样运行:

docker run -p 44350:8080 -it --rm <mydockerid>/jsscriptexecution

当我执行该行时,我得到:

docker:来自守护进程的错误响应:端口不可用:listen tcp 0.0.0.0:44350:bind:尝试以访问权限禁止的方式访问套接字。time="2021-01-27T13:30:13+01:00" level=error msg="error waiting for container: context cancelled"

我假设我在映射端口时做错了什么,或者在 Docker 中可能无法识别“localhost”的概念。我用我机器的IP替换了localhost,但这也不起作用。我对 Docker 很陌生,但我无法想象自己是第一个处理此类问题的人..?

作为旁注,如果我将 axios.get 调用中的 url 替换为像“https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY”这样的公开可用的 API,我会得到没有任何问题的结果。因此,与其说我不能调用任何外部 API,不如说(我认为)它的“本地主机”部分无法识别..?

标签: node.jsdockerapi.net-corecontainers

解决方案


我的假设:有两个 docker 容器。

  1. .NET 核心服务
  2. NodeJS 应用程序

当你有多个容器时,当你创建一个docker-compose.yml文件时事情会变得很容易

优点是它将在这两个 docker 容器之间创建一个公共网络。

另一点:运行容器时有两个世界。

  1. docker内部(和docker网络)
  2. 主机

-p <host>:<container> 当您从主机访问时。从容器访问时使用主机端口使用容器端口。

总结答案:

  1. 创建码头工人撰写
  2. 将 nodejs 中的 localhost:8000 更改为 webapi:8000 (webapi 是 docker-compose 中的名称)

推荐阅读