繁体   English   中英

系统能够连接到 mysql docker,但其他 docker 容器不能

[英]System able to connect to mysql docker, but other docker container cannot

这是我的 docker-compose 文件:

version: '3.9'
services:
  mysql:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_DATABASE: 'admindb'
      MYSQL_USER: 'admin'
      MYSQL_PASSWORD: 'secretpassword'
      MYSQL_ROOT_PASSWORD: 'someverysecretpassword'
    ports:
      - '3306:3306'
      - '33060:33060'
    volumes:
      - ./db:/var/lib/mysql
    networks:
      - adminnet
  app:
    image: "node:latest"
    depends_on:
      - mysql
    user: "node"
    restart: unless-stopped
    working_dir: /home/app
    environment:
      NODE_ENV: production
    volumes:
      - ${PWD}/../:/home/app
    ports:
      - '8081:8081'
    command: "npm start"
    networks:
      - adminnet
volumes:
  db:
  data:

networks:
  adminnet:

这是我的 app.js:

const { Sequelize } = require('sequelize');

const sequelize = new Sequelize('admindb', 'admin', 'secretpassword', {
    host: 'mysql',
    port: 3306,
    dialect: 'mysql',
});

sequelize
  .authenticate()
  .then(() => {
    console.log('Connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });

当我只运行 MySQL 容器(因此,如果我从 docker-compose 文件中删除“app”实例)并将host:'mysql'替换为host:'127.0.0.1'并从我的主机运行npm start ,它能够成功连接到从容器运行的数据库。

但是,如果我从一个容器运行 app.js,它应该连接到另一个容器内的数据库,它就不起作用。 我使用host:'mysql' ,但我不断收到以下错误:

containers-app-1    | Unable to connect to the database: ConnectionError [SequelizeConnectionError]: connect ETIMEDOUT
containers-app-1    |     at ConnectionManager.connect (/home/app/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:102:17)
containers-app-1    |     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
containers-app-1    |     at async ConnectionManager._connect (/home/app/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:220:24)
containers-app-1    |     at async /home/app/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:174:32
containers-app-1    |     at async ConnectionManager.getConnection (/home/app/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:197:7)
containers-app-1    |     at async /home/app/node_modules/sequelize/lib/sequelize.js:301:26
containers-app-1    |     at async Sequelize.authenticate (/home/app/node_modules/sequelize/lib/sequelize.js:453:5) {
containers-app-1    |   parent: Error: connect ETIMEDOUT
containers-app-1    |       at Connection._handleTimeoutError (/home/app/node_modules/mysql2/lib/connection.js:189:17)
containers-app-1    |       at listOnTimeout (node:internal/timers:564:17)
containers-app-1    |       at process.processTimers (node:internal/timers:507:7) {
containers-app-1    |     errorno: 'ETIMEDOUT',
containers-app-1    |     code: 'ETIMEDOUT',
containers-app-1    |     syscall: 'connect',
containers-app-1    |     fatal: true
containers-app-1    |   },
containers-app-1    |   original: Error: connect ETIMEDOUT
containers-app-1    |       at Connection._handleTimeoutError (/home/app/node_modules/mysql2/lib/connection.js:189:17)
containers-app-1    |       at listOnTimeout (node:internal/timers:564:17)
containers-app-1    |       at process.processTimers (node:internal/timers:507:7) {
containers-app-1    |     errorno: 'ETIMEDOUT',
containers-app-1    |     code: 'ETIMEDOUT',
containers-app-1    |     syscall: 'connect',
containers-app-1    |     fatal: true
containers-app-1    |   }
containers-app-1    | }

某些东西使节点容器无法连接到 mysql-container 内的数据库。 我尝试使用节点容器中的 ping,但该包不可用。

我阅读了大量网页,并且在过去的几个小时里一直在调试,但没有运气。 有谁可能知道这个问题? 我已经尝试了所有类似的 StackOverflow 问题和解决方案,但没有任何运气。

我在我的机器上测试了你的堆栈,第二次运行后我成功地工作了。 由于您的depends_on选项,我运行了两次(请参阅下面的注释)。

这是我的机器规格:

机器: MacBook Air(M1,2020)
操作系统: macOS Monterey v12.4
Docker 版本: 20.10.12(随 .dmg 一起安装)
Docker Compose 版本:未使用——最新版本的 docker 将其作为子命令包含在内

这是一个带有我的应用程序工作副本的 git 存储库:
https://github.com/CodyEakins/question-73053680

我认为这个问题有多种原因:

  1. 您的 docker docker-compose.yml文件的depends_on选项。 如果您阅读有关depends_on文档,您会看到您的app服务在尝试连接之前不会等待mysql健康。 如果你想在连接之前确保mysql是健康的,你必须使用healthcheck选项
  2. 您的机器上的 docker 内部主机网络存在问题。 如果不知道您正在使用什么操作系统或您正在运行什么版本的 Docker,这很难诊断。
  3. 如果您在 Docker 中使用 swarm 模式,则卷的本地绑定挂载可能会出现问题/错误。 不建议。

PS - 我还对我的 repo 中docker-compose.yml文件进行了一些细微的更改,即关于如何将应用程序的包绑定到容器中。 查看我的app服务的volumes选项( 链接)与您自己的。

尝试将我的 repo 克隆到一个单独的目录中。 构建/运行它,让我知道结果。 您可能必须使用docker system prune来确保我的堆栈实例与您的堆栈实例没有冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM