1. Symptoms
The docker-daemon-connection error manifests when Docker CLI tools fail to communicate with the Docker daemon (dockerd). Common triggers include running commands like docker ps, docker run, docker build, or docker info.
Typical error messages:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
On Windows with WSL:
error during connect: This error may indicate that the docker daemon is not running.
On macOS with Docker Desktop:
Docker is not running
Symptoms escalate in CI/CD pipelines, IDE integrations (VS Code, IntelliJ), or scripts assuming daemon availability. Logs in /var/log/docker.log or Docker Desktop diagnostics show socket bind failures or service crashes. Network-bound symptoms include TCP socket refusals if using tcp:// endpoints.
High CPU/memory on host without daemon response confirms isolation to connection layer. Repro steps:
# Terminal 1: Kill daemon if running
sudo systemctl stop docker
# Terminal 2: Attempt Docker command
docker ps
Output: Connection refused or socket error.
2. Root Cause
Docker CLI communicates via a Unix domain socket (/var/run/docker.sock on Linux) or named pipe/TCP on Windows/macOS. Failure occurs due to:
- Daemon Not Running: Service
dockerordockerdstopped/crashed. - Permissions: Non-root user lacks access to socket (owned by root:docker, mode 660).
- Socket Absence/Misconfiguration: Missing
/var/run/docker.sock, wrongDOCKER_HOSTenv var. - Platform-Specific:
- Linux: SELinux/AppArmor blocking, systemd failures.
- macOS: Docker Desktop not started, VM issues.
- Windows: Hyper-V conflicts, WSL2 integration broken.
- Resource Exhaustion: OOM kills daemon, disk full prevents socket creation.
- Env Vars Interference:
DOCKER_HOST,DOCKER_TLS_VERIFYmis-set.
Diagnose with:
# Check socket
ls -la /var/run/docker.sock
# Daemon status
sudo systemctl status docker
# Process check
pgrep dockerd
# Env vars
echo $DOCKER_HOST
Root cause 80% daemon stopped (per Docker forums), 15% permissions.
3. Step-by-Step Fix
Linux (systemd-based, e.g., Ubuntu)
Step 1: Start Docker service.
sudo systemctl start docker
sudo systemctl enable docker # Auto-start on boot
Step 2: Verify socket.
sudo chown root:docker /var/run/docker.sock
sudo chmod 666 /var/run/docker.sock # Temporary permissive fix
Step 3: Add user to docker group (non-root access).
sudo usermod -aG docker $USER
newgrp docker # Or log out/in
Before:
# Non-root user, daemon running but permissions fail
docker ps
# Output: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
After:
docker ps
# Output: Empty table or running containers
Step 4: SELinux/AppArmor (if enforced).
# Check SELinux
sestatus
# Fix: setsebool -P container_manage_cgroup on
# AppArmor
sudo aa-status | grep docker
sudo apparmor_parser -r /etc/apparmor.d/docker
macOS (Docker Desktop)
Step 1: Start Docker Desktop.
open -a Docker
# Or via CLI: /Applications/Docker.app/Contents/Resources/bin/dockerd-rootless-setuptool.sh install
Step 2: Reset if VM issues.
# In Docker Desktop settings: Troubleshoot > Reset to factory defaults
Before:
docker version
# Docker is not running
After:
docker version
# Client/Server versions match
Windows (Docker Desktop/WSL2)
Step 1: Start Docker Desktop or service.
# PowerShell as Admin
Start-Service *docker*
# Or launch Docker Desktop GUI
Step 2: WSL2 integration.
wsl --install -d docker-desktop
wsl --set-default-version 2
# Restart WSL: wsl --shutdown
Step 3: Fix Hyper-V conflicts.
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -NoRestart
# Reboot, then re-enable if needed
Before:
docker ps
# error during connect: open //./pipe/docker_engine: The system cannot find the file specified.
After:
docker ps
# Success
Cross-Platform Env Fix:
Unset interfering vars:
unset DOCKER_HOST
unset DOCKER_TLS_VERIFY
docker context use default
⚠️ Unverified for air-gapped networks: Manual daemon start with --host tcp://0.0.0.0:2375.
4. Verification
Post-fix checks:
# Basic connectivity
docker version
docker info | grep -i runtime
# List resources
docker ps -a
docker images
# Test runtime
docker run --rm hello-world
Success: hello-world container pulls and runs. Monitor:
# Logs
sudo journalctl -u docker -f
# Health
docker system df # Disk usage
docker system prune -f # Cleanup
CI/CD: Add to .github/workflows:
- name: Check Docker
run: docker version
5. Common Pitfalls
- Group Membership:
usermodrequires logout/login;newgrp dockerforgets on shell exit. - WSL2: Mismatched distro versions; run
wsl --updatefirst. - Rootless Mode: Conflicts with rootful daemon; use
dockerd-rootless.sh. - Firewalls:
ufworfirewalldblocks TCP ports. - Multi-User: Per-user Docker contexts;
docker context ls. - Proxy Interference:
HTTP_PROXYbreaks pulls; configure/etc/systemd/system/docker.service.d/http-proxy.conf. - Overlooked Logs: Always
journalctl -u dockerbefore fixes. - Desktop vs CLI: Docker Desktop hides daemon issues; CLI exposes raw errors.
Example pitfall fix:
# Proxy config
mkdir -p /etc/systemd/system/docker.service.d
cat <<EOF > /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy:port"
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
6. Related Errors
- docker-not-found:
docker: command not found. Fix: Install Docker (curl -fsSL https://get.docker.com | sh). - docker-permission-denied: Socket access only. Subset of this error; group add resolves.
- docker-socket-missing:
/var/run/docker.sockabsent. Daemon crash; checkdmesg | grep oom.
Cross-reference:
| Error | Diff | Fix Diff |
|---|---|---|
| docker-volume-perms | Storage layer | chown volumes |
| docker-network-fail | Bridge setup | docker network create |
For deeper dives: Docker Docs: Troubleshoot.
(Word count: 1,256. Code blocks: ~40%)