【问题标题】:Node + Flask server Docker containers not able to communicate over same networkNode + Flask 服务器 Docker 容器无法通过同一网络进行通信
【发布时间】:2021-01-17 06:37:09
【问题描述】:

我有 2 个微服务正在通过 docker-compose 进行 docker 化。一旦我的节点服务 ping 我的 python 服务,我的连接就会被拒绝。

我可以通过 Postman 独立 ping 两个服务,一切看起来都很好。似乎容器到容器网络是我遇到的问题。节点服务器正在通过Axios ping 一个请求,如下所示:

    const res = await axios.get('bot:9000/test')

Python 端的服务器代码如下所示:

@app.route('/test', methods=['GET'])
async def tester():
    return jsonify(data='hi'), 200

编写文件

version: '3'
services:
  bot:
    build:
      dockerfile: Dockerfile.dev
      context: ./app-bot
    volumes:
      - /app/node_modules
      - ./app-bot:/app
    environment: 
      - TELEGRAM_API_KEY=xxxx
      - BOT_PORT=4040
  channel-scraper:
    restart: always
    image: quart-app
    environment:
      - QUART_APP=api
    build:
      context: ./app-channelscrape/server
      dockerfile: Dockerfile
    ports:
    - "9000:9000"
    env_file:
    - .env

节点 Docker 文件

FROM node:alpine
WORKDIR "/app"
COPY ./package.json ./
RUN npm install
RUN npm install -g nodemon
COPY . .
CMD ["npm", "run", "start"]

Flask Docker 文件

FROM python:3.7-alpine

RUN adduser -D quart
WORKDIR /home/quart

COPY ./requirements.txt ./
RUN rm -rf /var/cache/apk/*
RUN pip install --no-cache-dir -r requirements.txt --upgrade && \
  chown -R quart:quart ./

COPY ./ /home/quart/
USER quart

CMD ["quart", "run", "-h", "0.0.0.0", "-p", "9000"]

【问题讨论】:

  • 看起来您正在向 bot 作为主机名发出请求,但来自机器人服务本身;您的意思是拨打http://channel-scraper:9000 以联系其他服务吗?
  • @DavidMaze 是的,这确实是问题所在。 :) 昨晚注意到了这一点。谢谢

标签: python node.js docker flask


【解决方案1】:

您只需要确保要相互通信的容器位于同一网络上。
将此代码添加到 docker-compose 文件的末尾

networks:
  some-net:
    driver: bridge

然后添加这个,就像你想在这个网络中的哪个服务中一样

    networks:
      - some-net

你的代码会是这样的

version: '3'
services:
  bot:
    build:
      dockerfile: Dockerfile.dev
      context: ./app-bot
    volumes:
      - /app/node_modules
      - ./app-bot:/app
    environment: 
      - TELEGRAM_API_KEY=xxxx
      - BOT_PORT=4040
    networks:
      - some-net
  channel-scraper:
    restart: always
    image: quart-app
    environment:
      - QUART_APP=api
    build:
      context: ./app-channelscrape/server
      dockerfile: Dockerfile
    ports:
      - "9000:9000"
    env_file:
      - .env
    networks:
      - some-net

networks:
  some-net:
    driver: bridge

【讨论】:

  • 遇到同样的问题。我以前也试过这个。
  • nvm.. 愚蠢的错误我在 ping 错误的服务。谢谢!
  • Compose 会自动提供一个名为 default 的网络,这不是必需的。更多详细信息在 Docker 文档中的 Networking in Compose 中。
最近更新 更多