เคยลองใช้ Docker แล้วพบข้อความ “ไม่สามารถเชื่อมต่อกับ Docker daemon ได้ ” ผิดพลาดเหรอ? เป็นปัญหาที่น่าหงุดหงิดที่สุดประการหนึ่งที่สามารถหยุดคุณได้ก่อนที่คุณจะเริ่มต้นเสียอีก Docker daemon ทำงานอย่างเงียบๆ ในพื้นหลัง ซึ่งจัดการทุกอย่างตั้งแต่การเริ่มต้นและการหยุดคอนเทนเนอร์ไปจนถึงการจัดการรูปภาพ การสร้างเลเยอร์ และการประมวลผลคำสั่ง Docker ทั้งหมดของคุณ เช่น
ในคู่มือนี้ ฉันจะอธิบายว่าทำไมข้อผิดพลาดนี้จึงเกิดขึ้น และแสดงวิธีแก้ไขที่เรียบง่ายและใช้งานได้จริงเพื่อให้ Docker ทำงานได้อย่างราบรื่นอีกครั้ง
สารบัญ
Docker daemon (dockerd) เป็นบริการพื้นหลังที่รับผิดชอบในการจัดการคอนเทนเนอร์ รูปภาพ เครือข่าย และพื้นที่จัดเก็บข้อมูล เมื่อคุณรันคำสั่ง Docker CLI จะไม่ทำงานเหล่านี้เอง แต่จะส่งคำขอไปยังดีมอนแทน บนระบบ Linux การสื่อสารนี้เกิดขึ้นผ่านซ็อกเก็ต Unix ซึ่งอยู่ที่ “/var/run/docker.sock” บนสภาพแวดล้อม Docker Desktop หรือ WSL นั้น CLI จะสื่อสารกับ daemon ผ่านไปป์ที่มีชื่อหรือซ็อกเก็ตที่จัดการโดยเครื่องเสมือน
หาก CLI ไม่สามารถสื่อสารกับ daemon ได้ คุณจะได้รับข้อผิดพลาด เช่น “ไม่สามารถเชื่อมต่อกับ Docker daemon ที่ unix:///var/run/docker.sock docker daemon ทำงานอยู่หรือเปล่า “. ป>
มักเกิดขึ้นเนื่องจากสาเหตุข้อใดข้อหนึ่งเหล่านี้:
การระบุว่าส่วนใดของสายการสื่อสารนี้เสียหายเป็นกุญแจสำคัญในการแก้ไขปัญหาอย่างถูกต้อง
บนระบบ Linux นักเทียบท่าสื่อสารผ่านซ็อกเก็ต Unix ที่ผู้ใช้รูทเป็นเจ้าของ ผู้ใช้จะต้องอยู่ในกลุ่ม Docker เพื่อให้สามารถเข้าถึงได้โดยไม่ต้องใช้
หากต้องการตรวจสอบสิทธิ์ของซ็อกเก็ต ให้รันคำสั่งต่อไปนี้:
ผลลัพธ์นี้บอกเราว่าซ็อกเก็ตเป็นของรูท และมีเพียงผู้ใช้ที่อยู่ในกลุ่มนักเทียบท่าเท่านั้นที่ได้รับอนุญาตให้อ่านหรือเขียนลงในซ็อกเก็ตได้ หากบัญชีผู้ใช้ของคุณไม่ได้เป็นส่วนหนึ่งของกลุ่มนี้ Docker จะปฏิเสธการเข้าถึงและไม่สามารถดำเนินการคำสั่งได้ เพื่อแก้ไขปัญหานี้ คุณต้องเพิ่มผู้ใช้ของคุณในกลุ่ม Docker:
หากไม่มีกลุ่ม Docker คุณสามารถสร้างได้โดยใช้คำสั่งต่อไปนี้:
ปัญหาที่เรียบง่ายแต่สำคัญอีกประการหนึ่งคือ Docker อาจไม่ทำงานเลย หาก Docker daemon หยุดทำงาน Docker CLI จะไม่มีการเชื่อมต่อใดๆ ซึ่งส่งผลให้เกิดข้อผิดพลาดดังกล่าว หากต้องการตรวจสอบสถานะปัจจุบันของบริการ Docker ให้รันคำสั่งต่อไปนี้:
ในกรณีของเรา Docker เปิดใช้งานและทำงานได้สำเร็จ อย่างไรก็ตาม หากเอาต์พุตแสดงสถานะ เช่น ไม่ได้ใช้งาน (ไม่ทำงาน) หรือล้มเหลว แสดงว่าบริการ Docker ไม่ทำงาน
หากต้องการเริ่ม Docker ด้วยตนเอง คุณสามารถเรียกใช้คำสั่งนี้:
หากคุณต้องการให้ Docker เริ่มทำงานโดยอัตโนมัติทุกครั้งที่ระบบของคุณบูท ให้เปิดใช้งานโดยใช้คำสั่งต่อไปนี้:
บนเซิร์ฟเวอร์ขั้นต่ำหรือการตั้งค่า Linux แบบกำหนดเอง Docker อาจไม่ได้รับการจัดการโดย systemd ในสภาพแวดล้อมเหล่านี้ Docker daemon อาจไม่เริ่มทำงานโดยอัตโนมัติ แม้ว่าจะติดตั้ง Docker ไว้ก็ตาม หากต้องการทดสอบว่า daemon สามารถเริ่มทำงานได้หรือไม่ ให้ลองรันด้วยตนเอง:
ตรวจสอบผลลัพธ์อย่างระมัดระวัง หากมีสิ่งผิดปกติเกิดขึ้น Docker มักจะพิมพ์ข้อความแสดงข้อผิดพลาดที่ชัดเจนเพื่ออธิบายปัญหา เช่น ปัญหาไดรเวอร์การจัดเก็บข้อมูล ข้อผิดพลาดในการอนุญาต หรือความขัดแย้งของเครือข่าย
Docker CLI โต้ตอบกับ Docker daemon โดยใช้ซ็อกเก็ต Unix หากซ็อกเก็ตนี้หายไป เสียหาย หรือมีสิทธิ์ที่ไม่ถูกต้อง Docker จะไม่สามารถเชื่อมต่อได้ คุณสามารถตรวจสอบว่ามีซ็อกเก็ตอยู่หรือไม่โดยใช้คำสั่งต่อไปนี้:
หากไฟล์หายไป โดยปกติจะหมายความว่า Docker daemon ไม่ทำงาน หรือ Docker ไม่สามารถสร้างซ็อกเก็ตระหว่างการเริ่มต้นระบบได้ ในกรณีดังกล่าว คุณต้องรีสตาร์ท Docker เพื่อสร้างใหม่:
หากมีซ็อกเก็ตอยู่แต่มีสิทธิ์ที่ไม่ถูกต้อง ให้แก้ไขโดยใช้คำสั่งต่อไปนี้:
บางครั้ง Docker ไม่สามารถเชื่อมต่อกับ daemon ได้เนื่องจากชี้ไปยังจุดสิ้นสุดที่ไม่ถูกต้อง กรณีนี้อาจเกิดขึ้นได้หาก
เรียกใช้คำสั่งต่อไปนี้เพื่อดูว่ามีการตั้งค่าตัวแปรสภาพแวดล้อมที่เกี่ยวข้องกับ Docker หรือไม่:
หากคุณเห็นข้อความเช่น
หากต้องการลบออกอย่างถาวร ให้ทำความสะอาดออกจากไฟล์การกำหนดค่าเชลล์ เช่น “~/.bashrc”, “~/.zshrc” และ “/etc/environment”
บริบทนักเทียบท่าจะกำหนดว่า daemon ใดที่ CLI สื่อสารด้วย คุณสามารถแสดงรายการบริบทที่มีอยู่และดูบริบทที่ใช้งานอยู่ได้:
เครื่องหมายดอกจัน (*) หมายถึงบริบทที่ใช้งานอยู่ในปัจจุบัน หากบริบทชี้ไปที่สภาพแวดล้อมที่ไม่พร้อมใช้งาน ให้เปลี่ยนกลับไปเป็นดีมอนโลคัลเริ่มต้น:
ปัญหาการเชื่อมต่อบางอย่างเกิดขึ้นเฉพาะบนแพลตฟอร์มที่เฉพาะเจาะจงเท่านั้น ตัวอย่างเช่น Docker Desktop บน Windows หรือ macOS รัน daemon ภายใน VM น้ำหนักเบา หาก VM ไม่สามารถเริ่มต้นได้ Docker CLI จะไม่สามารถเชื่อมต่อได้ หากต้องการแก้ไขปัญหานี้ ให้รีสตาร์ท Docker Desktop ของคุณ
ในทำนองเดียวกัน เมื่อใช้ Docker กับ WSL daemon จะทำงานในสภาพแวดล้อม Linux ตรวจสอบให้แน่ใจว่า WSL ได้รับการติดตั้งและทำงานอย่างถูกต้อง:
หากไม่สามารถเข้าถึง Docker daemon จาก WSL ได้ การรีสตาร์ทบริการ Docker Desktop หรือการกระจาย WSL เฉพาะมักจะแก้ไขปัญหาได้
เพื่อหลีกเลี่ยงข้อผิดพลาด “ไม่สามารถเชื่อมต่อกับ Docker daemon” ในอนาคต โปรดตรวจสอบให้แน่ใจว่าบริการ Docker ทำงานอยู่เสมอ โดยเฉพาะอย่างยิ่งหลังจากการอัปเดตระบบ และเพิ่มผู้ใช้ของคุณไปยังกลุ่ม Docker เพื่อข้ามโดยใช้ 09 , 12รหัส> ฯลฯ หากเทอร์มินัลของคุณไม่สามารถเข้าถึงได้ ก็ไม่มีอะไรทำงาน ป> ทำความเข้าใจว่า Docker Daemon ทำอะไร
20 มีการกำหนดค่าไม่ถูกต้องตรวจสอบสิทธิ์ผู้ใช้ของคุณ
31 .ls -l /var/run/docker.sock
sudo usermod -aG docker $USERsudo groupadd dockerตรวจสอบว่าบริการ Docker กำลังทำงานอยู่
systemctl status docker
sudo systemctl start dockersudo systemctl enable dockerเริ่ม Docker Daemon ด้วยตนเอง (นักเทียบท่า)
sudo dockerdตรวจสอบและแก้ไข Docker Unix Socket
ls /var/run/docker.sock
sudo systemctl restart dockersudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
ตรวจสอบบริบทนักเทียบท่าและตัวแปรสภาพแวดล้อม
45 ของคุณ ตัวแปรสภาพแวดล้อมถูกตั้งค่าไม่ถูกต้อง หรือหากบริบท Docker ที่ใช้งานของคุณชี้ไปที่สภาพแวดล้อมระยะไกลหรือไม่พร้อมใช้งานตรวจสอบตัวแปรสภาพแวดล้อม
env | grep DOCKER53 หมายความว่า Docker กำลังชี้ไปที่ daemon ระยะไกลที่อาจไม่ทำงานหรือหายไป คุณสามารถแก้ไขได้ชั่วคราวโดยยกเลิกการตั้งค่าตัวแปร:unset DOCKER_HOSTตรวจสอบบริบท Docker ที่ใช้งานอยู่
docker context ls
docker context use defaultปัญหาเฉพาะแพลตฟอร์ม
wsl --list --running
เคล็ดลับในการหลีกเลี่ยงข้อผิดพลาดนี้ในอนาคต
63 . ตรวจสอบบริบท Docker ที่ใช้งานอยู่เป็นประจำ โดยเฉพาะอย่างยิ่งหลังจากเปลี่ยนเครื่อง การกระจาย WSL หรือใช้ Docker Desktop และหลีกเลี่ยงการตั้งค่า DOCKER_HOST เว้นแต่จะเชื่อมต่อกับ daemon ระยะไกลเฉพาะ เนื่องจากตัวแปรที่กำหนดค่าไม่ถูกต้องอาจทำให้คำสั่ง CLI ผิดทางได้ นอกจากนี้ ตรวจสอบบันทึก daemon โดยใช้ 72 เพื่อตรวจจับปัญหาตั้งแต่เนิ่นๆ