使用docker语言 - compose连接MySQL和Node.js docker容器时出现问题



我是新的Docker,我试图用Docker组成两个容器:一个用于Node.js另一个是MySQL

问题是Docker通知我TCPConnect错误,我不知道如何解决这个问题。我可以连接到mysql的单个容器从我的代码在本地初始化"npm运行dev"。

  • 完整日志信息:
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"] 
  • docker-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以及您服务中的网络。我也会删除链接,因为它是过时的。