I have a docker setup with five containers:
- nginx
- php-fpm
- mysql
- mailhog
- websocket (nodejs server)
I have only recently migrated the websocket server into a docker container and all is working fine, apart from the database connection. Everytime I attempt to run a query, I get the following error:
{ 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 }
I've checked the connection details and they are exactly the same as my PHP api which runs within the nginx/fpm containers:
var db = mysql.createPool({
        host: "db",
        port: "3360",
        user: "root",
        password: "pw",
        database: "livechat"
    });
Here is my 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:
I've logged into the 'websocket' container and pinged the 'db' container successfully too:
# 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
Why can't I connect to the mysql server from the websocket server?
Also, these connection details are for a localised dev env. So i'm not too concerned about the 'security' of these logins.
