Node.js Docker网络通信问题与多节点服务器容器通信

Node.js Docker网络通信问题与多节点服务器容器通信,node.js,docker,docker-compose,nestjs,docker-networking,Node.js,Docker,Docker Compose,Nestjs,Docker Networking,我正在尝试设置一个docker环境,其中多个容器通过REST相互通信。我的简化系统架构看起来有点像这样: FROM node:14-alpine ENV NODE_ENV=production \ NPM_CONFIG_PREFIX=/home/node/.npm-global \ PATH=$PATH:/home/node/.npm-global/bin:/home/node/node_modules/.bin:$PATH RUN apk add --no-cache tini

我正在尝试设置一个docker环境,其中多个容器通过REST相互通信。我的简化系统架构看起来有点像这样:

FROM node:14-alpine
ENV NODE_ENV=production \
    NPM_CONFIG_PREFIX=/home/node/.npm-global \
    PATH=$PATH:/home/node/.npm-global/bin:/home/node/node_modules/.bin:$PATH
RUN apk add --no-cache tini
RUN apk add iputils
RUN mkdir -p /usr/src/app/node_modules
RUN chown -R node:node /usr/src/app
USER node
WORKDIR /usr/src/app
COPY --chown=node:node package*.json ./
RUN npm ci --only=production
RUN npm cache clean --force
COPY --chown=node:node . ./
RUN ls -l
EXPOSE 80

ENTRYPOINT ["/sbin/tini", "--"]
CMD [ "npm", "start" ]
version: "3.8"

services:
  foo:
    image: "node:14-slim"
    container_name: foo-service.${ENV}
    build:
      context: .
      dockerfile: Dockerfile
      args:
        env: ${ENV}
        port: ${PORT}
    user: "node"
    working_dir: /usr/src/app
    environment:
      - NODE_ENV=production
      - VERSION=1.0
    volumes:
      - .:/usr/src/app
      - /usr/app/node_modules
    ports:
      - ${PORT}:80
    tty: true
    command: "npm start"
    networks:
      my-network:
        aliases:
            - foo-service.${ENV}

networks:
  my-network:
    driver: "bridge"
    name: my-network

假设我有两个服务
foo
bar
,它们运行在
节点
服务器(NestJS项目)上。两者的
Dockerfile
如下所示:

FROM node:14-alpine
ENV NODE_ENV=production \
    NPM_CONFIG_PREFIX=/home/node/.npm-global \
    PATH=$PATH:/home/node/.npm-global/bin:/home/node/node_modules/.bin:$PATH
RUN apk add --no-cache tini
RUN apk add iputils
RUN mkdir -p /usr/src/app/node_modules
RUN chown -R node:node /usr/src/app
USER node
WORKDIR /usr/src/app
COPY --chown=node:node package*.json ./
RUN npm ci --only=production
RUN npm cache clean --force
COPY --chown=node:node . ./
RUN ls -l
EXPOSE 80

ENTRYPOINT ["/sbin/tini", "--"]
CMD [ "npm", "start" ]
version: "3.8"

services:
  foo:
    image: "node:14-slim"
    container_name: foo-service.${ENV}
    build:
      context: .
      dockerfile: Dockerfile
      args:
        env: ${ENV}
        port: ${PORT}
    user: "node"
    working_dir: /usr/src/app
    environment:
      - NODE_ENV=production
      - VERSION=1.0
    volumes:
      - .:/usr/src/app
      - /usr/app/node_modules
    ports:
      - ${PORT}:80
    tty: true
    command: "npm start"
    networks:
      my-network:
        aliases:
            - foo-service.${ENV}

networks:
  my-network:
    driver: "bridge"
    name: my-network
docker compose
如下所示:

FROM node:14-alpine
ENV NODE_ENV=production \
    NPM_CONFIG_PREFIX=/home/node/.npm-global \
    PATH=$PATH:/home/node/.npm-global/bin:/home/node/node_modules/.bin:$PATH
RUN apk add --no-cache tini
RUN apk add iputils
RUN mkdir -p /usr/src/app/node_modules
RUN chown -R node:node /usr/src/app
USER node
WORKDIR /usr/src/app
COPY --chown=node:node package*.json ./
RUN npm ci --only=production
RUN npm cache clean --force
COPY --chown=node:node . ./
RUN ls -l
EXPOSE 80

ENTRYPOINT ["/sbin/tini", "--"]
CMD [ "npm", "start" ]
version: "3.8"

services:
  foo:
    image: "node:14-slim"
    container_name: foo-service.${ENV}
    build:
      context: .
      dockerfile: Dockerfile
      args:
        env: ${ENV}
        port: ${PORT}
    user: "node"
    working_dir: /usr/src/app
    environment:
      - NODE_ENV=production
      - VERSION=1.0
    volumes:
      - .:/usr/src/app
      - /usr/app/node_modules
    ports:
      - ${PORT}:80
    tty: true
    command: "npm start"
    networks:
      my-network:
        aliases:
            - foo-service.${ENV}

networks:
  my-network:
    driver: "bridge"
    name: my-network
我通过
my network
连接容器,并确保(
docker network inspect my network
)两个容器共享同一网络。我甚至可以相互ping(
docker exec[foo]ping[bar]

当我运行应用程序(从web界面进行REST调用)到
foo
时,
foo
将无法“连接”到
bar
。我使用如下别名从
foo
调用
bar

FROM node:14-alpine
ENV NODE_ENV=production \
    NPM_CONFIG_PREFIX=/home/node/.npm-global \
    PATH=$PATH:/home/node/.npm-global/bin:/home/node/node_modules/.bin:$PATH
RUN apk add --no-cache tini
RUN apk add iputils
RUN mkdir -p /usr/src/app/node_modules
RUN chown -R node:node /usr/src/app
USER node
WORKDIR /usr/src/app
COPY --chown=node:node package*.json ./
RUN npm ci --only=production
RUN npm cache clean --force
COPY --chown=node:node . ./
RUN ls -l
EXPOSE 80

ENTRYPOINT ["/sbin/tini", "--"]
CMD [ "npm", "start" ]
version: "3.8"

services:
  foo:
    image: "node:14-slim"
    container_name: foo-service.${ENV}
    build:
      context: .
      dockerfile: Dockerfile
      args:
        env: ${ENV}
        port: ${PORT}
    user: "node"
    working_dir: /usr/src/app
    environment:
      - NODE_ENV=production
      - VERSION=1.0
    volumes:
      - .:/usr/src/app
      - /usr/app/node_modules
    ports:
      - ${PORT}:80
    tty: true
    command: "npm start"
    networks:
      my-network:
        aliases:
            - foo-service.${ENV}

networks:
  my-network:
    driver: "bridge"
    name: my-network
this.httpService.get('http://bar-service.dev:3002/...)

我收到以下错误消息:

我猜
容器
仍然相互认识,因为DNS是由docker自动解析的(我确保
的IP地址是正确的)

经过几个小时的反复试验和研究,我想问你们。这可能是alpine的问题(以前有些人在ping节点服务器时遇到问题)。但也有可能我一直错过了一些重要的事情,却似乎没有意识到


提前谢谢

两个容器是否都侦听端口80?集装箱之间的呼叫需要使用该端口号<代码>端口:未使用(也不是必需的)。@DavidMaze这是正确答案。非常感谢。问题解决了。您介意将此作为答案发布,以便我可以将其标记为答案吗?:)