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

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

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

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

MySQL

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

Node.js

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Docker

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

Q&A

解決済

1回答

10743閲覧

docker上でexpress + mysqlの環境構築をしたいが、立ち上げたアプリ内でmysqlに接続できない。Error: connect ECONNREFUSED 127.0.0.1:3306

yuta0408

総合スコア9

docker-compose

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

MySQL

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

Node.js

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Docker

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

0グッド

0クリップ

投稿2020/11/03 12:29

編集2020/11/03 12:32

前提

docker上でNode.js(Express)とmysqlの環境構築をしています。

現在までにできていること

  • docker上でexpressを起動し、ブラウザからアクセスできる状態です
  • DB用containerのmysqlにアクセスできる状態です

docker exec -it db_container shでDB用のcontainerに入り、mysqlにログインできることは確認できました。
db_containerは、今回使用しているDB用のcontainerのcontainer_name

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

expressで立ち上げたアプリケーションからDBにアクセスできません。
上に記載の通り、DB用containerのmysqlにアクセスはできるようですが、アプリ内からDBに接続しようとすると失敗してしまいます。その原因が分からず困っております。

web_container | /app/server.js:18 web_container | if (err) throw err; web_container | ^ web_container | web_container | Error: connect ECONNREFUSED 127.0.0.1:3306 web_container | at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1145:16) web_container | -------------------- web_container | at Protocol._enqueue (/app/node_modules/mysql/lib/protocol/Protocol.js:144:48) web_container | at Protocol.handshake (/app/node_modules/mysql/lib/protocol/Protocol.js:51:23) web_container | at Connection.connect (/app/node_modules/mysql/lib/Connection.js:116:18) web_container | at /app/server.js:17:7 web_container | at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) web_container | at next (/app/node_modules/express/lib/router/route.js:137:13) web_container | at Route.dispatch (/app/node_modules/express/lib/router/route.js:112:3) web_container | at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) web_container | at /app/node_modules/express/lib/router/index.js:281:22 web_container | at Function.process_params (/app/node_modules/express/lib/router/index.js:335:12) { web_container | errno: 'ECONNREFUSED', web_container | code: 'ECONNREFUSED', web_container | syscall: 'connect', web_container | address: '127.0.0.1', web_container | port: 3306, web_container | fatal: true web_container | }

該当のソースコード

app/server.js

javascript

1const express = require('express'); 2const mysql = require('mysql'); 3 4const app = express(); 5 6app.set('view engine', 'ejs'); 7 8app.get('/', (req, res) => { 9 return res.send('Hello world on docker'); 10}); 11 12// こちらでDB接続を試みていますが、上記記載の通り接続できない状態です 13app.get('/tests', async (req, res) => { 14 const con = mysql.createConnection({ 15 host: 'localhost', 16 user: 'root', 17 password: 'mysql', 18 }); 19 con.connect(function (err) { 20 if (err) throw err; 21 console.log('Connected!'); 22 }); 23}); 24 25app.listen(3000, function () { 26 console.log('Server is started.'); 27});

app/Dockerfile

FROM node:12 WORKDIR /app COPY package*.json /app/ RUN npm install EXPOSE 3000 CMD [ "node", "server.js" ]

docker-compose.yml

yml

1version: '3' 2 3volumes: 4 db-data: 5 6services: 7 web: 8 container_name: web_container 9 build: ./app 10 ports: 11 - '3000:3000' 12 volumes: 13 - './app:/app' 14 tty: true 15 stdin_open: true 16 depends_on: 17 - db 18 links: 19 - db:db 20 21 db: 22 container_name: db_container 23 image: mysql:5.7 24 volumes: 25 - './docker/db/conf/my.cnf:/etc/mysql/conf.d/mysql.cnf' 26 - './docker/db/initial_db:/docker-entrypoint-initdb.d' 27 - 'db-data:/var/lib/mysql' 28 environment: 29 - 'MYSQL_DATABASE=${MYSQL_DATABASE}' 30 - 'MYSQL_USER=${MYSQL_USER}' 31 - 'MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}' 32 - 'TZ="Asia/Tokyo"' 33 ports: 34 - '3306:3306' 35

app/package.json

json

1{ 2 "name": "node_mysql_on_docker", 3 "version": "1.0.0", 4 "description": "node_mysql_project", 5 "main": "server.js", 6 "scripts": { 7 "test": "echo \"Error: no test specified\" && exit 1", 8 "start": "node server.js" 9 }, 10 "keywords": [], 11 "author": "", 12 "license": "ISC", 13 "dependencies": { 14 "ejs": "^3.1.5", 15 "express": "^4.17.1", 16 "mysql": "^2.18.1", 17 } 18}

フォルダ構成

app
├ node_modules
├ view
├ Dockerfile
├ package-lock.json
├ package.json
├ server.js
docker
├ db
│ ├ conf
│ ├ ├ my.cnf
│ ├ initial_db
│ ├ ├ test.sql
.env
docker-compose.yml
※一部省略

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

  • docker 19.03.13
  • docker-compose 1.27.4

以上になります。非常に初歩的な内容な気もしており、大変恐縮なのですが、お力を貸していただけると大変有り難いです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Expressで指定している

host: 'localhost',

を、

host: 'db',

にしてみてください。

投稿2020/11/03 14:45

inductor

総合スコア428

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

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

yuta0408

2020/11/04 04:11

ご指摘の通りに修正してみたところ上手く動作しました。大変助かりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問