เคยรัน Docker แล้วเจอ Error "Cannot connect to the Docker daemon" มั้ย? เป็นปัญหาที่รบกวนมาก หยุดคุณก่อนเริ่มทำอะไรเลย Docker Daemon รันเงียบๆ ในพื้นหลัง จัดการทุกอย่าง: เริ่ม/หยุด Containers, จัดการ Images, Build Layers, ประมวลผลคำสั่ง Docker ทั้งหมดอย่าง docker run, docker ps ฯลฯ ถ้า Terminal ต่อ Daemon ไม่ได้ ไม่มีอะไรทำงานเลย
ในคู่มือนี้ จะอธิบายว่าทำไม Error นี้ถึงเกิด และแสดงวิธีแก้ง่ายๆ ให้ Docker กลับมาทำงานลื่นไหลอีกครั้ง
เข้าใจว่า Docker Daemon ทำหน้าที่อะไร
Docker Daemon (dockerd) เป็น Background Service จัดการ Containers, Images, Networking และ Storage ตอนรันคำสั่ง Docker CLI ไม่ได้ทำงานเหล่านี้เอง แต่ส่ง Request ไปหา Daemon บน Linux การสื่อสารผ่าน Unix Socket ที่ /var/run/docker.sock บน Docker Desktop หรือ WSL CLI ติดต่อ Daemon ผ่าน Named Pipe หรือ Socket ที่ VM จัดการ
ถ้า CLI ต่อ Daemon ไม่ได้ จะได้ Error แบบนี้: "Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"
มักเกิดจากสาเหตุเหล่านี้:
- Docker Service ไม่ได้รัน
- User ไม่มี Permission เข้าถึง Docker Socket
- Docker ใช้ Context ผิด
- Docker Socket หายหรือ Permission ผิด
- Environment Variables อย่าง
DOCKER_HOSTตั้งผิด - ปัญหาเฉพาะ Platform (Docker Desktop, WSL, Remote Daemons)
ระบุว่าส่วนไหนใน Chain การสื่อสารพัง คือกุญแจสำคัญในการแก้ถูกจุด
เช็ค User Permissions
บน Linux Docker สื่อสารผ่าน Unix Socket ที่ Root เป็นเจ้าของ User ต้องอยู่ใน Group docker ถึงจะเข้าถึงได้โดยไม่ต้อง sudo
เช็ค Socket Permissions:
ls -l /var/run/docker.sock
Output บอกว่า Socket 属于 Root และเฉพาะ User ใน Group docker ถึง Read/Write ได้ ถ้า User ไม่อยู่ Group นี้ Docker จะปฏิเสธการเข้าถึง แก้โดยเพิ่ม User เข้า Group Docker:
sudo usermod -aG docker $USER
ถ้ายังไม่มี Group Docker สร้างด้วย:
sudo groupadd docker
ตรวจสอบว่า Docker Service รันอยู่หรือไม่
ปัญหาง่ายแต่อีกอย่าง: Docker อาจไม่ได้รันเลย ถ้า Daemon หยุด CLI ไม่มีอะไรต่อได้ เกิด Error ดังกล่าว เช็คสถานะ Service:
systemctl status docker
ในกรณีของเรา Docker Active และ Running แต่ถ้า Output แสดง Inactive (dead) หรือ Failed แปลว่า Service ไม่รัน
เริ่ม Docker ด้วยมือ:
sudo systemctl start docker
อยากให้ Docker เริ่มอัตโนมัติตอน Boot Enable ด้วย:
sudo systemctl enable docker
เริ่ม Docker Daemon ด้วยมือ (dockerd)
บน Minimal Servers หรือ Custom Linux Setup Docker อาจไม่ถูกจัดการโดย systemd ใน Env เหล่านี้ Daemon อาจไม่เริ่มอัตโนมัติ แม้ Docker จะติดตั้งไว้ ทดสอบว่า Daemon เริ่มได้ไหม รันด้วยมือ:
sudo dockerd
ดู Output อย่างใกล้ชิด ถ้ามีปัญญา Docker มักพิมพ์ Error ชัดเจน อธิบายปัญหา: Storage Driver, Permission, Network Conflict ฯลฯ
ตรวจสอบและแก้ Docker Unix Socket
Docker CLI ติดต่อ Daemon ผ่าน Unix Socket ถ้า Socket หาย เสียหาย หรือ Permission ผิด Docker ต่อไม่ได้ เช็คว่า Socket มีอยู่:
ls /var/run/docker.sock
ถ้าไฟล์หาย มักเพราะ Daemon ไม่รัน หรือ Docker สร้าง Socket ไม่ได้ตอน Startup รีสตาร์ท Docker สร้างใหม่:
sudo systemctl restart docker
ถ้า Socket มีแต่ Permission ผิด แก้ด้วย:
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
ตรวจสอบ Docker Contexts และ Environment Variables
บางครั้ง Docker ต่อ Daemon ไม่ได้เพราะชี้ Endpoint ผิด เกิดจาก DOCKER_HOST Env Variable ตั้งผิด หรือ Active Docker Context ชี้ไป Remote/Unavailable Env
เช็ค Environment Variables
รันดูว่า Docker Env Variables ตั้งไว้ไหม:
env | grep DOCKER
ถ้าเจอ DOCKER_HOST=tcp://localhost:2375 แปลว่า Docker ชี้ Remote Daemon ที่อาจหยุดหรือหาย แกชั่วคราวด้วย:
unset DOCKER_HOST
ลบถาวร ลบออกจาก Shell Config Files: ~/.bashrc, ~/.zshrc, /etc/environment
เช็ค Active Docker Context
Docker Contexts กำหนดว่า CLI ต่อ Daemon ไหน ลิส Contexts และดู Active ตัวไหน:
docker context ls
เครื่องหมาย * บอก Context ที่ Active อยู่ ถ้าชี้ Env ที่ไม่พร้อมใช้งาน สลับกลับ Default Local Daemon:
docker context use default
ปัญหาเฉพาะ Platform
ปัญหาการต่อบางอย่างเกิดเฉพาะ Platform เช่น Docker Desktop บน Windows/macOS รัน Daemon ใน VM เบาๆ ถ้า VM เริ่มไม่ได้ CLI ต่อไม่ได้ แก้ด้วยการ Restart Docker Desktop
เหมือนกัน WSL Daemon รันใน Linux Env ตรวจสอบ WSL ติดตั้งและรันถูกต้อง:
wsl --list --running
ถ้า Daemon เข้าถึงไม่ได้จาก WSL รีสตาร์ท Docker Desktop Service หรือ WSL Distro เฉพาะตัวมักแก้ได้
เคล็ดลับป้องกัน Error นี้ในอนาคต
ป้องกัน Error "cannot connect to Docker daemon" ในอนาคต: ตรวจสอบ Docker Service รันเสมอ โดยเฉพาะหลัง System Update เพิ่ม User เข้า Docker Group เพื่อไม่ต้อง sudo เช็ค Active Docker Context บ่อย โดยเฉพาะหลังสลับเครื่อง WSL Distro หรือใช้ Docker Desktop หลีกเลี่ยงตั้ง DOCKER_HOST เว้นแต่ต่อ Remote Daemon เพราะ Variable ตั้งผิดมisdirect CLI Commands และตรวจสอบ Daemon Logs ด้วย journalctl -u docker.service จับปัญหาเร็ว