Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Linux

แก้ Error 'Cannot Connect to Docker Daemon' เร็วๆ นี้: วิธีแก้ปฏิบัติจริง

เคยรัน 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?"

แก้ Error  Cannot Connect to Docker Daemon  เร็วๆ นี้: วิธีแก้ปฏิบัติจริง

มักเกิดจากสาเหตุเหล่านี้:

  • 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
แก้ Error  Cannot Connect to Docker Daemon  เร็วๆ นี้: วิธีแก้ปฏิบัติจริง

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 ไม่รัน

แก้ Error  Cannot Connect to Docker Daemon  เร็วๆ นี้: วิธีแก้ปฏิบัติจริง

เริ่ม 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
แก้ Error  Cannot Connect to Docker Daemon  เร็วๆ นี้: วิธีแก้ปฏิบัติจริง

ถ้าไฟล์หาย มักเพราะ 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
แก้ Error  Cannot Connect to Docker Daemon  เร็วๆ นี้: วิธีแก้ปฏิบัติจริง

ตรวจสอบ 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
แก้ Error  Cannot Connect to Docker Daemon  เร็วๆ นี้: วิธีแก้ปฏิบัติจริง

เครื่องหมาย * บอก 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
แก้ Error  Cannot Connect to Docker Daemon  เร็วๆ นี้: วิธีแก้ปฏิบัติจริง

ถ้า 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 จับปัญหาเร็ว