Tag Archive มายเอสคิวแอล

Byphunsanit

Docker: MySQL Container

การสร้าง Docker container เพื่อ run MySQL ในการใช้ database

  1. สร้าง folder เก็บข้อมูลก่อน โดยคำสั่ง
    mkdir -p /Users/Shared/Portable/docker-mysql
  2. ไปที่ folder
    cd /Users/Shared/Portable/docker-mysql
  3. สร้างไฟล์
    touch docker-compose.yml
  4. ใส่เนื้อหา
    services:
      db:
        container_name: docker-mysql
        environment:
          MYSQL_ROOT_PASSWORD: SAj44GMbSLM8
          MYSQL_DATABASE: JRx7H7TvFjsL
          MYSQL_USER: VThBP3XrnXrH
          MYSQL_PASSWORD: ww4c369YkH6J
        image: mysql:8.0
        ports:
          - "3306:3306"
        restart: always
        volumes:
          - ./mysql_data:/var/lib/mysql
    
    • container_name เช่น docker-mysql
    • MYSQL_ROOT_PASSWORD เข่น SAj44GMbSLM8
    • MYSQL_DATABASE: database ชื่ออะไร เช่น JRx7H7TvFjsL
    • MYSQL_USER: username เช่น VThBP3XrnXrH
    • MYSQL_PASSWORD: รหัสผ่านคือ เช่น ww4c369YkH6J
    • ports เช่น 5432
  5. ติดตั้งและรัน
    docker compose up -d

ทดสอบ

ใช้คำสั่ง
docker exec -it {container_name} mysql -U {username} -p{password}
เข่น
docker exec -it docker-mysql mysql -u VThBP3XrnXrH -pww4c369YkH6J

หรือ

docker exec -it {container_name} mysql -U {username} -p

เช่น

docker exec -it docker-mysql mysql -u VThBP3XrnXrH -p
จะมีการถาม MYSQL_PASSWORD ซึ่งจะปลอดภัยกว่า


Common Commands

  • Access MySQL Shell
    docker exec -it {container_name} mysql -U {username} -p{password}
    หรือ
    docker exec -it {container_name} mysql -U {username} -p
  • Check Logs
    docker logs {container_name}
  • Stop Database
    docker stop {container_name}
  • Start Database
    docker start {container_name}

ข้อควรระวังที่สำคัญ (ที่อาจทำให้สับสน)

  • สิทธิ์ในตารางระบบ: User นี้จะ ไม่มีสิทธิ์ ไปยุ่งกับฐานข้อมูลอื่น หรือไปอ่านตาราง mysql.user (ตารางรวมชื่อผู้ใช้) นั่นคือสาเหตุที่คุณรันคำสั่ง SELECT บนตารางระบบแล้วติด Error ครับ
  • การแก้ไขภายหลัง: ถ้าคุณเปลี่ยนชื่อ User หรือ Password ในไฟล์ YAML หลังจากที่รันไปแล้วครั้งหนึ่ง MySQL จะไม่เปลี่ยนตามให้ครับ เพราะมันจะเช็คแค่ว่าใน Folder ./data มีข้อมูลอยู่หรือยัง ถ้ามีแล้วมันจะข้ามขั้นตอนการสร้าง User/Database ไปเลย
  • Host % vs localhost: ใน Docker ตัว User ที่สร้างผ่าน environment จะถูกตั้ง Host เป็น % เพื่อให้คุณสามารถเชื่อมต่อจาก App ภายนอก หรือเครื่อง Host เข้าไปได้โดยไม่ติดเรื่อง IP ครับ

ใช้ root สร้าง database, username เพิ่ม

หากคุณใช้ user: root และ MYSQL_ROOT_PASSWORD ในการทำงาน คุณสามารถทำทุกอย่างได้ ไม่จำกัดแค่ใน Database เดียว นี่คือขั้นตอนและคำสั่งมาตรฐานหากคุณต้องการสร้าง Database และ User ใหม่ด้วยตัวเอง (Manual) ผ่านทาง root:

  1. ล็อกอินด้วย root
  2. สร้าง Database ใหม่
    CREATE DATABASE {์NEW_MYSQL_DATABASE} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  3. สร้าง User ใหม่
    CREATE USER ‘{NEW_MYSQL_USER}@’%’ IDENTIFIED BY ‘{NEW_MYSQL_PASSWORD}‘;
    หมายเหตุ: ใช้ '%' เพื่อให้ User นี้ล็อกอินจากภายนอก Container ได้
  4. มอบสิทธิ์ (Grant Privileges)
    GRANT ALL PRIVILEGES ON {์NEW_MYSQL_DATABASE}.* TO '{NEW_MYSQL_USER}'@'%';

Best Practices

  • Specific Versions: Instead of mysql:latest, use a specific tag like mysql:8.0 or mysql:5.7 to avoid breaking changes when the image updates.
  • Platform Issues (Apple Silicon): If you are on an M1 Mac and encounter issues, add --platform linux/amd64 to your run command or compose file.
  • Security: Never hardcode passwords in files you plan to push to GitHub. Use an .env file instead.

อ่านเพิ่มเติม