Starting Docker Engine on Windows 10 Pro without Docker Desktop is not supported natively because the standard Linux kernel required by Docker is absent. The most viable workaround involves running a lightweight Linux virtual machine, such as Alpine or Ubuntu, via Hyper-V or VirtualBox, and then installing the Docker daemon inside that guest OS to manage containers remotely.
Understanding the Architecture Limitation
Docker for Windows traditionally relies on Docker Desktop, which creates a hidden Linux VM using Hyper-V or WSL2 to provide the necessary kernel capabilities. On Windows 10 Pro, while Hyper-V is available, it does not automatically expose a Linux environment suitable for running dockerd directly on the host. Attempting to install the Linux version of Docker directly on Windows will fail due to missing system libraries and kernel modules. Therefore, the strategy shifts from "native" hosting to "remote" management where the Windows host acts as a client to a Linux-based Docker daemon running in isolation.
Why Direct Installation Fails
The Docker Engine is compiled specifically for Linux kernels. It depends on cgroups, namespaces, and specific kernel interfaces that are fundamentally different from the NT kernel used by Windows. Even with WSL2 enabled, the Docker CLI cannot talk to the WSL2 instance directly without the Docker Desktop proxy service running. Without Docker Desktop, you must bridge this gap manually or use an alternative virtualization layer that supports Linux containers more explicitly.
Setting Up a Linux Virtual Machine
To achieve a standalone Docker service, you need a Linux guest operating system. This can be done using Hyper-V Manager, which is built into Windows 10 Pro, or third-party tools like VirtualBox or VMware Workstation. Hyper-V is preferred for better integration and performance, especially if you are already using other virtualization technologies on your machine.
- Create a New Virtual Machine: Open Hyper-V Manager and select "New > Virtual Machine". Choose Generation 2 for modern features like UEFI boot.
- Allocate Resources: Assign at least 2GB of RAM and 20GB of dynamic storage. Ensure that "Enable Secure Boot" is checked if required by your Linux distribution.
- Install Linux: Download a minimal Linux ISO such as Alpine Linux, Ubuntu Server, or Debian. Install it into the VM. For simplicity, a headless server setup is sufficient since you will manage Docker via command line.
Once the Linux OS is installed and running, you can proceed to install the Docker Engine within this environment. This isolates the Docker daemon from the Windows host, preventing conflicts with Windows services and ensuring a stable container runtime environment.
Installing Docker Daemon in the Guest OS
After booting into your Linux VM, update the package manager and install Docker. For Ubuntu/Debian based systems, the steps are straightforward:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
For Alpine Linux, you would use apk add docker. After installation, start the Docker service and enable it to start on boot:
sudo systemctl start docker
sudo systemctl enable docker
Verify the installation by running sudo docker info. If the output displays system details without errors, the daemon is running correctly. You can now pull images and run containers within this VM.
Configuring Remote Access from Windows
To control the Docker daemon from your Windows 10 Pro host, you need to configure the Linux VM to accept remote connections. By default, Docker listens only on a Unix socket. You must modify the daemon configuration to listen on a TCP port.
- Edit the Docker daemon configuration file:
sudo nano /etc/docker/daemon.json. - Add the following JSON content to enable TCP listening on all interfaces (or restrict it to your local network IP for security):
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}
Restart the Docker service: sudo systemctl restart docker. Now, from your Windows host, you can set the DOCKER_HOST environment variable to point to the VM's IP address:
set DOCKER_HOST=tcp://<VM_IP_ADDRESS>:2375
You can now run docker ps on Windows, and it will display containers running in the Linux VM. Note that binding to port 2375 is unencrypted; for production or sensitive environments, consider using TLS encryption or SSH tunneling. If you encounter connectivity issues, check the VM's firewall settings to ensure port 2375 is open. For related networking troubleshooting, see Docker Windows fails to pull mcr.microsoft.com/devcontainers/base:0-alpine-3.20 due to connection reset.
Managing Containers and Data Persistence
Since the Docker daemon runs inside a VM, container data persists within the VM's virtual disk. If you recreate the VM, you will lose all container data unless you mount a shared folder from Windows to the Linux VM. Use SMB shares or NFS to map Windows directories into the Linux VM, then bind these volumes in your Docker containers.
This approach effectively decouples your development environment from the limitations of Windows-native Docker. It allows you to use any Linux-based image and maintain full control over the Docker daemon configuration. However, keep in mind that resource overhead is higher than native solutions, and network latency between Windows and the VM may slightly impact I/O operations. If you are integrating databases, ensure proper networking between the VM and host applications, similar to challenges described in Connecting a Local Postgres DB to a Django-based Docker Project on Windows Machines.
Frequently Asked Questions
Can I run Docker directly on Windows without any VM?
No, Docker Engine requires a Linux kernel. While WSL2 provides a Linux kernel, it is managed by Docker Desktop. Without Docker Desktop, you must use a separate VM to host the daemon.
Is it safe to expose port 2375 on my network?
No, port 2375 has no authentication or encryption. Exposing it allows anyone on the network to control your Docker daemon. Always use SSH tunneling or TLS for secure remote access.
How do I share files between Windows and the Linux VM?
You can use SMB/CIFS shares. Mount the Windows share in the Linux VM using mount -t cifs, then reference these paths in your Docker volume mounts.
Does this method work on Windows 10 Home?
Windows 10 Home lacks Hyper-V support. You would need to use VirtualBox or VMware instead, which have their own installation and configuration requirements.
What happens if I delete the VM?
All containers, images, and volumes stored within the VM will be permanently deleted. Always back up important data to the Windows host before destroying the VM.