Đã từng thử chạy Docker và đột nhiên gặp phải lỗi “Không thể kết nối với daemon Docker “lỗi? Đó là một trong những vấn đề khó chịu nhất có thể ngăn cản bạn trước khi bạn bắt đầu. Trình nền Docker chạy lặng lẽ ở chế độ nền, xử lý mọi thứ từ khởi động và dừng vùng chứa đến quản lý hình ảnh, xây dựng lớp và xử lý tất cả các lệnh Docker của bạn như docker run , docker ps , v.v. Nếu thiết bị đầu cuối của bạn không thể truy cập được thì sẽ không có gì hoạt động.
Trong hướng dẫn này, tôi sẽ giải thích lý do xảy ra lỗi này và chỉ cho bạn các cách khắc phục đơn giản, thiết thực để Docker chạy trơn tru trở lại.
Mục lục
Tìm hiểu công dụng của Docker Daemon
Docker daemon (dockerd) là một dịch vụ nền chịu trách nhiệm quản lý các container, hình ảnh, kết nối mạng và lưu trữ. Khi bạn chạy các lệnh Docker, CLI không tự thực hiện các tác vụ này; thay vào đó, nó gửi yêu cầu đến daemon. Trên các hệ thống Linux, giao tiếp này diễn ra thông qua một ổ cắm Unix có vị trí tại “/var/run/docker.sock”. Trên môi trường Docker Desktop hoặc WSL, CLI giao tiếp với daemon thông qua một ống dẫn có tên hoặc ổ cắm do máy ảo quản lý.
Nếu CLI không thể giao tiếp với daemon, bạn sẽ gặp các lỗi như “Không thể kết nối với daemon Docker tại unix:///var/run/docker.sock. Daemon docker có đang chạy không? “.
Nó thường xảy ra vì một trong những lý do sau:
- Dịch vụ Docker không chạy.
- Người dùng của bạn không có quyền truy cập vào ổ cắm Docker.
- Docker đang sử dụng ngữ cảnh sai.
- Ổ cắm Docker bị thiếu hoặc có quyền không chính xác.
- Biến môi trường như
DOCKER_HOSTbị định cấu hình sai. - Các sự cố dành riêng cho nền tảng (Docker Desktop, WSL hoặc daemon từ xa).
Xác định phần nào của chuỗi liên lạc này bị hỏng chính là chìa khóa để khắc phục sự cố một cách chính xác.
Kiểm tra quyền người dùng của bạn
Trên các hệ thống Linux, Docker giao tiếp thông qua một socket Unix do người dùng root sở hữu. Người dùng phải thuộc nhóm Docker để có thể truy cập nó mà không cần sudo .
Để xác minh quyền của ổ cắm, hãy chạy lệnh sau:
ls -l /var/run/docker.sock
Đầu ra này cho chúng ta biết rằng socket được sở hữu bởi root và chỉ những người dùng thuộc nhóm docker mới được phép đọc hoặc ghi vào nó. Nếu tài khoản người dùng của bạn không thuộc nhóm này, Docker sẽ từ chối quyền truy cập và không thực thi các lệnh. Để khắc phục sự cố này, bạn cần thêm người dùng của mình vào nhóm Docker:
sudo usermod -aG docker $USER Nếu nhóm Docker không tồn tại, bạn có thể tạo nó bằng lệnh sau:
sudo groupadd docker Xác minh dịch vụ Docker đang chạy
Một vấn đề rất đơn giản nhưng quan trọng khác là Docker có thể không chạy. Nếu daemon Docker bị dừng, Docker CLI không có gì để kết nối, dẫn đến lỗi đã nêu. Để kiểm tra trạng thái hiện tại của dịch vụ Docker, hãy chạy lệnh sau:
systemctl status docker Trong trường hợp của chúng tôi, Docker đang hoạt động và chạy thành công. Tuy nhiên, nếu đầu ra hiển thị trạng thái như không hoạt động (chết) hoặc không thành công, điều đó có nghĩa là dịch vụ Docker không chạy.
Để khởi động Docker theo cách thủ công, bạn có thể chạy lệnh này:
sudo systemctl start docker Nếu bạn muốn Docker tự động khởi động bất cứ khi nào hệ thống khởi động, hãy kích hoạt nó bằng lệnh sau:
sudo systemctl enable docker Khởi động Daemon Docker theo cách thủ công (dockerd)
Trên các máy chủ tối thiểu hoặc thiết lập Linux tùy chỉnh, Docker có thể không được quản lý bởi systemd. Trong những môi trường này, daemon Docker có thể không tự động khởi động, ngay cả khi Docker đã được cài đặt. Để kiểm tra xem daemon có thể khởi động hay không, hãy thử chạy nó theo cách thủ công:
sudo dockerd Theo dõi đầu ra một cách cẩn thận. Nếu có sự cố xảy ra, Docker thường in một thông báo lỗi rõ ràng giải thích sự cố, chẳng hạn như sự cố trình điều khiển lưu trữ, lỗi quyền hoặc xung đột mạng.
Kiểm tra và sửa lỗi Docker Unix Socket
Docker CLI tương tác với daemon Docker bằng ổ cắm Unix. Nếu ổ cắm này bị thiếu, bị hỏng hoặc có quyền không chính xác, Docker không thể kết nối. Bạn có thể kiểm tra xem ổ cắm có tồn tại hay không bằng lệnh sau:
ls /var/run/docker.sock
Nếu tệp bị thiếu, điều đó thường có nghĩa là daemon Docker không chạy hoặc Docker không tạo được ổ cắm trong khi khởi động. Trong trường hợp đó, bạn cần khởi động lại Docker để tạo lại nó:
sudo systemctl restart docker Nếu ổ cắm tồn tại nhưng có quyền không chính xác, hãy sửa chúng bằng các lệnh sau:
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
Xác minh bối cảnh Docker và biến môi trường
Đôi khi Docker không thể kết nối với daemon vì nó trỏ sai điểm cuối. Điều này có thể xảy ra nếu DOCKER_HOST của bạn biến môi trường được đặt không chính xác hoặc nếu bối cảnh Docker đang hoạt động của bạn trỏ đến một môi trường từ xa hoặc không khả dụng.
Kiểm tra biến môi trường
Chạy lệnh sau để xem có biến môi trường nào liên quan đến Docker được đặt không:
env | grep DOCKER
Nếu bạn thấy nội dung như DOCKER_HOST=tcp://localhost:2375 , điều đó có nghĩa là Docker đang trỏ đến một daemon từ xa có thể không hoạt động hoặc bị thiếu. Bạn có thể tạm thời khắc phục điều này bằng cách bỏ đặt biến:
unset DOCKER_HOST Để xóa vĩnh viễn, hãy xóa nó khỏi các tệp cấu hình shell như “~/.bashrc”, “~/.zshrc” và “/etc/environment”.
Kiểm tra bối cảnh Docker đang hoạt động
Bối cảnh Docker xác định daemon nào mà CLI giao tiếp. Bạn có thể liệt kê các ngữ cảnh có sẵn và xem ngữ cảnh đang hoạt động:
docker context ls
Dấu hoa thị (*) cho biết ngữ cảnh hiện đang hoạt động. Nếu ngữ cảnh trỏ đến môi trường không khả dụng, hãy chuyển về daemon cục bộ mặc định:
docker context use default Sự cố dành riêng cho nền tảng
Một số sự cố kết nối chỉ xảy ra trên các nền tảng cụ thể. Ví dụ:Docker Desktop trên Windows hoặc macOS chạy daemon bên trong một máy ảo nhẹ. Nếu VM không khởi động được, Docker CLI không thể kết nối. Để khắc phục sự cố này, hãy khởi động lại Docker Desktop của bạn.
Tương tự, khi sử dụng Docker với WSL, daemon sẽ chạy trong môi trường Linux. Đảm bảo rằng WSL được cài đặt và chạy đúng cách:
wsl --list --running
Nếu không thể truy cập trình nền Docker từ WSL, việc khởi động lại dịch vụ Docker Desktop hoặc bản phân phối WSL cụ thể thường khắc phục được sự cố.
Mẹo tránh lỗi này trong tương lai
Để tránh lỗi “không thể kết nối với daemon Docker” trong tương lai, hãy luôn đảm bảo dịch vụ Docker đang chạy, đặc biệt là sau khi cập nhật hệ thống và thêm người dùng của bạn vào nhóm Docker để bỏ qua việc sử dụng sudo . Thường xuyên kiểm tra bối cảnh Docker đang hoạt động của bạn, đặc biệt là sau khi chuyển đổi máy, bản phân phối WSL hoặc sử dụng Docker Desktop và tránh đặt DOCKER_HOST trừ khi kết nối với một daemon từ xa cụ thể, vì các biến được định cấu hình sai có thể định hướng sai các lệnh CLI. Ngoài ra, hãy theo dõi nhật ký daemon bằng journalctl -u docker.service để nắm bắt vấn đề sớm.