前提
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
以上になります。非常に初歩的な内容な気もしており、大変恐縮なのですが、お力を貸していただけると大変有り難いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/04 04:11