我正在构建一个我在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文件?
如果需要,我可以提供更多的源代码。
答案 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服务器,而是通过浏览器从外部访问它。