บทความนี้สอนวิธีติดตั้ง Node.js, Express.js และฐานข้อมูล MySQL ร่วมกับโปรแกรม Adminer ด้วย Docker Compose ซึ่งเป็นเครื่องมือที่ทำให้เราสามารถจัดการ containers หลายๆ ตัวพร้อมกันได้อย่างมีประสิทธิภาพ และมีความหยืดหยุ่นสูง โดย Docker Compose จะใช้ไฟล์ชื่อ docker-compose.yml
เนื้อหาจะแบ่งการติดตั้งออกเป็น 3 services แต่ละ service จะมี Dockerfile ของตัวเอง แต่ทั้งหมดใช้ docker-compose.yml เดียวกัน โดยมีลำดับขั้นตอนการติดตั้งดังนี้
1. ติดตั้ง Node.js และ Express.js
2. ติดตั้ง MySQL
3. ติดตั้ง Adminer
ตัวอย่าง วิธีติดตั้ง Node.js Express.js MySQL Adminer ด้วย Docker Compose
1. สร้าง folder ชื่อ myapp และสร้างไฟล์ชื่อ docker-compose.yml ใน folder myapp และเขียนคำสั่งลงใน docker-compose.yml เพื่อติดตั้งดังนี้
1.1. app: เรียก Dockerfile ใน folder app เพื่อติดตั้ง Node.js และ Express.js
1.2. db: เรียก Dockerfile ใน folder db เพื่อติดตั้ง MySQL และกำหนดรหัสผ่าน root และชื่อฐานข้อมูล
1.3. adminer: เรียก Dockerfile ใน folder adminer เพื่อติดตั้ง Adminer
version: '3.8'
services:
app:
build:
context: app
dockerfile: Dockerfile
command: npm run dev
ports:
- '3000:3000'
depends_on:
- db
volumes:
- ./app/:/app/
- /app/node_modules
db:
build:
context: db
dockerfile: Dockerfile
restart: always
environment:
MYSQL_ROOT_PASSWORD: mypassword
MYSQL_DATABASE: mydatabase
ports:
- '3306:3306'
volumes:
- db_data:/var/lib/mysql
adminer:
build:
context: adminer
dockerfile: Dockerfile
restart: always
ports:
- 8080:8080
volumes:
db_data:
2. สร้าง folder app ใน myapp และสร้างไฟล์ชื่อ Dockerfile และเขียนคำสั่งเพื่อติดตั้ง Node.js และติดตั้ง Express.js จากไฟล์ชื่อ package*.json
FROM node:14
WORKDIR /app
COPY package*.json .
RUN npm install
COPY . .
EXPOSE 3000
3. สร้างไฟล์ชื่อ package.json ใน folder app และเขียนคำสั่งเพื่อติดตั้ง Express และ Nodemon เพื่อให้ Express.js ของเรารองรับคุณสมบัติ Hot Reload (เปลี่ยนแปลงโค้ด และผลลัพธ์เปลี่ยน ไม่ต้อง Restart Server)
{
"name": "myapp",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "nodemon app.js --legacy-watch"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.18.2"
},
"devDependencies": {
"nodemon": "^3.0.1"
}
}
4. สร้างไฟล์ชื่อ app.js และเขียนโปรแกรม Express.js เป็นอันเสร็จสิ้นการติดตั้ง service Node.js และ Express.js
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello, World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
5. สร้าง folder ชื่อ db ใน folder myapp และสร้างไฟล์ชื่อ Dockerfile และเขียนคำสั่งเพื่อติดตั้ง MySQL เวอร์ชัน 8.0
FROM mysql:8.0
6. สร้าง folder ชื่อ adminer ใน folder myapp และสร้างไฟล์ชื่อ Dockerfile และเขียนคำสั่งเพื่อติดตั้ง Adminer เวอร์ชันล่าสุด และเปิด port 8080
FROM adminer
EXPOSE 8080
7. ทดสอบโดยการเข้า command line และใช้คำสั่ง docker-compose build (อย่าลืมเปิดโปรแกรม docker ก่อนรันคำสั่ง)
D:\myapp>docker-compose build
8. เมื่อ build containers ทั้งหมดแล้วให้ใช้คำสั่ง docker-compose up เพื่อสั่งรัน containers ทั้งหมด
D:\myapp>docker-compose up
9. ทดสอบ Node.js และ Express.js โดยทดสอบเข้าผ่าน URL หากสำเร็จจะเห็นข้อความ Hello World!
http://localhost:3000/
10. ทดสอบ MySQL และ Adminer โดยทดสอบเข้าผ่าน URL และกรอก ชื่อผู้เข้าใช้งาน = root / รหัสผ่าน = mypassword หากสำเร็จจะเห็นฐานข้อมูลชื่อ mydatabase
http://localhost:8080/
11. ทดสอบว่ามี 3 containers ที่รันอยู่โดยใช้คำสั่ง docker-compose ps
D:\myapp>docker-compose ps
NAME IMAGE COMMAND SERVICE
adminer adminer "entrypoint.sh php -S adminer
app app "docker-entrypoint.sh npm run dev" app
db db "docker-entrypoint.sh mysqld" db