Docker กับ Web Application: สร้าง Container สำหรับเว็บแอปพลิเคชันง่ายๆ (ตัวอย่าง Node.js)
ในบทเรียนที่แล้ว เราได้เรียนรู้พื้นฐานเกี่ยวกับ Docker และเหตุผลที่มันเป็นเครื่องมือสำคัญสำหรับนักพัฒนาและ DevOps ในบทนี้ เราจะลงมือปฏิบัติจริง โดยสร้าง Docker Container สำหรับเว็บแอปพลิเคชัน Node.js แบบง่าย เพื่อให้เห็นภาพการใช้งานจริง
ทำไมต้อง Dockerize Web Application?
ก่อนที่เราจะเริ่มสร้าง Container เรามาทบทวนเหตุผลหลักๆ ที่เราควร Dockerize Web Application กันก่อน:
- ความสอดคล้องของสภาพแวดล้อม: Docker ช่วยให้มั่นใจได้ว่าแอปพลิเคชันของเราจะทำงานเหมือนกันในทุกสภาพแวดล้อม ไม่ว่าจะเป็นเครื่องของเรา, สภาพแวดล้อมการทดสอบ, หรือ Production
- การแยกส่วน: Container จะแยกแอปพลิเคชันของเราออกจากระบบปฏิบัติการหลัก ทำให้แอปพลิเคชันมีความปลอดภัยมากขึ้น และป้องกันปัญหาการชนกันของ dependencies
- การจัดการทรัพยากร: Docker ช่วยให้เราจัดการทรัพยากรที่แอปพลิเคชันใช้ได้อย่างมีประสิทธิภาพมากขึ้น
- การ Deploy ที่ง่ายและรวดเร็ว: การสร้าง, แชร์, และ Deploy Container ทำได้ง่ายและรวดเร็ว ทำให้เราสามารถนำแอปพลิเคชันขึ้นใช้งานได้อย่างรวดเร็ว
ขั้นตอนการสร้าง Docker Container สำหรับ Node.js Application
เราจะสร้างเว็บแอปพลิเคชัน Node.js อย่างง่ายที่แสดงข้อความ "Hello, Docker!" จากนั้นเราจะ Dockerize แอปพลิเคชันนี้
1. สร้าง Node.js Application
เริ่มต้นด้วยการสร้าง directory สำหรับโปรเจ็กต์ของเรา:
mkdir node-docker-app
cd node-docker-app
จากนั้นสร้างไฟล์ package.json เพื่อจัดการ dependencies:
npm init -y
สร้างไฟล์ index.js ซึ่งจะเป็นโค้ดหลักของเว็บแอปพลิเคชันของเรา:
// index.js
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello, Docker!');
});
app.listen(port, () => {
console.log(`App listening on port ${port}`);
});
เราใช้ Express.js ซึ่งเป็น framework ยอดนิยมสำหรับสร้างเว็บแอปพลิเคชัน Node.js ติดตั้ง Express.js:
npm install express
ตอนนี้เรามีเว็บแอปพลิเคชัน Node.js ที่พร้อมใช้งานแล้ว ลองรันดู:
node index.js
เปิด browser ไปที่ http://localhost:3000 คุณควรเห็นข้อความ "Hello, Docker!"
2. สร้าง Dockerfile
Dockerfile คือไฟล์ที่ประกอบไปด้วยคำสั่งที่ใช้สร้าง Docker Image เราจะสร้างไฟล์ Dockerfile ใน directory เดียวกับ index.js:
# Dockerfile
FROM node:16
# สร้าง directory สำหรับ app
WORKDIR /app
# คัดลอก package.json และ package-lock.json (ถ้ามี)
COPY package*.json ./
# ติดตั้ง dependencies
RUN npm install
# คัดลอก source code ของ app
COPY . .
# เปิด port 3000
EXPOSE 3000
# Command ที่ใช้รัน app
CMD ["node", "index.js"]
มาดูคำสั่งแต่ละบรรทัดใน Dockerfile กัน:
FROM node:16: ระบุ base image ที่เราจะใช้ สร้าง Container ของเรา เราใช้ Node.js เวอร์ชั่น 16WORKDIR /app: กำหนด working directory ภายใน Container เป็น/appCOPY package*.json ./: คัดลอกไฟล์package.jsonและpackage-lock.json(ถ้ามี) จาก host machine ไปยัง ContainerRUN npm install: รันคำสั่งnpm installภายใน Container เพื่อติดตั้ง dependenciesCOPY . .: คัดลอก source code ทั้งหมดจาก host machine ไปยัง ContainerEXPOSE 3000: บอก Docker ว่า Container จะ listen บน port 3000CMD ["node", "index.js"]: กำหนด command ที่ใช้รันแอปพลิเคชัน เมื่อ Container เริ่มทำงาน
3. สร้าง Docker Image
ตอนนี้เรามี Dockerfile แล้ว เราสามารถสร้าง Docker Image ได้โดยใช้คำสั่ง docker build:
docker build -t node-docker-app .
คำสั่งนี้จะสร้าง Docker Image ชื่อ node-docker-app โดยใช้ Dockerfile ที่อยู่ใน directory ปัจจุบัน (.)
หลังจากสร้าง Image เสร็จแล้ว คุณสามารถดู Image ที่สร้างได้โดยใช้คำสั่ง:
docker images
4. รัน Docker Container
เมื่อเรามี Docker Image แล้ว เราสามารถรัน Container จาก Image นั้นได้โดยใช้คำสั่ง docker run:
docker run -p 3000:3000 node-docker-app
คำสั่งนี้จะรัน Container จาก Image node-docker-app และ map port 3000 บน host machine ไปยัง port 3000 ใน Container (-p 3000:3000) การ Map Port นี้จะทำให้เราสามารถเข้าถึงแอปพลิเคชันที่รันอยู่ใน Container ผ่าน browser ได้
เปิด browser ไปที่ http://localhost:3000 คุณควรเห็นข้อความ "Hello, Docker!" อีกครั้ง แต่ครั้งนี้แอปพลิเคชันกำลังรันอยู่ภายใน Docker Container
5. ตรวจสอบ Container
คุณสามารถดู Container ที่กำลังรันอยู่ได้โดยใช้คำสั่ง:
docker ps
คำสั่งนี้จะแสดงรายการ Container ที่กำลังรันอยู่ รวมถึง Container ID, Image ที่ใช้, port mapping, และสถานะ
หากต้องการหยุด Container คุณสามารถใช้คำสั่ง:
docker stop <container_id>
โดยแทนที่ <container_id> ด้วย Container ID ที่ได้จากคำสั่ง docker ps
สรุป
ในบทนี้ เราได้เรียนรู้วิธีสร้าง Docker Container สำหรับเว็บแอปพลิเคชัน Node.js อย่างง่าย เราได้สร้าง Dockerfile, สร้าง Docker Image, และรัน Docker Container เราได้เห็นว่า Docker ช่วยให้เราสร้างสภาพแวดล้อมที่สอดคล้องกันและแยกส่วนสำหรับแอปพลิเคชันของเราได้อย่างไร
ในบทเรียนต่อไป เราจะเรียนรู้เกี่ยวกับ Docker Volume ซึ่งเป็นวิธีจัดการข้อมูลแบบถาวรใน Container