nodejs服务器docker容器无法连接到mysql docker容器(ECONNREFUSED)

时间:2020-11-06 08:27:02

标签: mysql node.js docker

我有一个包含五个容器的docker设置:

  • nginx
  • php-fpm
  • mysql
  • mailhog
  • websocket(nodejs服务器)

我最近才将websocket服务器迁移到docker容器中,除了数据库连接之外,其他一切都工作正常。每次尝试运行查询时,都会出现以下错误:

{ Error: connect ECONNREFUSED 172.20.0.2:3360

at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)

--------------------

at Protocol._enqueue (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)

at Protocol.handshake (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)

at PoolConnection.connect (/usr/src/app/node_modules/mysql/lib/Connection.js:116:18)

at Pool.getConnection (/usr/src/app/node_modules/mysql/lib/Pool.js:48:16)

at Pool.query (/usr/src/app/node_modules/mysql/lib/Pool.js:202:8)

at Object.exports.getRoom (/usr/src/app/db.js:30:8)

at Socket.socket.on (/usr/src/app/index.js:175:16)

/usr/src/app/db.js:35

at Socket.emit (events.js:198:13)

at /usr/src/app/node_modules/socket.io/lib/socket.js:528:12

at process._tickCallback (internal/process/next_tick.js:61:11)

errno: 'ECONNREFUSED',

code: 'ECONNREFUSED',

syscall: 'connect',

address: '172.20.0.2',

port: 3360,

fatal: true }

我已经检查了连接的详细信息,它们与我的PHP api完全相同,该PHP api在nginx / fpm容器中运行:

var db = mysql.createPool({
        host: "db",
        port: "3360",
        user: "root",
        password: "pw",
        database: "livechat"
    });

这是我的docker-compose.yml:

version: '3'

services:
  nginx:
    image: nginx:alpine
    depends_on:
      - "db"
      - "fpm"
      - "websocket"
    links:
      - fpm
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./public:/var/www/live-chat-api
      - ./../live-chat/app-dist:/var/www/live-chat-app
      - ./docker/nginx/vhost.conf:/etc/nginx/conf.d/live-chat-api.conf
      - ./docker/ssl:/etc/ssl
    working_dir:
      /var/www/live-chat-api

  fpm:
    build: ./docker/php-fpm
    links:
      - "db"
    volumes:
      - ./public:/var/www/live-chat-api
      - ./../live-chat/app-dist
    working_dir:
      /var/www/live-chat-api

  db:
    image: mysql:5.7
    ports:
      - "3360:3306"
    volumes:
      - data:/var/lib/mysql
    command: --sql_mode=""
    environment:
      MYSQL_ROOT_PASSWORD: pw
      MYSQL_DATABASE: livechat
      MYSQL_USER: root
      MYSQL_PASSWORD: pw

  mailhog:
    image: mailhog/mailhog:latest
    logging:
      driver: 'none'  # disable saving logs
    ports:
      - 1025:1025
      - 8025:8025

  websocket:
    image: node:10
    depends_on:
      - "db"
    links:
      - "db"
    volumes:
      - ./../live-chat-server:/usr/src/app
    working_dir:
      /usr/src/app
    ports:
      - "3000:3000"

    command: bash -c "npm run dev"

volumes:
  data:

我已经登录到'websocket'容器并成功ping通'db'容器:

# ping db
PING db (172.20.0.2) 56(84) bytes of data.
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=1 ttl=64 time=0.159 ms
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=2 ttl=64 time=0.133 ms
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=3 ttl=64 time=0.113 ms
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=4 ttl=64 time=0.136 ms
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=5 ttl=64 time=0.163 ms
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=6 ttl=64 time=0.163 ms
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=7 ttl=64 time=0.232 ms
^C
--- db ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6153ms
rtt min/avg/max/mdev = 0.113/0.157/0.232/0.035 ms

为什么我不能从websocket服务器连接到mysql服务器?

此外,这些连接详细信息适用于本地化的开发环境。因此,我不太担心这些登录名的“安全性”。

0 个答案:

没有答案