質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

1820閲覧

docker-composeでMySQLコンテナとAPI(Node)コンテナの接続エラー

nosuke09

総合スコア9

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

1クリップ

投稿2023/02/10 11:36

実現したいこと

docker-composeでデータベースとAPIコンテナの接続をしたい

前提

API:Node.js
DB:MySQL

docker-compose.yml内でenvironmentについて記述をし、
APIコンテナからSequelizeを用いて接続を試みています。
ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 127.0.0.1:3306というエラーが一向に解決しません。
DBコンテナにexecで入ってMySQLへのログインはできています。
コンテナが起動しているかももちろん確認しています。
MySQLを起動していないのではという記事が多かったのですが改めて確認しても問題なさそうです。
また,MySQLのバージョン8からの認証の仕様が変更されたためエラーが出るとの記述も見ましたが、5.7で実行しているので関係なさそうです。

発生している問題・エラーメッセージ

todo-api | サーバーが5001番で起動しました。 todo-api | Unable to connect to the database: ConnectionRefusedError [SequelizeConnectionRefusedError]: connect ECONNREFUSED 127.0.0.1:3306 todo-api | at ConnectionManager.connect (/home/node/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:92:17) todo-api | at process.processTicksAndRejections (node:internal/process/task_queues:95:5) todo-api | at async ConnectionManager._connect (/home/node/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:220:24) todo-api | at async /home/node/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:174:32 todo-api | at async ConnectionManager.getConnection (/home/node/node_modules/sequelize/lib/dialects/abstract/connection-manager.js:197:7) todo-api | at async /home/node/node_modules/sequelize/lib/sequelize.js:304:26 todo-api | at async Sequelize.authenticate (/home/node/node_modules/sequelize/lib/sequelize.js:456:5) todo-api | at async a (/home/node/app.js:38:5) { todo-api | parent: Error: connect ECONNREFUSED 127.0.0.1:3306 todo-api | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16) { todo-api | errno: -111, todo-api | code: 'ECONNREFUSED', todo-api | syscall: 'connect', todo-api | address: '127.0.0.1', todo-api | port: 3306, todo-api | fatal: true todo-api | }, todo-api | original: Error: connect ECONNREFUSED 127.0.0.1:3306 todo-api | at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16) { todo-api | errno: -111, todo-api | code: 'ECONNREFUSED', todo-api | syscall: 'connect', todo-api | address: '127.0.0.1', todo-api | port: 3306, todo-api | fatal: true todo-api | } todo-api | }

該当のソースコード

yml

1version: "3" 2 3services: 4 app: 5 build: ./ 6 container_name: todo-app 7 tty: true 8 ports: 9 - 3000:3000 10 volumes: 11 - ./front:/home/node 12 networks: 13 - todoapp-network 14 # command: "npm start" 15 depends_on: 16 - api 17 api: 18 build: ./ 19 container_name: todo-api 20 environment: 21 DB_HOST: db 22 DB_USER: todo 23 DB_PASS: todo 24 DB_DATABASE: todo 25 DEBUG: todoapi:server 26 tty: true 27 ports: 28 - 5001:5001 29 volumes: 30 - ./api:/home/node 31 networks: 32 - todoapp-network 33 command: "npm run dev" 34 depends_on: 35 - db 36 37 db: 38 image: mysql:5.7 39 platform: linux/amd64 40 container_name: mysql 41 restart: always 42 environment: 43 MYSQL_ROOT_HOST: todo-api 44 MYSQL_ROOT_PASSWORD: ${DB_PASS} 45 MYSQL_DATABASE: todo 46 MYSQL_USER: todo 47 MYSQL_PASSWORD: todo 48 ports: 49 - 3306:3306 50 volumes: 51 - ./db/docker/data:/var/lib/mysql 52 networks: 53 - todoapp-network 54 55 adminer: 56 image: adminer 57 restart: always 58 ports: 59 - 8080:8080 60 networks: 61 - todoapp-network 62 63networks: 64 todoapp-network:

Dockerfile

1FROM node:18-slim 2 3WORKDIR /home/node 4USER node

JavaScript

1const express = require("express"); 2const app = express(); 3const { Sequelize } = require("sequelize"); 4const PORT = 5001; 5 6const sequelize = new Sequelize("todo", "todo", "todo", { 7 host: "127.0.0.1", 8 dialect: "mysql", 9}); 10app.use((req, res, next) => { 11 res.setHeader("Access-Control-Allow-Origin", "*"); 12 res.setHeader( 13 "Access-Control-Allow-Methods", 14 "GET, POST, PUT, PATCH, DELETE, OPTION" 15 ); 16 res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); 17 next(); 18}); 19app.listen(PORT, console.log("サーバーが" + PORT + "番で起動しました。")); 20 21const a = async () => { 22 try { 23 await sequelize.authenticate(); 24 console.log("Connection has been established successfully."); 25 } catch (error) { 26 console.error("Unable to connect to the database:", error); 27 } 28}; 29a();

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuma.inaura

2023/02/10 12:24

localからは接続できますか?
nosuke09

2023/02/10 13:16

localでMySQLのコンテナには接続できます。コンテナに入った後ログインも確認できてます。
yuma.inaura

2023/02/10 13:20

127.0.0.1:3306 ではなくて 接続先host名を todo-app とすると繋がりませんか
nosuke09

2023/02/10 13:44

dbのcontainer_nameはmysqlだったのでこちらをhost名としてSequelizeをnewしたところエラーがなくなり、おそらく接続できるようになりました。 自分がmongodbは使ったことがあるがSQL系をnodeで扱ったことがなかったのと、docker-composeで環境構築等もろもろ出来る様になればというところで取り組んでいます。 sequelizeの理解が浅いので、教えていただきたいのですがhost名をcontainer_nameにすると繋がったのは何故なのでしょう?
nosuke09

2023/02/11 07:21

参考になる記事までありがとうございます。どうやらコメントのみで回答がないのでベストアンサーにできません。よろしければ短くて構わないので回答いただけないでしょうか? しばらく回答がなければ、自己解決で回答を記述しておきます。 ありがとうございました。
guest

回答1

0

ベストアンサー

接続先のホストを 127.0.0.1:3306 ではなくDBサーバーのdockerコンテナ名 ( todo-app ) とすることでつながりましたね

投稿2023/02/11 08:56

yuma.inaura

総合スコア1453

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問