Docker 容器不响应另一个容器请求

Docker Container doesn't answer to another container requests

我开始使用 docker。我正在创建一个带有客户端和服务器的 COAP 应用程序。在这个应用程序中,客户端发送一个简单的请求,服务器必须响应它。我构建了在 node.js 中运行我的代码的图像。然后我使用了一个 docker-compose.yml 文件,我将在代码部分向您展示该文件。但是,服务器似乎没有响应客户端请求。

我试着查看IP地址是否分配好,似乎一切正常。我还尝试在 docker0 上使用 Wireshark,我可以看到从客户端到服务器的 coap 数据包,但我没有答案。这是docker-compose.yml

services:
 Server_Coap:
  build: './Server_Coap'
  image: 'user/mynode:latest'
  container_name: server
  ports: 
  - "8081:5683"
  networks:
   rete:
    ipv4_address: 172.19.0.3
networks:
 rete:
   ipam:
    driver: default
    config:
     - subnet: 172.19.0.0/24

客户端代码如下:

const coap = require('coap'),
req = coap.request('coap://172.19.0.3')
console.log("Client Request...")
req.on('response' , function(res){
    res.pipe(process.stdout)
})

req.end()

服务器代码如下:

var coap = require('coap')
,server = coap.createServer()


server.on('request' , function(req, res){
    console.log("New request")
    res.end('Hello ' + req.url + '\n')
})

// the default CoAP port is 5683
server.listen(function() {
    console.log("Server started")
  })

这是我的服务器 Dockerfile:

FROM node:latest

WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install 
COPY . .
EXPOSE 5683
CMD ["node" , "server.js"]

这是我的客户端 Dockerfile:

FROM node:latest 

WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 5683
CMD ["node" , "client.js"]

我想从服务器得到一个答案。 这是我得到的错误类型: │ 错误:247 秒内无回复 │ 在 Timeout._onTimeout (/usr/src/app/node_modules/coap/lib/retry_send.js:74:16) │ 在 listOnTimeout (internal/timers.js:531:17) │ 在 processTimers (internal/timers.js:475:7) │ 在 OutgoingMessage 实例上发出 'error' 事件:│ 在 RetrySend.emit (events.js:209:13) │ 在 Timeout._onTimeout (/usr/src/app/node_modules/coap/lib/retry_send.js:77:12) │ 在 listOnTimeout (internal/timers.js:531:17) │ 在 processTimers (internal/timers.js:475:7) { │ 重传超时:247

从 docker-compose 中删除不必要的网络设置。

services:
 Server_Coap:
  build: './Server_Coap'
  image: 'user/mynode:latest'
  container_name: server
  ports: 
  - "8081:5683"

并将其修改为本地主机,我假设它们在同一个容器中 运行。如果您想从外部访问,则需要提及发布端口 8081.

const coap = require('coap'),
req = coap.request('coap://localhost')
console.log("Client Request...")
req.on('response' , function(res){
    res.pipe(process.stdout)
})

req.end()
  • 如果 coap 客户端在其他容器中,最好将它们放在单个 compose 文件中,这样两者都可以在同一网络上通信。

  • 如果 coap 在主机上 运行,在容器外部,那么您可以在客户端使用 localhost:8081 进行连接。

  • 如果 coap 运行 在不同的容器中,请在客户端使用主机 ip。 host_ip:8081 从客户端连接。

要从内部不同的网络连接,只能从主机ip和发布端口连接,否则客户端将无法访问。

docker run --add-host=coab-server:YOUR_HOST_IP --rm -it coad-client

修改客户端后

req = coap.request('coap://coab-server')

如果你不想使用网络,也建议公开相同的端口"5683:5683",因为我看不到端口选项,或者你可以试试。

req = coap.request('coap://coab-server')

或使用当前端口

req = coap.request('coap://coab-server:8081')

您必须将您的客户端 docker 添加到网络中。即:

services:
 Server_Coap:
  build: './Server_Coap'
  image: 'user/mynode:latest'
  container_name: server
  ports: 
  - "8081:5683"
  networks:
   rete:
    ipv4_address: 172.19.0.3
 Client_Coap:
  build: './Client_Coap'
  image: 'user/mynode:latest'
  container_name: client
  networks:
   rete
networks:
 rete:
   ipam:
    driver: default
    config:
     - subnet: 172.19.0.0/24

通常使用 CoAP over UDP,因此端口必须分类为 udp

 ports: 
  - "8081:5683/udp"