我有一个在端口4000上提供http服务的容器。 它已连接套接字服务器
docker-compose:
dashboard-server:
image: enginetonic:compose1.2
container_name: dashboard-server
command: node src/service/endpoint/dashboard/dashboard-server/dashboard-server.js
restart: on-failure
ports:
- 4000:4000
integration-test:
image: enginetonic:compose1.2
container_name: integration-test
testRegex "(/integration/.*|(\\.|/)(integration))\\.jsx?$$"
tty: true
服务器:
const http = require('http').createServer(handler)
const io = Io(http)
io.on('connection', socket => {
logger.debug('socket connected')
})
io.use((socket, next) => {
logger.debug('socket connection established.')
})
http.listen(4000, '127.0.0.1', () => {
console.log(
`Server running at http://127.0.0.1:4000/`
)
在docker中的输出:
Server running at http://127.0.0.1:4000/
https is listening: true
现在,我正尝试从另一个这样的容器连接到该服务器:
文件:
const url = `ws://dashboard-server:4000`
const ioc = IoC.connect(url)
ioc.on('error', error => {
console.log(error.message)
})
ioc.on('connect', res => {
console.log('connect')
})
ioc.on('connect_error', (error) => {
console.log(error.message)
})
输出:
xhr poll error
当我在终端中本地运行这两个程序时,都会得到正确的响应
{"message":"socket connection established","level":"debug"}
为什么不是套接字在容器内部建立连接,而在本地却是? 我在做什么错了?
编辑:出于可读性考虑,仅显示部分文件。套接字正常连接本地计算机,并在单独的终端中生成两个文件
答案 0 :(得分:1)
您需要链接docker容器并通过名称而不是127.0.0.1
来引用它们。 https://docs.docker.com/compose/networking提供了更多文档。您还需要收听“ 0.0.0.0”,以便您接受跨Docker网络的连接。
我在撰写文件中仅看到一个容器。如果您尝试从 outside docker连接到docker容器,则必须公开一个端口。相同的参考资料向您展示了如何。
http.listen(4000, '127.0.0.1', () => {
应成为
http.listen(4000, '0.0.0.0', () => {
以便服务器正在侦听所有地址,包括docker在docker网络上自动分配的地址。
然后客户端必须使用docker compose中给出的名称引用服务器,所以
const url = `ws://127.0.0.1:4000`
成为
const url = `ws://dashboard-server:4000`