簡體   English   中英

使用 Docker-compose 連接 MySQL 和 Node.js docker 容器時出現問題

[英]Problem connecting MySQL and Node.js docker containers using Docker-compose

我是 Docker 新手,我正在嘗試使用 docker 安裝兩個容器:一個用於 Node.js 另一個用於 MySQL

問題是 Docker 通知我一個 TCPConnect 錯誤,我不知道如何解決這個問題。 我可以從由“npm run dev”在本地初始化的代碼連接到 mysql 單個容器。

  • 整個日志信息:
mysql_container  | 2022-06-16 15:24:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.29-1debian10 started.
mysql_container  | 2022-06-16 15:24:59+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql_container  | 2022-06-16 15:24:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.29-1debian10 started.
mysql_container  | 2022-06-16 15:24:59+00:00 [Note] [Entrypoint]: Initializing database files
mysql_container  | 2022-06-16T15:24:59.807583Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.29) initializing of server in progress as process 42
mysql_container  | 2022-06-16T15:24:59.812287Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_container  | 2022-06-16T15:25:00.170661Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
node_container   |
node_container   | > tests@1.0.0 dev
node_container   | > nodemon index.js
node_container   |
node_container   | [nodemon] 2.0.16
node_container   | [nodemon] to restart at any time, enter `rs`
node_container   | [nodemon] watching path(s): *.*
node_container   | [nodemon] watching extensions: js,mjs,json
node_container   | [nodemon] starting `node index.js`



node_container   |  user:johndoe
node_container   |  password: secret
node_container   |  database: Highschool_App
node_container   |  host: mysql_container



node_container   | Server running at port 3000!
node_container   | node:events:505
node_container   |       throw er; // Unhandled 'error' event
node_container   |       ^
node_container   |
node_container   | Error: connect ECONNREFUSED <container_ip>:3306 // modified 
node_container   |     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1229:16)
node_container   | Emitted 'error' event on Connection instance at:
node_container   |     at Connection._notifyError (/usr/src/app/node_modules/mysql2/lib/connection.js:236:12)
node_container   |     at Connection._handleFatalError (/usr/src/app/node_modules/mysql2/lib/connection.js:167:10)
node_container   |     at Connection._handleNetworkError (/usr/src/app/node_modules/mysql2/lib/connection.js:180:10)
node_container   |     at Socket.emit (node:events:527:28)
node_container   |     at emitErrorNT (node:internal/streams/destroy:151:8)
node_container   |     at emitErrorCloseNT (node:internal/streams/destroy:116:3)
node_container   |     at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
node_container   |   errno: -111,
node_container   |   code: 'ECONNREFUSED',
node_container   |   syscall: 'connect',
node_container   |   address: 'ip', // It was a container ip
node_container   |   port: 3306,
node_container   |   fatal: true
node_container   | }
node_container   |
node_container   | Node.js v18.3.0
node_container   | [nodemon] app crashed - waiting for file changes before starting...
mysql_container  | 2022-06-16T15:25:01.231824Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
mysql_container  | 2022-06-16 15:25:04+00:00 [Note] [Entrypoint]: Database files initialized
mysql_container  | 2022-06-16 15:25:04+00:00 [Note] [Entrypoint]: Starting temporary server
mysql_container  | 2022-06-16T15:25:04.802668Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.29) starting as process 91
mysql_container  | 2022-06-16T15:25:04.813377Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_container  | 2022-06-16T15:25:04.925189Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_container  | 2022-06-16T15:25:05.083344Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql_container  | 2022-06-16T15:25:05.083370Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
mysql_container  | 2022-06-16T15:25:05.084820Z 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_container  | 2022-06-16T15:25:05.098414Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.29'  socket: '/var/run/mysqld/mysqld.sock'  port: 0  MySQL Community Server - GPL.
mysql_container  | 2022-06-16T15:25:05.098424Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
mysql_container  | 2022-06-16 15:25:05+00:00 [Note] [Entrypoint]: Temporary server started.
mysql_container  | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
mysql_container  | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
mysql_container  | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
mysql_container  | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
mysql_container  | 2022-06-16 15:25:06+00:00 [Note] [Entrypoint]: Creating database Highschool_App
mysql_container  | 2022-06-16 15:25:06+00:00 [Note] [Entrypoint]: Creating user johndoe
mysql_container  | 2022-06-16 15:25:06+00:00 [Note] [Entrypoint]: Giving user johndoe access to schema Highschool_App
mysql_container  |
mysql_container  | 2022-06-16 15:25:06+00:00 [Note] [Entrypoint]: Stopping temporary server
mysql_container  | 2022-06-16T15:25:06.649562Z 13 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.29).
mysql_container  | 2022-06-16T15:25:07.899110Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.29)  MySQL Community Server - GPL.
mysql_container  | 2022-06-16 15:25:08+00:00 [Note] [Entrypoint]: Temporary server stopped
mysql_container  |
mysql_container  | 2022-06-16 15:25:08+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
mysql_container  |
mysql_container  | 2022-06-16T15:25:08.844951Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.29) starting as process 1
mysql_container  | 2022-06-16T15:25:08.850280Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
mysql_container  | 2022-06-16T15:25:08.960931Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
mysql_container  | 2022-06-16T15:25:09.080235Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
mysql_container  | 2022-06-16T15:25:09.080263Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
mysql_container  | 2022-06-16T15:25:09.081813Z 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_container  | 2022-06-16T15:25:09.095132Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
mysql_container  | 2022-06-16T15:25:09.095175Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.29'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.

如果有人需要視覺幫助,我的代碼:

  • Dockerfile
# node image version
FROM node:18

# Container directory
RUN mkdir -p /user/src/app

# Project path as a work directory
WORKDIR /usr/src/app

# Copy package.json
COPY package.json ./

# Run command
RUN npm install -g typescript

# Install dependencies
RUN npm install

# Copy source code
COPY . .

# Port
EXPOSE 3000

# CMD command
CMD ["npm", "run", "dev"] 

  • 碼頭工人-compose.yml
version: "3.8"

services:
  mysqldb:
      container_name: mysql_container
      command: --authentication_policy=mysql_native_password
      image: mysql
      restart: always
      environment:
        MYSQL_USER: johndoe
        MYSQL_PASSWORD: secret
        MYSQL_ROOT_PASSWORD: password
        MYSQL_DATABASE: Highschool_App

      ports:
        - "3306:3306"
      volumes:
        - ./database/Highschool_App.sql:/user/src/app/database
  app:
      container_name: node_container
      build: 
        context: .
        dockerfile: Dockerfile
      restart: always
      environment:
        MYSQL_USER: johndoe
        MYSQL_PASSWORD: secret
        MYSQL_DATABASE: Highschool_App
        MYSQL_HOST: mysql_container
        NODEPORT: 3000

      depends_on:
        - mysqldb
      volumes:
        - .:/user/src/app
      ports:
        - "3000:3000"
  • 問題開始的我的數據庫連接腳本:'db.js'

const mysql = require('mysql2');

require('dotenv').config();

const database = mysql.createConnection({
    user: process.env.MYSQL_USER,
    host:process.env.MYSQL_HOST,
    password: process.env.MYSQL_PASSWORD,
    database: process.env.MYSQL_DATABASE
});

module.exports = database;
  • 還有我的整個 env 文件
MYSQL_USER=johndoe
MYSQL_PASSWORD=secret
MYSQL_DATABASE=example
MYSQL_HOST=mysqldb

MYSQL_ROOT_PASSWORD=password
MYSQL_PORT=3306

NODEPORT=3000

我在另一個終端中檢查了我的容器的 ip,它向我顯示嘗試連接它的 ip 與我的容器相關聯的 ip 相同:

sudo docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql_container

我的疑問是如何在兩個容器之間建立連接。 請幫忙

我會刪除

networks:
  app-tier:
    driver: bridge

在 docker-compose.yml 以及您的服務中的網絡。 我也會刪除鏈接,因為它已經過時了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM