วิธีติดตั้ง MongoDB ด้วย Docker Desktop

วิธีติดตั้ง MongoDB ด้วย Docker Desktop

การติดตั้ง MongoDB ด้วย Docker Desktop เป็นวิธีที่สะดวกและรวดเร็ว เหมาะสำหรับการพัฒนาและทดสอบระบบ ในคู่มือนี้จะแนะนำทุกขั้นตอนตั้งแต่ต้นจนใช้งานได้จริง

ขั้นตอนที่ 1: ติดตั้ง Docker Desktop

  1. ดาวน์โหลด Docker Desktop จาก https://www.docker.com/products/docker-desktop
  2. ติดตั้งและเปิดโปรแกรม Docker Desktop
  3. รอให้ Docker Desktop รันจนพร้อมใช้งาน (ดูที่สถานะด้านล่างซ้าย)

ขั้นตอนที่ 2: สร้างไฟล์ docker-compose.yml

สร้างโฟลเดอร์สำหรับโปรเจค MongoDB แล้วสร้างไฟล์ docker-compose.yml ด้วยเนื้อหาดังนี้:

version: '3.8'

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: always
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password123
    volumes:
      - mongodb_data:/data/db

volumes:
  mongodb_data:
    driver: local

คำอธิบายส่วนประกอบ:

  • image: mongo:latest - ใช้ MongoDB เวอร์ชันล่าสุด
  • ports: 27017:27017 - เปิด port 27017 สำหรับเชื่อมต่อ
  • environment: กำหนด username และ password สำหรับ root user
  • volumes: เก็บข้อมูลถาวร แม้จะ restart container

ขั้นตอนที่ 3: รัน MongoDB Container

เปิด Command Prompt หรือ PowerShell ในโฟลเดอร์ที่มีไฟล์ docker-compose.yml แล้วรันคำสั่ง:

docker-compose up -d

คำสั่งนี้จะ:

  • ดาวน์โหลด MongoDB image (ถ้ายังไม่มี)
  • สร้างและรัน container ในโหมด detached (-d)

ขั้นตอนที่ 4: ตรวจสอบสถานะ

ตรวจสอบว่า MongoDB รันอยู่หรือไม่:

docker ps

หรือดูใน Docker Desktop GUI ที่แท็บ Containers

ขั้นตอนที่ 5: เชื่อมต่อ MongoDB

วิธีที่ 1: ใช้ MongoDB Compass

  1. ดาวน์โหลด MongoDB Compass
  2. เปิดโปรแกรมและใช้ Connection String:
mongodb://admin:password123@localhost:27017

วิธีที่ 2: ใช้ Terminal เข้าไปใน Container

docker exec -it mongodb mongosh -u admin -p password123

วิธีที่ 3: เชื่อมต่อจาก Application

Python (pymongo):

from pymongo import MongoClient

client = MongoClient('mongodb://admin:password123@localhost:27017/')
db = client['mydatabase']
print("Connected to MongoDB!")

Node.js (mongoose):

const mongoose = require('mongoose');

mongoose.connect('mongodb://admin:password123@localhost:27017/mydatabase')
  .then(() => console.log('Connected to MongoDB!'))
  .catch(err => console.error('Connection error:', err));

คำสั่งที่มีประโยชน์

หยุดการทำงาน:

docker-compose stop

เริ่มต้นใหม่:

docker-compose start

หยุดและลบ container:

docker-compose down

หยุดและลบทั้ง container และข้อมูล:

docker-compose down -v

ดู logs:

docker logs mongodb

การตั้งค่าเพิ่มเติม (Optional)

เพิ่ม MongoDB Express (Web UI)

แก้ไขไฟล์ docker-compose.yml เพื่อเพิ่ม MongoDB Express:

version: '3.8'

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: always
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password123
    volumes:
      - mongodb_data:/data/db

  mongo-express:
    image: mongo-express:latest
    container_name: mongo-express
    restart: always
    ports:
      - "8081:8081"
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: admin
      ME_CONFIG_MONGODB_ADMINPASSWORD: password123
      ME_CONFIG_MONGODB_URL: mongodb://admin:password123@mongodb:27017/
    depends_on:
      - mongodb

volumes:
  mongodb_data:
    driver: local

จากนั้นรัน:

docker-compose up -d

เปิดเบราว์เซอร์ไปที่ http://localhost:8081 เพื่อใช้งาน Web UI

Troubleshooting

ปัญหา: Port 27017 ถูกใช้งานแล้ว

  • แก้ไข port ในไฟล์ docker-compose.yml เป็น "27018:27017" แทน

ปัญหา: ไม่สามารถเชื่อมต่อได้

  • ตรวจสอบว่า Docker Desktop รันอยู่
  • ตรวจสอบว่า container ทำงานอยู่ด้วย docker ps
  • ตรวจสอบ firewall settings

ปัญหา: ข้อมูลหายหลัง restart

  • ตรวจสอบว่ามีการกำหนด volumes ไว้ในไฟล์ docker-compose.yml

สรุป

การติดตั้ง MongoDB ด้วย Docker Desktop ทำให้เราสามารถ:

  • ติดตั้งและลบได้ง่าย ไม่กระทบกับระบบหลัก
  • จัดการ version ต่างๆ ได้สะดวก
  • เก็บข้อมูลแยกออกมาด้วย volumes
  • ใช้ร่วมกับเครื่องมืออื่นๆ ผ่าน docker-compose

หวังว่าคู่มือนี้จะเป็นประโยชน์สำหรับการเริ่มต้นใช้งาน MongoDB ด้วย Docker Desktop ครับ! :rocket: