Docker在前端JS中使用Apache容器连接NodeJS容器

时间:2018-02-17 20:54:52

标签: node.js docker socket.io docker-compose

我正在构建一个我在Docker中实现的聊天应用程序。我有一个带有socket.io的NodeJS容器和一个带有apache服务器和网站的容器。

我需要连接到网站(使用javascript)到NodeJS服务器。我查看了Docker-compose docks并阅读了有关网络的内容。文档说该地址应该是容器的名称。但是当我尝试在浏览器控制台中出现以下错误时:

GET http://nodejs:3000/socket.io/socket.io.js net::ERR_NAME_NOT_RESOLVED

整个项目在容器外部工作。我唯一想到的是NodeJs容器和Apache容器之间的连接。

抛出错误的代码:

<script type="text/javascript" src="//nodejs:3000/socket.io/socket.io.js"></script>

我的码头撰写文件:

version: '3.5'

services:

  apache:
    build:
      context: ./
      dockerfile: ./Dockerfile
    networks:
      default:
    ports:
      - 8080:80
    volumes:
      - ./:/var/www/html
    container_name: apache

  nodejs:
    image: node:latest
    working_dir: /home/node/app
    networks:
      default:
    ports:
      - '3001:3000'
    volumes:
      - './node_server/:/home/node/app'
    command: [npm, start]
    depends_on:
      - mongodb
    container_name: nodejs

networks:
  default:
    driver: bridge

有谁能解释我如何成功地将apache容器连接到NodeJS容器,以便它可以提供socket.io.js文件?
如果需要,我可以提供更多的源代码。

1 个答案:

答案 0 :(得分:0)

nodejs服务正在暴露端口3001而不是3000. 3001:3000是一个端口映射,它将3001转发到:3000容器端口。所以你需要将它指向nodejs:3001

但是,由于浏览器无法访问nodejs主机名,因此我认为不会有效。您需要将其指向运行docker的主机,因为您在那里暴露了这些端口。如果您在本地运行它,它可能看起来像:

<script type="text/javascript" src="//localhost:3001/socket.io/socket.io.js"></script>

换句话说,您没有从apache服务连接到nodejs服务器,而是通过浏览器从外部访问它。