การสร้าง Docker container เพื่อ run MySQL ในการใช้ database
- สร้าง folder เก็บข้อมูลก่อน โดยคำสั่ง
mkdir -p /Users/Shared/Portable/docker-mysql
- ไปที่ folder
cd /Users/Shared/Portable/docker-mysql
- สร้างไฟล์
touch docker-compose.yml
- ใส่เนื้อหา
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
- ติดตั้งและรัน
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:
- ล็อกอินด้วย root
- สร้าง Database ใหม่
CREATE DATABASE {์NEW_MYSQL_DATABASE} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- สร้าง User ใหม่
CREATE USER ‘{NEW_MYSQL_USER}‘@’%’ IDENTIFIED BY ‘{NEW_MYSQL_PASSWORD}‘;
หมายเหตุ: ใช้ '%' เพื่อให้ User นี้ล็อกอินจากภายนอก Container ได้
- มอบสิทธิ์ (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.
อ่านเพิ่มเติม