Docker ได้รับความนิยมเพิ่มขึ้นเรื่อยๆ ด้วยความสามารถในการสร้าง ปรับใช้ (deploy) และรันแอปพลิเคชันผ่านคอนเทนเนอร์ (Containers) ได้ง่าย คอนเทนเนอร์ช่วยให้นักพัฒนาบรรจุแอปพลิเคชันพร้อมไลบรารีและทุกสิ่งที่พึ่งพา (dependencies) ไว้ในแพ็กเกจเดียว การติดตั้ง Docker บน Linux ค่อนข้างง่าย เพียงรันคำสั่งไม่กี่คำใน Terminal ก็พร้อมใช้งาน
อย่างไรก็ตาม บางผู้ใช้แม้ติดตั้งสำเร็จ ก็ยังเจอปัญหา ข้อผิดพลาดที่พบบ่อยที่สุดคือ: Cannot connect to the Docker daemon at (unix:///var/run/docker.sock. Is the docker daemon running?) ข้อผิดพลาดนี้อาจเกิดเมื่อรันคำสั่ง docker ต่างๆ เช่น docker run, docker info, docker pull, docker stop เป็นต้น
สาเหตุของข้อผิดพลาด: Cannot Connect to the Docker Daemon
หลังได้รับรายงานจากนักพัฒนาหลายคน เราจึงสืบสวนและคิดค้นวิธีแก้ไขที่มีประสิทธิภาพ สาเหตุที่ทำให้เกิดข้อผิดพลาดนี้ ได้แก่:
- Docker daemon ไม่ได้ทำงาน (not running)
- Docker ปิดตัวลงไม่สมบูรณ์ (doesn't shutdown cleanly)
- ขาด สิทธิ์ root (root privileges) ในการเริ่มบริการ docker
เข้าใจสาเหตุแล้ว มาดูวิธีแก้ไขที่มีให้เลือก
วิธีแก้ที่ 1: เริ่มบริการ Docker ด้วย systemctl
หากเพิ่งติดตั้ง Docker ใหม่บน Ubuntu หรือเพิ่งรีบูตคอมพิวเตอร์ โอกาสสูงที่ บริการ Docker (Docker service) ยังไม่ทำงาน Docker daemon (dockerd) คือบริการระบบสำหรับ Docker จัดการออบเจ็กต์ต่างๆ เช่น Images, Containers, Networks, Volumes และฟังคำขอ Docker API
คำสั่ง Systemctl แทนที่ระบบ SysV init เก่า และ จัดการบริการ systemd บน Linux หากไม่มี systemctl ให้ใช้คำสั่ง service ตามวิธีด้านล่าง
หมายเหตุ: วิธีนี้ใช้ได้กับผู้ที่ติดตั้ง Docker ผ่าน APT package manager หากติดตั้งผ่าน SNAP โปรดดู วิธีแก้ที่ 5 ด้านล่าง
- เปิด Terminal รันคำสั่งแรก — unmask docker
sudo systemctl unmask docker
หากพยายามเริ่มบริการ docker ขณะที่ docker ถูก mask อาจเจอข้อผิดพลาด 'Failed to start docker.service: Unit is masked.' Mask เป็นรูปแบบที่เข้มข้นกว่าการ disable เมื่อ unit file ถูก mask จะถูกลิงก์ไปที่ 'dev/null' สามารถดูสถานะ unit files ทั้งหมดด้วยคำสั่ง $ systemctl list-unit-files
- เมื่อ unmask docker unit แล้ว ให้ เริ่ม docker daemon ด้วย systemctl Docker daemon จัดการออบเจ็กต์ Docker เช่น Images, Containers และ Docker API requests รันคำสั่งด้านล่าง:
systemctl start docker
- เพื่อ ตรวจสอบว่า docker service ทำงานอยู่และ active ใช้คำสั่ง systemctl status ซึ่งแสดงสถานะปัจจุบันของบริการ รันคำสั่ง:
systemctl status docker
จากภาพจะเห็นว่า docker active และ running แล้ว
วิธีแก้ที่ 2: ทำความสะอาด 'Failed Docker Pull' และเริ่มบริการ Docker
บางกรณี อาจปิด Docker ไปขณะกำลัง pull container สถานการณ์นี้จะทำให้ docker.service และ docker.socket ถูก mask ไฟล์ docker.socket อยู่ที่ '/var/run/docker.sock' ใช้สื่อสารกับ Docker daemon เราต้อง unmask ทั้ง 2 unit files — docker.service และ docker.daemon ก่อน ดำเนินการ start docker ต่อ
- เปิด Terminal รันคำสั่ง:
systemctl unmask docker.service systemctl unmask docker.socket systemctl start docker.service
หากยังเจอข้อผิดพลาดหลังรันคำสั่งเหล่านี้ ต้อง ลบไฟล์ในไดเรกทอรี Containerd ก่อนเริ่ม Docker ใหม่ Containerd เป็นฟีเจอร์ที่เพิ่มใน Docker 1.11 ใช้จัดการวงจรชีวิตของ Docker images
- เปิด Terminal รันคำสั่ง (ต้องรู้ รหัสผ่าน root เนื่องจากต้องการสิทธิ์สูง):
sudo su service docker stop cd /var/run/docker/libcontainerd rm -rf containerd/* rm -f docker-containerd.pid service docker start
วิธีแก้ที่ 3: เริ่มบริการ Dockerd (Docker Daemon)
Dockerd คือ Docker daemon ที่ฟัง Docker APIs และจัดการออบเจ็กต์ Docker ต่างๆ Dockerd ใช้เป็นทางเลือกแทนคำสั่ง $ systemctl start docker ซึ่งก็ใช้เริ่ม Docker daemon เช่นกัน
- เปิด Terminal เริ่ม dockerd ด้วยคำสั่ง:
sudo dockerd
วิธีแก้ที่ 4: เริ่ม Docker ด้วยคำสั่ง Service
หากใช้ระบบ SysV init คำสั่ง systemctl จะไม่ทำงาน ต้องใช้คำสั่ง service เพื่อ เริ่ม docker daemon
- เปิด Terminal รันคำสั่ง:
sudo service --status-all sudo service docker start
วิธีแก้ที่ 5: เริ่มบริการ Docker ด้วย Snap
หากติดตั้ง Docker ด้วย Snap package manager ต้องใช้คำสั่ง snap จัดการ docker daemon
โดยปกติ Snap จัดการบริการอัตโนมัติ แต่ในกรณีข้อผิดพลาดนี้ ต้องดำเนินการด้วยตนเอง อาร์กิวเมนต์ที่ใช้กับ snap ได้แก่ stop, start, restart ในที่นี้ใช้ start
- เปิด Terminal รันคำสั่งเพื่อ เริ่ม Docker:
sudo snap start docker
- รันคำสั่งเพื่อ ตรวจสอบว่า Docker service เริ่มทำงานแล้ว:
sudo snap services
จะ รายการ บริการ snap ที่ทำงานอยู่ทั้งหมด
หากคำสั่งด้านบ้ายังไม่ได้ผล ลอง เชื่อมต่อ docker:home plug เนื่องจากไม่ได้ auto-connect โดยค่าเริ่มต้น หลังจากนั้น เริ่มบริการ Docker ใหม่
- เปิด Terminal รัน:
sudo snap connect docker:home :home sudo snap start docker
วิธีแก้ที่ 6: เริ่ม Docker สำหรับผู้ใช้ที่ไม่มีสิทธิ์ Root
ข้อผิดพลาดอาจเกิดจาก ขาดสิทธิ์สูง (elevated privileges) และผู้ใช้ไม่มีสิทธิ์เข้าถึง 'unix:///var/run/docker.sock' โชคดีที่มีวิธีแก้ เราจะ export ตัวแปร Docker Host ไปที่ localhost ผ่านพอร์ต 2375
- เปิด Terminal รันคำสั่ง:
export DOCKER_HOST=tcp://localhost:2375
วิธีแก้ที่ 7: ติดตั้ง Docker ใหม่ (Reinstall)
หากวิธีข้างต้นไม่แก้ไขได้ โอกาสสูงที่การติดตั้งมีปัญหา ในการติดตั้ง Docker ให้ถูกต้องบน Linux โปรดทำตามขั้นตอนจากเว็บไซต์ทางการของ Docker