Docker ngày càng phổ biến nhờ khả năng tạo, triển khai, chạy ứng dụng bằng container dễ dàng. Container đóng gói ứng dụng với thư viện, phụ thuộc thành gói hoàn chỉnh. Cài đặt Docker trên Linux khá đơn giản: chạy vài lệnh Terminal.
Tuy nhiên, không phải ai cũng suôn sẻ sau khi cài thành công. Lỗi phổ biến: Cannot connect to the Docker daemon at (unix:///var/run/docker.sock. Is the docker daemon running?) Lỗi xuất hiện khi chạy docker run, docker info, docker pull, docker stop, v.v.
Nguyên nhân lỗi: Cannot Connect to the Docker Daemon
Sau nhiều phản hồi, chúng tôi tìm ra giải pháp hiệu quả. Các nguyên nhân:
- Docker daemon chưa chạy.
- Docker không tắt sạch.
- Thiếu quyền root để khởi động dịch vụ docker.
Hiểu nguyên nhân, xem các giải pháp dưới đây.
Giải pháp 1: Khởi động dịch vụ Docker bằng systemctl
Vừa cài Docker mới trên Ubuntu hoặc reboot máy, khả năng lớn dịch vụ Docker chưa chạy. Docker daemon (dockerd) là dịch vụ hệ thống quản lý images, containers, networks, volumes và lắng nghe API Docker.
Systemctl thay thế SysV init, quản lý dịch vụ systemd trên Linux. Nếu không có systemctl, dùng lệnh service (xem giải pháp 4).
Lưu ý: Chỉ áp dụng cho cài Docker qua APT. Nếu cài qua SNAP, xem Giải pháp 5.
- Mở Terminal chạy lệnh unmask docker.
sudo systemctl unmask docker
Nếu start docker khi bị masked, báo lỗi 'Failed to start docker.service: Unit is masked'. Mask là phiên bản mạnh hơn của disable. Unit file bị mask liên kết đến '/dev/null'. Liệt kê trạng thái unit file: '$ systemctl list-unit-files'
2. Sau khi unmask, khởi động docker daemon bằng systemctl. Docker daemon quản lý Images, Containers, API requests. Chạy lệnh:
systemctl start docker
3. Kiểm tra docker service đã active và running bằng systemctl status:
systemctl status docker
Hình ảnh cho thấy docker đang active và running.
Giải pháp 2: Dọn dẹp 'Failed Docker Pull' và khởi động Docker
Đôi khi đóng Docker bất ngờ khi pull container. Điều này mask docker.service và docker.socket. Docker.socket tại '/var/run/docker.sock' giao tiếp với daemon. Cần unmask hai unit file trước khi start docker.
- Mở Terminal chạy lệnh:
systemctl unmask docker.service systemctl unmask docker.socket systemctl start docker.service
Nếu vẫn lỗi, xóa file trong thư mục Containerd trước khi start lại Docker. Containerd (từ Docker 1.11) quản lý vòng đời images.
2. Mở Terminal chạy lệnh (cần mật khẩu root):
sudo su service docker stop cd /var/run/docker/libcontainerd rm -rf containerd/* rm -f docker-containerd.pid service docker start
Giải pháp 3: Khởi động dịch vụ Dockerd (Docker Daemon)
Dockerd là Docker daemon lắng nghe API và quản lý đối tượng Docker. Dockerd là thay thế cho '$ systemctl start docker'.
- Mở Terminal chạy dockerd:
sudo dockerd
Giải pháp 4: Khởi động Docker bằng lệnh Service
Nếu dùng SysV init system, systemctl không hoạt động. Dùng service command để khởi động docker daemon.
- Mở Terminal chạy:
sudo service --status-all sudo service docker start
Giải pháp 5: Khởi động Docker Service với Snap
Nếu cài Docker bằng Snap package manager, dùng lệnh snap quản lý daemon.
Snap thường tự quản lý dịch vụ. Nhưng lỗi này cần can thiệp thủ công. Các tham số: stop, start, restart. Ta dùng start.
- Mở Terminal chạy khởi động Docker:
sudo snap start docker
2. Chạy lệnh kiểm tra Docker service đã khởi động:
sudo snap services
Liệt kê tất cả snap services đang chạy.
Nếu chưa được, thử kết nối docker:home plug (mặc định không auto-connect). Sau đó khởi động Docker service.
3. Chạy lệnh:
sudo snap connect docker:home :home sudo snap start docker
Giải pháp 6: Khởi động Docker cho user không có quyền Root
Lỗi cũng do thiếu quyền cao, user không truy cập 'unix:///var/run/docker.sock'. Giải pháp: export biến Docker Host đến localhost cổng 2375.
- Mở Terminal chạy:
export DOCKER_HOST=tcp://localhost:2375
Giải pháp 7: Cài đặt lại Docker
Nếu các giải pháp trên không khắc phục, khả năng cao cài đặt bị lỗi. Để cài đúng Docker trên Linux, làm theo hướng dẫn trang chủ Docker.