NodeJs docker 容器无法与 MySQL 服务器连接

时间:2021-06-26 10:25:28

标签: mysql node.js docker express docker-compose

我试图对我的 nodejs-mysql 应用程序进行 dockerize。我有两个容器 Nodejs 和 Mysql。 Mysql 容器有一个到 3306 的开放端口。

这是我的 Dockerfile:

FROM 节点:最新

工作目录 /app

复制包*.json ./

运行 npm install -g nodemon

运行 npm install

复制。 .

这是我的 docker-compose.yml 文件:

version: "3.8"
services:
  express-server:
    build:
      context: .
    environment: 
        MYSQL_HOST: mysql-service
        MYSQL_USER: 'root'
        MYSQL_ROOT_PASSWORD: 'root'
        MYSQL_DATABASE: 'warehouse'
    entrypoint: ["npm", "start"]
    ports:
      - "8080:8000"
    volumes:
      - .:/app
      - /app/node_modules
    depends_on:
      - mysql-service
  mysql-service:
    image: mysql
    environment: 
        MYSQL_ROOT_PASSWORD: 'root'
        MYSQL_DATABASE: 'warehouse'
    ports:
        - "3306:3306"
    volumes:
      - mysql-db-data:/var/lib/mysql
      - mysql-db-config-data:/etc/mysql
volumes:
  mysql-db-data:
  mysql-db-config-data:

出现的错误:

Building express-server
Sending build context to Docker daemon  6.009MB
Step 1/6 : FROM node:latest
 ---> 7105279fa2ab
Step 2/6 : WORKDIR /app
 ---> Using cache
 ---> ca2eb57497d7
Step 3/6 : COPY package*.json ./
 ---> Using cache
 ---> b9a292d28bde
Step 4/6 : RUN npm install -g nodemon
 ---> Using cache
 ---> 3d6a9cac2364
Step 5/6 : RUN npm install
 ---> Using cache
 ---> 4a91bb3f0306
Step 6/6 : COPY . .
 ---> 296ff4a8ff49
Successfully built 296ff4a8ff49
Successfully tagged nodejs-mysql-docker-compose_express-server:latest
Recreating nodejs-mysql-docker-compose_mysql-service_1 ... done
Recreating nodejs-mysql-docker-compose_express-server_1 ... done
Attaching to nodejs-mysql-docker-compose_mysql-service_1, nodejs-mysql-docker-compose_express-server_1
mysql-service_1   | 2021-06-26 10:15:51+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.25-1debian10 started.
mysql-service_1   | 2021-06-26 10:15:52+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql-service_1   | 2021-06-26 10:15:52+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.25-1debian10 started.
mysql-service_1   | 2021-06-26T10:15:53.360045Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.25) starting as process 1
mysql-service_1   | 2021-06-26T10:15:53.423308Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql-service_1   | 2021-06-26T10:15:54.886687Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
express-server_1  | 
express-server_1  | > nodejs-mysql-docker-compose@1.0.0 start
express-server_1  | > nodemon app.js
express-server_1  | 
express-server_1  | [nodemon] 2.0.7
express-server_1  | [nodemon] to restart at any time, enter `rs`
express-server_1  | [nodemon] watching path(s): *.*
express-server_1  | [nodemon] watching extensions: js,mjs,json
express-server_1  | [nodemon] starting `node app.js`
mysql-service_1   | 2021-06-26T10:15:55.196958Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
express-server_1  | Server is running at: 8000
mysql-service_1   | 2021-06-26T10:15:55.760561Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql-service_1   | 2021-06-26T10:15:55.762472Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
express-server_1  | /app/mysql-connect.js:14
express-server_1  |         throw err
express-server_1  |         ^
express-server_1  | 
express-server_1  | Error: connect ECONNREFUSED 172.19.0.2:3306
express-server_1  |     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1133:16)
express-server_1  |     --------------------
express-server_1  |     at Protocol._enqueue (/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
express-server_1  |     at Protocol.handshake (/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)
express-server_1  |     at Connection.connect (/app/node_modules/mysql/lib/Connection.js:116:18)
express-server_1  |     at Object.<anonymous> (/app/mysql-connect.js:12:12)
express-server_1  |     at Module._compile (node:internal/modules/cjs/loader:1109:14)
express-server_1  |     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1138:10)
express-server_1  |     at Module.load (node:internal/modules/cjs/loader:989:32)
express-server_1  |     at Function.Module._load (node:internal/modules/cjs/loader:829:14)
express-server_1  |     at Module.require (node:internal/modules/cjs/loader:1013:19)
express-server_1  |     at require (node:internal/modules/cjs/helpers:93:18) {
express-server_1  |   errno: -111,
express-server_1  |   code: 'ECONNREFUSED',
express-server_1  |   syscall: 'connect',
express-server_1  |   address: '172.19.0.2',
express-server_1  |   port: 3306,
express-server_1  |   fatal: true
express-server_1  | }
express-server_1  | [nodemon] app crashed - waiting for file changes before starting...
mysql-service_1   | 2021-06-26T10:15:55.808173Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
mysql-service_1   | 2021-06-26T10:15:55.992990Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.25'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.

如何解决这个错误?有什么我遗漏的吗?

0 个答案:

没有答案