node.js - 我在从 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,不如说(我认为)它的“本地主机”部分无法识别..?
解决方案
我的假设:有两个 docker 容器。
- .NET 核心服务
- NodeJS 应用程序
当你有多个容器时,当你创建一个docker-compose.yml
文件时事情会变得很容易
优点是它将在这两个 docker 容器之间创建一个公共网络。
另一点:运行容器时有两个世界。
- docker内部(和docker网络)
- 主机
-p <host>:<container> 当您从主机访问时。从容器访问时使用主机端口使用容器端口。
总结答案:
- 创建码头工人撰写
- 将 nodejs 中的 localhost:8000 更改为 webapi:8000 (webapi 是 docker-compose 中的名称)
推荐阅读
- mysql - 按mysql排序后选择第一行
- php - 如何在变量中插入新行以创建 Qrcode
- php - 尝试用两个可能的外键定义关系
- sql - 在 PostgreSQL 中除以两个运行总计
- listagg - 在 Orcale 中使用 LISTAGG - ORA-00937:不是单组组函数
- java - RabbitMQ 错误 java.util.concurrent.TimeoutException: null
- python - 拆分python pandas Dataframe中列的内容并使用新分离的字符串列表创建一个新的Dataframe
- c++ - 应用程序在将数据上传到数据库之前关闭,Qt
- ruby-on-rails - 部署成功后active_admin登录失败
- python-3.x - 即使错误停止,Python 日志记录也会继续写入文件