คุณอาจงงมากถ้า Linux terminal โยน error “cannot connect to the Docker daemon” มาให้ เพราะมากที่สุด Docker daemon กำลังรันอยู่แล้วตอนที่คุณเห็น error แม้คุณจะอยากแน่ใจว่ามันรันอยู่ แต่คุณจะงงอีกทีพบว่า error นี้ ไม่ได้เกี่ยวกับ service ที่ยังไม่ start มันมักโยนให้ user ที่ ยังไม่ได้เพิ่มตัวเองเข้า Docker group
Docker สร้าง user group แยกบน Linux systems user accounts ที่ไม่ได้เพิ่มเข้า group นี้ จะ connect ไม่ได้ จำไว้ว่า การเพิ่ม user account เข้า Docker group คือ functionally root equivalent เพราะ daemon รันเป็น root user เสมอ สิ่งนี้คาดการณ์ได้ใน single-user Ubuntu Server แต่ควรระวังสำหรับผู้ที่รัน Docker บน Arch, Fedora หรือ Debian
วิธีที่ 1: ตรวจสอบ Docker Service Status
แม้เกือบแน่ใจว่ารันอยู่ แต่ต้องเช็ค ว่ Docker service รันอยู่จริง ที่ terminal รัน systemctl status docker.service เป็น normal user ควรได้ info เกี่ยวกับ PID number ที่ Docker daemon ได้รับ ถ้าไม่ได้ ต้อง restart service
ถ้า restart แล้ว ลองทำสิ่งที่โยน error “cannot connect to the Docker daemon” ใหม่ ถ้าทำงานได้ แสดงว่าแค่ service ไม่ได้รัน ไม่ต้องกังวลอะไรนอกจากสาเหตุที่มันไม่รัน แต่ว่าไม่ได้ในกรณีส่วนใหญ่ ต้องไปวิธีถัดไป
วิธีที่ 2: เพิ่ม Users เข้า Docker Group
รัน docker info จาก command line จะได้ error “cannot connect to the Docker daemon” อีกครั้ง
ถ้าเป็นเช่นนั้น ต้องรัน sudo groupadd docker; sudo usermod -aG docker $USER เพื่อเพิ่มตัวเองเข้า group ที่ถูกต้อง ถ้า error เพราะไม่มี usermod ให้เปลี่ยนเป็น sudo groupadd docker; sudo gpasswd -a $USER docker แต่โดยทั่วไป commercial-grade Linux distributions ใช้ toolset เดียวกัน ไม่ควรมีปัญหา ในทุกกรณี รัน newgrp docker เพื่อ login เข้า docker group ใหม่ (ถ้ายังไม่ได้เข้า)
จำไว้ว่าจะเพิ่ม user ที่ login อยู่เสมอ ซึ่งไม่ใช่ปัญหาในระบบส่วนใหญ่ที่มีแค่ user เดียวและ root เนื่องจากมี administrative access อยู่ ให้รัน sudo chgrp docker /usr/bin/docker; sudo chgrp docker /var/run/docker.sock เพื่อแก้ permissions บน docker socket และ command ปกติ socket file เป็นของ root user เท่านั้น คำสั่งนี้จะแก้ไขให้ถูกต้อง
หลังรันแล้ว ไม่ควรมีปัญหา เพราะตอนนี้มันเป็นของ group เดียวกับที่สร้างในคำสั่งก่อนหน้า ต้องการ test ว่า docker รันโดยไม่ต้อง sudo ให้พิมพ์ docker run hello-world เป็น regular user เช็คว่าไม่มี error อื่น
ในขั้นตอนนี้ ไม่กี่ user จะยังเจอ error message ส่วนใหญ่ควรแก้ไขแล้ว แต่ถ้ายังมีปัญหา ลอง logout เข้าใหม่ เปิด terminal emulator ใหม่ ถ้ายังไม่ได้ บางครั้ง restart เครื่องช่วย (ถ้าทำได้)
วิธีที่ 3: ใช้ ACLs ปรับ Docker Metadata
ถ้าไม่อยากเป็นใน group ที่ทำให้เหมือน root user สามารถตั้ง socket file ให้ทำงานกับ permissions เฉพาะได้ สามารถข้าม gpasswd process ได้ การ scan filesystem สำหรับ ACL entries เป็น burden สำหรับ security audit แต่ป้องกันไม่ต้องใช้ docker group
ถ้าอยากทำแบบนี้ รัน sudo setfacl -m user:name:rw /var/run/docker.sock แทน user และ name ด้วย label ที่เหมาะสม จะให้สิทธิ์เข้าถึง Docker socket ที่ /var/run/docker.sock ควรทำงานกับ Debian และ Ubuntu Server
ABOUT THE AUTHOR

Kevin Arrows
Kevin Arrows เป็นผู้เชี่ยวชาญด้านเทคโนโลยีที่มีประสบการณ์มากกว่า 10 ปี ได้รับการรับรอง Microsoft Certified Technology Specialist (MCTS) มีความหลงใหลในการอัปเดตเทคโนโลยีล่าสุด เขียนบทความเกี่ยวกับหัวข้อเทคโนโลยีกว้างขวาง แสดงความเชี่ยวชาญในด้านการพัฒนาซอฟต์แวร์ ความปลอดภัยไซเบอร์ และ Cloud Computing ได้รับการยอมรับและเคารพจากเพื่อนร่วมงาน สามารถอธิบายแนวคิดทางเทคนิคที่ซับซ้อนได้อย่างชัดเจนและกระชับ