How to Check if Docker is Installed and Running in Batch Script
Docker has become the standard tool for containerized application development and deployment. Before running any Docker command in an automated workflow, your script needs to verify two things: that Docker is actually installed on the machine and that the Docker daemon (engine) is currently running and accepting commands. Without these checks, scripts fail with cryptic error messages like "docker is not recognized" or "error during connect: cannot connect to the Docker daemon." A proper preflight check provides clear diagnostics and prevents wasted time.
In this guide, we will explore how to check for Docker installation and daemon status from a Batch Script, covering Docker Desktop, Docker Engine, and Docker Compose.
Method 1: Basic Installation and Status Check
@echo off
setlocal
echo =============================================
echo DOCKER STATUS CHECK
echo =============================================
echo.
:: Check if Docker CLI is installed
docker --version >nul 2>&1
if %errorlevel% neq 0 (
echo [NOT FOUND] Docker is not installed or not in PATH.
echo.
echo Install Docker Desktop from: https://www.docker.com/products/docker-desktop
pause
exit /b 1
)
:: Display version
for /f "tokens=*" %%v in ('docker --version 2^>nul') do echo Installed: %%v
:: Check if Docker daemon is running
echo.
echo Checking daemon status...
docker info >nul 2>&1
if %errorlevel% equ 0 (
echo [OK] Docker daemon is running.
) else (
echo [ERROR] Docker is installed but the daemon is not running.
echo Start Docker Desktop or the Docker service.
)
pause
Example output (Docker running):
=============================================
DOCKER STATUS CHECK
=============================================
Installed: Docker version 24.0.7, build afdd53b
Checking daemon status...
[OK] Docker daemon is running.
Example output (Docker not running):
Installed: Docker version 24.0.7, build afdd53b
Checking daemon status...
[ERROR] Docker is installed but the daemon is not running.
Start Docker Desktop or the Docker service.
Method 2: Detailed Environment Report
@echo off
setlocal EnableDelayedExpansion
echo =============================================
echo DOCKER ENVIRONMENT REPORT
echo %COMPUTERNAME% - %date%
echo =============================================
echo.
:: Docker CLI
echo [1/5] Docker CLI...
docker --version >nul 2>&1
if !errorlevel! neq 0 (
echo [NOT FOUND]
echo.
echo Docker is not installed. Remaining checks skipped.
pause
exit /b 1
)
for /f "tokens=*" %%v in ('docker --version 2^>nul') do echo %%v
:: Docker Compose
echo [2/5] Docker Compose...
docker compose version >nul 2>&1
if !errorlevel! equ 0 (
for /f "tokens=*" %%v in ('docker compose version 2^>nul') do echo %%v
) else (
docker-compose --version >nul 2>&1
if !errorlevel! equ 0 (
for /f "tokens=*" %%v in ('docker-compose --version 2^>nul') do echo %%v (standalone)
) else (
echo [NOT FOUND]
)
)
:: Docker Daemon
echo [3/5] Docker Daemon...
docker info >nul 2>&1
if !errorlevel! equ 0 (
echo [RUNNING]
) else (
echo [NOT RUNNING]
echo.
echo The daemon is not running. Start Docker Desktop or the service.
pause
exit /b 1
)
:: Server details
echo [4/5] Server Info...
for /f "tokens=2 delims=:" %%a in ('docker info 2^>nul ^| findstr /c:"Server Version"') do echo Server Version:%%a
for /f "tokens=2 delims=:" %%a in ('docker info 2^>nul ^| findstr /c:"Storage Driver"') do echo Storage Driver:%%a
for /f "tokens=2 delims=:" %%a in ('docker info 2^>nul ^| findstr /c:"Operating System"') do echo OS:%%a
:: Running containers
echo [5/5] Running Containers...
set "container_count=0"
for /f %%c in ('docker ps -q 2^>nul') do set /a "container_count+=1"
echo Active containers: !container_count!
echo.
echo [OK] Docker environment ready.
pause
Method 3: Preflight Check for Scripts
A reusable preflight function that other scripts can call:
@echo off
setlocal
:: Call the preflight check before doing any Docker work
call :docker_preflight
if %errorlevel% neq 0 (
echo [ABORT] Docker preflight failed.
pause
exit /b 1
)
:: Docker is ready, proceed with work
echo.
echo Docker is ready. Proceeding...
docker ps
pause
exit /b 0
:docker_preflight
:: Check CLI
docker --version >nul 2>&1
if %errorlevel% neq 0 (
echo [PREFLIGHT FAIL] Docker CLI not found.
echo Install Docker or add it to PATH.
exit /b 1
)
:: Check daemon
docker info >nul 2>&1
if %errorlevel% neq 0 (
echo [PREFLIGHT FAIL] Docker daemon not running.
echo Start Docker Desktop or run: net start com.docker.service
exit /b 1
)
echo [PREFLIGHT OK] Docker is installed and running.
exit /b 0
Extract the :docker_preflight subroutine into a shared script (e.g., docker_check.bat) and call it from any automation script that needs Docker. This avoids duplicating the check logic across multiple scripts.
Method 4: Wait for Docker to Start
Docker Desktop can take 30-60 seconds to start. This script waits for it:
@echo off
setlocal EnableDelayedExpansion
set "max_wait=60"
set "interval=5"
:: Check if Docker CLI exists
docker --version >nul 2>&1
if %errorlevel% neq 0 (
echo [ERROR] Docker is not installed.
pause
exit /b 1
)
:: Check if daemon is already running
docker info >nul 2>&1
if !errorlevel! equ 0 (
echo [OK] Docker is already running.
pause
exit /b 0
)
:: Try to start Docker Desktop
echo Docker daemon is not running. Attempting to start Docker Desktop...
set "DOCKER_DESKTOP="
if exist "%ProgramFiles%\Docker\Docker\Docker Desktop.exe" (
set "DOCKER_DESKTOP=%ProgramFiles%\Docker\Docker\Docker Desktop.exe"
)
if not defined DOCKER_DESKTOP (
echo [ERROR] Docker Desktop not found at the default location.
echo [HELP] Start Docker Desktop manually, or if using Docker Engine,
echo run: net start com.docker.service
pause
exit /b 1
)
start "" "!DOCKER_DESKTOP!"
echo Waiting for Docker to become ready ^(up to %max_wait%s^)...
set "elapsed=0"
:wait
timeout /t %interval% /nobreak >nul
set /a "elapsed+=%interval%"
docker info >nul 2>&1
if !errorlevel! equ 0 (
echo.
echo [OK] Docker is ready. ^(Started in !elapsed!s^)
pause
exit /b 0
)
if !elapsed! geq %max_wait% (
echo.
echo [TIMEOUT] Docker did not start within %max_wait% seconds.
echo Try starting Docker Desktop manually.
pause
exit /b 1
)
echo Waiting... ^(!elapsed!s / %max_wait%s^)
goto :wait
Method 5: Check Docker Service (Docker Engine)
For servers running Docker Engine as a Windows service (without Docker Desktop):
@echo off
setlocal EnableDelayedExpansion
set "service_name=com.docker.service"
echo =============================================
echo DOCKER SERVICE CHECK
echo =============================================
echo.
:: Check if Docker service exists
sc query "%service_name%" >nul 2>&1
if !errorlevel! neq 0 (
:: Try alternative service name
set "service_name=docker"
sc query "docker" >nul 2>&1
if !errorlevel! neq 0 (
echo [NOT FOUND] Docker service is not installed.
pause
exit /b 1
)
)
:: Check service state
sc query "!service_name!" | findstr /i /c:"RUNNING" >nul
if !errorlevel! equ 0 (
echo [OK] Docker service ^(!service_name!^) is running.
for /f "tokens=*" %%v in ('docker --version 2^>nul') do echo %%v
) else (
echo [STOPPED] Docker service ^(!service_name!^) is not running.
echo.
set /p "start_it=Start the Docker service? (Y/N): "
if /i "!start_it!"=="Y" (
net start "!service_name!"
if !errorlevel! equ 0 (
echo [OK] Docker service started.
) else (
echo [ERROR] Failed to start. Run as Administrator.
)
)
)
pause
Checking Specific Docker Features
@echo off
setlocal
:: Verify Docker is running before checking features
docker info >nul 2>&1
if %errorlevel% neq 0 (
echo [ERROR] Docker daemon is not running. Cannot check features.
pause
exit /b 1
)
echo Checking Docker capabilities...
echo.
:: BuildKit support
docker buildx version >nul 2>&1
if %errorlevel% equ 0 (
for /f "tokens=*" %%v in ('docker buildx version 2^>nul') do echo [OK] BuildKit: %%v
) else (
echo [--] BuildKit: not available
)
:: Docker Swarm status
for /f "tokens=2 delims=:" %%s in ('docker info 2^>nul ^| findstr /c:"Swarm"') do (
echo [OK] Swarm:%%s
)
:: Container runtime
for /f "tokens=2 delims=:" %%r in ('docker info 2^>nul ^| findstr /c:"Default Runtime"') do (
echo [OK] Runtime:%%r
)
pause
Common Mistakes
The Wrong Way: Only Checking the CLI
:: WRONG - Docker CLI can be installed while daemon is stopped
docker --version >nul 2>&1
if %errorlevel%==0 echo Docker is ready!
:: FALSE - "docker run" will fail if the daemon is not running
Output Concern:
The Docker CLI is a standalone binary. It can be present on the system while the Docker daemon (engine) is completely stopped. Always check both docker --version (CLI installed) and docker info (daemon running) before assuming Docker is operational.
The Wrong Way: Assuming Docker Desktop Path
:: WRONG - Hardcoded path that varies by installation method
if exist "C:\Program Files\Docker\Docker\Docker Desktop.exe" echo Docker installed
:: Misses: Docker Engine (no Desktop), custom install paths, WSL-based Docker
Use docker --version instead of checking for specific file paths. It works regardless of how Docker was installed (Docker Desktop, Docker Engine, WSL, Chocolatey, etc.).
Best Practices
- Check both CLI and daemon:
docker --versionconfirms installation;docker infoconfirms the daemon is running. - Use
docker infoas the definitive test: It verifies end-to-end connectivity to the Docker engine. - Handle startup delay: Docker Desktop takes time to initialize. Implement a wait loop for automated environments.
- Check Docker Compose too: Many workflows require Compose. Verify it with
docker compose version. - Provide actionable error messages: Tell the user exactly what to do (install Docker, start the service, run as admin).
Conclusion
Checking if Docker is installed and running from a Batch Script requires two checks: docker --version to confirm the CLI is available, and docker info to confirm the daemon is accepting connections. By combining these with Docker Compose detection, startup wait loops for Docker Desktop, and service management for Docker Engine, scripts provide reliable Docker preflight validation that prevents confusing failures in automated build, test, and deployment workflows.