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

แก้ไขข้อผิดพลาด 'ไม่สามารถเชื่อมต่อกับ Docker Daemon' ได้อย่างรวดเร็ว

เคยลองใช้ Docker แล้วพบข้อความ “ไม่สามารถเชื่อมต่อกับ Docker daemon ได้ ” ผิดพลาดเหรอ? เป็นปัญหาที่น่าหงุดหงิดที่สุดประการหนึ่งที่สามารถหยุดคุณได้ก่อนที่คุณจะเริ่มต้นเสียอีก Docker daemon ทำงานอย่างเงียบๆ ในพื้นหลัง ซึ่งจัดการทุกอย่างตั้งแต่การเริ่มต้นและการหยุดคอนเทนเนอร์ไปจนถึงการจัดการรูปภาพ การสร้างเลเยอร์ และการประมวลผลคำสั่ง Docker ทั้งหมดของคุณ เช่น 09 , 12 ฯลฯ หากเทอร์มินัลของคุณไม่สามารถเข้าถึงได้ ก็ไม่มีอะไรทำงาน 

ในคู่มือนี้ ฉันจะอธิบายว่าทำไมข้อผิดพลาดนี้จึงเกิดขึ้น และแสดงวิธีแก้ไขที่เรียบง่ายและใช้งานได้จริงเพื่อให้ Docker ทำงานได้อย่างราบรื่นอีกครั้ง

สารบัญ

ทำความเข้าใจว่า Docker Daemon ทำอะไร

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 ทำงานอยู่หรือเปล่า “. แก้ไขข้อผิดพลาด  ไม่สามารถเชื่อมต่อกับ Docker Daemon  ได้อย่างรวดเร็ว

มักเกิดขึ้นเนื่องจากสาเหตุข้อใดข้อหนึ่งเหล่านี้:

  • บริการ Docker ไม่ทำงาน
  • ผู้ใช้ของคุณไม่ได้รับอนุญาตให้เข้าถึงซ็อกเก็ต Docker
  • นักเทียบท่าใช้บริบทที่ไม่ถูกต้อง
  • ซ็อกเก็ต Docker หายไปหรือมีสิทธิ์ที่ไม่ถูกต้อง
  • ตัวแปรสภาพแวดล้อม เช่น 20 มีการกำหนดค่าไม่ถูกต้อง
  • ปัญหาเฉพาะแพลตฟอร์ม (Docker Desktop, WSL หรือ daemons ระยะไกล)

การระบุว่าส่วนใดของสายการสื่อสารนี้เสียหายเป็นกุญแจสำคัญในการแก้ไขปัญหาอย่างถูกต้อง

ตรวจสอบสิทธิ์ผู้ใช้ของคุณ

บนระบบ Linux นักเทียบท่าสื่อสารผ่านซ็อกเก็ต Unix ที่ผู้ใช้รูทเป็นเจ้าของ ผู้ใช้จะต้องอยู่ในกลุ่ม Docker เพื่อให้สามารถเข้าถึงได้โดยไม่ต้องใช้ 31 .

หากต้องการตรวจสอบสิทธิ์ของซ็อกเก็ต ให้รันคำสั่งต่อไปนี้:

ls -l /var/run/docker.sock
แก้ไขข้อผิดพลาด  ไม่สามารถเชื่อมต่อกับ Docker Daemon  ได้อย่างรวดเร็ว

ผลลัพธ์นี้บอกเราว่าซ็อกเก็ตเป็นของรูท และมีเพียงผู้ใช้ที่อยู่ในกลุ่มนักเทียบท่าเท่านั้นที่ได้รับอนุญาตให้อ่านหรือเขียนลงในซ็อกเก็ตได้ หากบัญชีผู้ใช้ของคุณไม่ได้เป็นส่วนหนึ่งของกลุ่มนี้ Docker จะปฏิเสธการเข้าถึงและไม่สามารถดำเนินการคำสั่งได้ เพื่อแก้ไขปัญหานี้ คุณต้องเพิ่มผู้ใช้ของคุณในกลุ่ม Docker:

sudo usermod -aG docker $USER

หากไม่มีกลุ่ม Docker คุณสามารถสร้างได้โดยใช้คำสั่งต่อไปนี้:

sudo groupadd docker

ตรวจสอบว่าบริการ Docker กำลังทำงานอยู่

ปัญหาที่เรียบง่ายแต่สำคัญอีกประการหนึ่งคือ Docker อาจไม่ทำงานเลย หาก Docker daemon หยุดทำงาน Docker CLI จะไม่มีการเชื่อมต่อใดๆ ซึ่งส่งผลให้เกิดข้อผิดพลาดดังกล่าว หากต้องการตรวจสอบสถานะปัจจุบันของบริการ Docker ให้รันคำสั่งต่อไปนี้:

systemctl status docker

ในกรณีของเรา Docker เปิดใช้งานและทำงานได้สำเร็จ อย่างไรก็ตาม หากเอาต์พุตแสดงสถานะ เช่น ไม่ได้ใช้งาน (ไม่ทำงาน) หรือล้มเหลว แสดงว่าบริการ Docker ไม่ทำงาน

แก้ไขข้อผิดพลาด  ไม่สามารถเชื่อมต่อกับ Docker Daemon  ได้อย่างรวดเร็ว

หากต้องการเริ่ม Docker ด้วยตนเอง คุณสามารถเรียกใช้คำสั่งนี้:

sudo systemctl start docker

หากคุณต้องการให้ Docker เริ่มทำงานโดยอัตโนมัติทุกครั้งที่ระบบของคุณบูท ให้เปิดใช้งานโดยใช้คำสั่งต่อไปนี้:

sudo systemctl enable docker

เริ่ม Docker Daemon ด้วยตนเอง (นักเทียบท่า)

บนเซิร์ฟเวอร์ขั้นต่ำหรือการตั้งค่า Linux แบบกำหนดเอง Docker อาจไม่ได้รับการจัดการโดย systemd ในสภาพแวดล้อมเหล่านี้ Docker daemon อาจไม่เริ่มทำงานโดยอัตโนมัติ แม้ว่าจะติดตั้ง Docker ไว้ก็ตาม หากต้องการทดสอบว่า daemon สามารถเริ่มทำงานได้หรือไม่ ให้ลองรันด้วยตนเอง:

sudo dockerd

ตรวจสอบผลลัพธ์อย่างระมัดระวัง หากมีสิ่งผิดปกติเกิดขึ้น Docker มักจะพิมพ์ข้อความแสดงข้อผิดพลาดที่ชัดเจนเพื่ออธิบายปัญหา เช่น ปัญหาไดรเวอร์การจัดเก็บข้อมูล ข้อผิดพลาดในการอนุญาต หรือความขัดแย้งของเครือข่าย

ตรวจสอบและแก้ไข Docker Unix Socket

Docker CLI โต้ตอบกับ Docker daemon โดยใช้ซ็อกเก็ต Unix หากซ็อกเก็ตนี้หายไป เสียหาย หรือมีสิทธิ์ที่ไม่ถูกต้อง Docker จะไม่สามารถเชื่อมต่อได้ คุณสามารถตรวจสอบว่ามีซ็อกเก็ตอยู่หรือไม่โดยใช้คำสั่งต่อไปนี้:

ls /var/run/docker.sock
แก้ไขข้อผิดพลาด  ไม่สามารถเชื่อมต่อกับ Docker Daemon  ได้อย่างรวดเร็ว

หากไฟล์หายไป โดยปกติจะหมายความว่า Docker daemon ไม่ทำงาน หรือ Docker ไม่สามารถสร้างซ็อกเก็ตระหว่างการเริ่มต้นระบบได้ ในกรณีดังกล่าว คุณต้องรีสตาร์ท Docker เพื่อสร้างใหม่:

sudo systemctl restart docker

หากมีซ็อกเก็ตอยู่แต่มีสิทธิ์ที่ไม่ถูกต้อง ให้แก้ไขโดยใช้คำสั่งต่อไปนี้:

sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
แก้ไขข้อผิดพลาด  ไม่สามารถเชื่อมต่อกับ Docker Daemon  ได้อย่างรวดเร็ว

ตรวจสอบบริบทนักเทียบท่าและตัวแปรสภาพแวดล้อม

บางครั้ง Docker ไม่สามารถเชื่อมต่อกับ daemon ได้เนื่องจากชี้ไปยังจุดสิ้นสุดที่ไม่ถูกต้อง กรณีนี้อาจเกิดขึ้นได้หาก 45 ของคุณ ตัวแปรสภาพแวดล้อมถูกตั้งค่าไม่ถูกต้อง หรือหากบริบท Docker ที่ใช้งานของคุณชี้ไปที่สภาพแวดล้อมระยะไกลหรือไม่พร้อมใช้งาน

ตรวจสอบตัวแปรสภาพแวดล้อม

เรียกใช้คำสั่งต่อไปนี้เพื่อดูว่ามีการตั้งค่าตัวแปรสภาพแวดล้อมที่เกี่ยวข้องกับ Docker หรือไม่:

env | grep DOCKER

หากคุณเห็นข้อความเช่น 53 หมายความว่า Docker กำลังชี้ไปที่ daemon ระยะไกลที่อาจไม่ทำงานหรือหายไป คุณสามารถแก้ไขได้ชั่วคราวโดยยกเลิกการตั้งค่าตัวแปร:

unset DOCKER_HOST

หากต้องการลบออกอย่างถาวร ให้ทำความสะอาดออกจากไฟล์การกำหนดค่าเชลล์ เช่น “~/.bashrc”, “~/.zshrc” และ “/etc/environment”

ตรวจสอบบริบท Docker ที่ใช้งานอยู่

บริบทนักเทียบท่าจะกำหนดว่า daemon ใดที่ CLI สื่อสารด้วย คุณสามารถแสดงรายการบริบทที่มีอยู่และดูบริบทที่ใช้งานอยู่ได้:

docker context ls
แก้ไขข้อผิดพลาด  ไม่สามารถเชื่อมต่อกับ Docker Daemon  ได้อย่างรวดเร็ว

เครื่องหมายดอกจัน (*) หมายถึงบริบทที่ใช้งานอยู่ในปัจจุบัน หากบริบทชี้ไปที่สภาพแวดล้อมที่ไม่พร้อมใช้งาน ให้เปลี่ยนกลับไปเป็นดีมอนโลคัลเริ่มต้น:

docker context use default

ปัญหาเฉพาะแพลตฟอร์ม

ปัญหาการเชื่อมต่อบางอย่างเกิดขึ้นเฉพาะบนแพลตฟอร์มที่เฉพาะเจาะจงเท่านั้น ตัวอย่างเช่น Docker Desktop บน Windows หรือ macOS รัน daemon ภายใน VM น้ำหนักเบา หาก VM ไม่สามารถเริ่มต้นได้ Docker CLI จะไม่สามารถเชื่อมต่อได้ หากต้องการแก้ไขปัญหานี้ ให้รีสตาร์ท Docker Desktop ของคุณ

ในทำนองเดียวกัน เมื่อใช้ Docker กับ WSL daemon จะทำงานในสภาพแวดล้อม Linux ตรวจสอบให้แน่ใจว่า WSL ได้รับการติดตั้งและทำงานอย่างถูกต้อง:

wsl --list --running 
แก้ไขข้อผิดพลาด  ไม่สามารถเชื่อมต่อกับ Docker Daemon  ได้อย่างรวดเร็ว

หากไม่สามารถเข้าถึง Docker daemon จาก WSL ได้ การรีสตาร์ทบริการ Docker Desktop หรือการกระจาย WSL เฉพาะมักจะแก้ไขปัญหาได้

เคล็ดลับในการหลีกเลี่ยงข้อผิดพลาดนี้ในอนาคต

เพื่อหลีกเลี่ยงข้อผิดพลาด “ไม่สามารถเชื่อมต่อกับ Docker daemon” ในอนาคต โปรดตรวจสอบให้แน่ใจว่าบริการ Docker ทำงานอยู่เสมอ โดยเฉพาะอย่างยิ่งหลังจากการอัปเดตระบบ และเพิ่มผู้ใช้ของคุณไปยังกลุ่ม Docker เพื่อข้ามโดยใช้ 63 . ตรวจสอบบริบท Docker ที่ใช้งานอยู่เป็นประจำ โดยเฉพาะอย่างยิ่งหลังจากเปลี่ยนเครื่อง การกระจาย WSL หรือใช้ Docker Desktop และหลีกเลี่ยงการตั้งค่า DOCKER_HOST เว้นแต่จะเชื่อมต่อกับ daemon ระยะไกลเฉพาะ เนื่องจากตัวแปรที่กำหนดค่าไม่ถูกต้องอาจทำให้คำสั่ง CLI ผิดทางได้ นอกจากนี้ ตรวจสอบบันทึก daemon โดยใช้ 72 เพื่อตรวจจับปัญหาตั้งแต่เนิ่นๆ