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

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

ただいまの
回答率

87.51%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,030

score 9

前提

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

const express = require('express');
const mysql = require('mysql');

const app = express();

app.set('view engine', 'ejs');

app.get('/', (req, res) => {
  return res.send('Hello world on docker');
});

// こちらでDB接続を試みていますが、上記記載の通り接続できない状態です
app.get('/tests', async (req, res) => {
  const con = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'mysql',
  });
  con.connect(function (err) {
    if (err) throw err;
    console.log('Connected!');
  });
});

app.listen(3000, function () {
  console.log('Server is started.');
});

app/Dockerfile

FROM node:12

WORKDIR /app
COPY package*.json /app/
RUN npm install

EXPOSE 3000
CMD [ "node", "server.js" ]

docker-compose.yml

version: '3'

volumes:
  db-data:

services:
  web:
    container_name: web_container
    build: ./app
    ports:
      - '3000:3000'
    volumes:
      - './app:/app'
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db:db

  db:
    container_name: db_container
    image: mysql:5.7
    volumes:
      - './docker/db/conf/my.cnf:/etc/mysql/conf.d/mysql.cnf'
      - './docker/db/initial_db:/docker-entrypoint-initdb.d'
      - 'db-data:/var/lib/mysql'
    environment:
      - 'MYSQL_DATABASE=${MYSQL_DATABASE}'
      - 'MYSQL_USER=${MYSQL_USER}'
      - 'MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}'
      - 'TZ="Asia/Tokyo"'
    ports:
      - '3306:3306'

app/package.json

{
  "name": "node_mysql_on_docker",
  "version": "1.0.0",
  "description": "node_mysql_project",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "ejs": "^3.1.5",
    "express": "^4.17.1",
    "mysql": "^2.18.1",
  }
}

フォルダ構成

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

Expressで指定している

host: 'localhost',

を、

host: 'db',

にしてみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/11/04 13:11

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

    キャンセル

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

  • ただいまの回答率 87.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

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