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

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

新規登録して質問してみよう
ただいま回答率
86.12%
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つです

解決済

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

yuta0408
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つです

1回答

0リアクション

0クリップ

7522閲覧

投稿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

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

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

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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

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つです