无法通过 Docker 容器运行 NodeJS 微服务

Posted

技术标签:

【中文标题】无法通过 Docker 容器运行 NodeJS 微服务【英文标题】:Unable to run NodeJS microservices through Docker containers 【发布时间】:2020-09-14 09:48:04 【问题描述】:

我刚开始使用 Docker,创建了几个小型 Express(NodeJS) 服务。 计划是在 Docker 容器中运行微服务,然后使用 Docker Compose 服务名称在它们之间建立相互通信。

这是这个简单项目的Github repo。我能够使用以下命令构建图像:

cd books
docker build -t node-micro/books .
cd auth
docker build -t node-micro/auth .

启动容器的命令:

docker run -d -p 6677:6677 node-micro/auth

docker run -d -p 7766:7766 node-micro/books

但是当我点击下面的 URL 时没有响应,这在前几天运行良好:

http://localhost:6677/

http://localhost:7766/

并且不知道 docker compose 发生了什么。停止所有容器后访问上述相同的 URL 没有运气,删除所有图像并运行此命令:

docker-compose up -d

在单独启动容器以及通过 docker-compose 启动容器方面需要一些帮助。

【问题讨论】:

@nischay 提供的解决方案有效,但想知道为什么这两个微服务应该在各自容器内的不同端口上运行?喜欢3000 & 3005 【参考方案1】:

我可以在您的每个微服务中看到,您的应用程序在容器中的 3000 端口上运行,但您在 docker-compose.yml 中暴露了 77666677

请查看下方docker-compose.yml

version: '3'
services:
  books:
    build: './books'
    ports:
      - "7766:3000"
    depends_on: 
      - auth

  auth:
    build: './auth'
    ports:
      - "6677:3005"

然后运行下面的命令

docker-compose up --build 

--build 也会构建镜像。

那么,你应该可以访问服务了

http://localhost:6677/

http://localhost:7766/

输出

docker-compose up --build
Creating network "node_microservices_default" with the default driver
Building auth
Step 1/7 : FROM node:10-alpine
 ---> 0aa7bb41deca
Step 2/7 : WORKDIR /usr
 ---> Running in a1dc67b70538
Removing intermediate container a1dc67b70538
 ---> 5fc74fc80a14
Step 3/7 : COPY package*.json ./
 ---> 454f1b7aba87
Step 4/7 : RUN npm install
 ---> Running in a24eea8b79d4
npm WARN auth@1.0.0 No description
npm WARN auth@1.0.0 No repository field.

added 50 packages from 37 contributors and audited 50 packages in 8.58s
found 0 vulnerabilities

Removing intermediate container a24eea8b79d4
 ---> 31b31ff4516e
Step 5/7 : COPY . .
 ---> 1eeaa8e70300
Step 6/7 : EXPOSE 3000
 ---> Running in fc798167dbcd
Removing intermediate container fc798167dbcd
 ---> 4d964d25c099
Step 7/7 : CMD ["npm", "start"]
 ---> Running in 3c28d92f9ef6
Removing intermediate container 3c28d92f9ef6
 ---> 514f68d11d7c
Successfully built 514f68d11d7c
Successfully tagged node_microservices_auth:latest
Building books
Step 1/7 : FROM node:10-alpine
 ---> 0aa7bb41deca
Step 2/7 : WORKDIR /usr
 ---> Using cache
 ---> 5fc74fc80a14
Step 3/7 : COPY package*.json ./
 ---> 56addb6c75a5
Step 4/7 : RUN npm install
 ---> Running in 4864fb7a171c
npm WARN books@1.0.0 No description
npm WARN books@1.0.0 No repository field.

added 50 packages from 37 contributors and audited 50 packages in 5.111s
found 0 vulnerabilities

Removing intermediate container 4864fb7a171c
 ---> 82bb2cd54357
Step 5/7 : COPY . .
 ---> 12893a93e82e
Step 6/7 : EXPOSE 3000
 ---> Running in 1301e29dbd52
Removing intermediate container 1301e29dbd52
 ---> c26948ebcb3b
Step 7/7 : CMD ["npm", "start"]
 ---> Running in db948866a121
Removing intermediate container db948866a121
 ---> 703b901d7bc4
Successfully built 703b901d7bc4
Successfully tagged node_microservices_books:latest
Creating node_microservices_auth_1 ... done
Creating node_microservices_books_1 ... done
Attaching to node_microservices_auth_1, node_microservices_books_1
auth_1   | 
auth_1   | > auth@1.0.0 start /usr
auth_1   | > node index.js
auth_1   | 
auth_1   | Running on port 3005
auth_1   | --------------------------
books_1  | 
books_1  | > books@1.0.0 start /usr
books_1  | > node index.js
books_1  | 
books_1  | Running on port 3000
books_1  | --------------------------

【讨论】:

是否强制映射到Dockerfile 中提到的相同端口?我在想docker-compose.yml 中的ports 配置将覆盖Dockerfile 中的配置。 docker-compose.yml 无论如何都会覆盖这些端口,但您的应用程序本身正在3000 端口上运行。 访问http://localhost:6677/ 并没有给出任何响应,因为其他微服务工作正常。你在本地试过吗? 哦,那我可以删除Dockerfile 中的ports 配置,只依赖docker-compose.yaml 对吧? 是的,您可以将其从 dockerfile 中删除。【参考方案2】:

端口映射错误。在这两个 Dockerfile 中,您都暴露了端口 3000。 所以你必须将端口 6677 和 7766 映射到 Dockerfile 上的暴露端口。

要解决此问题,您必须在 docker-compose.yml 上配置如下端口:

version: '3'
services:
  books:
    build: './books'
    ports:
      - "7766:3000"
    depends_on: 
      - auth

  auth:
    build: './auth'
    ports:
      - "6677:3000"

【讨论】:

【参考方案3】:

您正在从两个 Dockerfile 公开端口 3000。替换 docker-compose.yml 文件中每个微服务的端口。

  - "7766:3000"
  - "6677:3000"

【讨论】:

以上是关于无法通过 Docker 容器运行 NodeJS 微服务的主要内容,如果未能解决你的问题,请参考以下文章

docker中无法通过ZUUL api网关连接微服务

如何通过Google Cloud调试在Docker容器内运行的Nodejs应用程序

如何通过 Google Cloud 调试在 Docker 容器中运行的 Nodejs 应用程序

带有 Angular2 应用程序和 NodeJs 的 Docker 容器没有响应

Elastic Beanstalk 上的 NodeJS 多容器 Docker

无法使用入口点运行 docker 容器