When attempting to run Linux containers on Windows Server 2016, you'll encounter the frustrating "no matching manifest for windows/amd64" error. This occurs because Docker defaults to Windows containers, and the platform switching mechanism differs from Docker Desktop's GUI approach.
First, confirm your Docker configuration with:
docker version
docker info
Key indicators you're not in Linux container mode:
OSType: windows
in docker info- Missing LCOW (Linux Containers on Windows) components
- Windows kernel version instead of LinuxKit kernel
Ensure these are in place:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Install-Module -Name DockerMsftProvider -Force
Install-Package -Name docker -ProviderName DockerMsftProvider -Force
Unlike Docker Desktop, Windows Server requires manual configuration:
Step 1: Configure Docker Daemon
Create or modify daemon.json
at C:\ProgramData\docker\config\
:
{
"experimental": true,
"storage-driver": "lcow",
"exec-opts": ["isolation=hyperv"]
}
Step 2: Restart Docker Service
Restart-Service docker
Step 3: Pull Linux Images Correctly
Use explicit platform specification:
docker pull --platform linux amd64/ubuntu
Step 4: Run Containers with Proper Isolation
docker run --isolation=hyperv --platform linux -it amd64/ubuntu bash
If you still encounter problems:
Verify LCOW Installation
Get-WindowsOptionalFeature -Online -FeatureName *contain*
Ensure "Containers" and "Microsoft-Hyper-V" are enabled.
Alternative Approach: Using LCOW Directly
For Windows Server 2016 without Docker EE:
docker run --isolation=hyperv
-v //./pipe/docker_engine://./pipe/docker_engine
-e DOCKER_HOST=npipe:////./pipe/docker_engine
linuxkit/lcow
When running Linux containers on Windows Server 2016:
- Expect 20-30% performance overhead compared to native Linux
- Disk I/O is particularly impacted due to translation layers
- Consider dedicated Linux VMs for production workloads
Confirm successful configuration with:
docker run --rm --platform linux alpine uname -a
Should return Linux kernel information if properly configured.
When attempting to run Linux containers on Windows Server 2016, you'll encounter the notorious platform mismatch error:
no matching manifest for windows/amd64 in the manifest list entries
Unlike Docker Desktop for Windows which provides a GUI toggle, Windows Server requires manual configuration to enable Linux Container support through Linux Containers on Windows (LCOW).
Before proceeding, verify your environment meets these requirements:
- Windows Server 2016 with Containers feature enabled (KB4015217 or later)
- Hyper-V role installed and running
- Docker EE version 17.06+ (or experimental build for older versions)
- Minimum 4GB RAM (8GB recommended)
1. Enable Experimental Features
Edit or create the Docker configuration file at C:\ProgramData\Docker\config\daemon.json
:
{
"experimental": true,
"storage-driver": "lcow",
"storage-opts": [
"lcow.globalmode=true"
]
}
2. Configure Platform Switching
Unlike Docker Desktop, Windows Server requires explicit platform selection for each operation:
docker run --platform=linux alpine ls -l
Or set the default platform in your environment:
$env:LCOW_SUPPORTED=1
docker run alpine ls -l
Kernel Version Mismatch
If you see Windows kernel version instead of LinuxKit in docker info
, verify:
docker version
docker info
The output should show experimental features enabled and Linux containers available.
Persistent Platform Settings
Add these to your PowerShell profile for automatic configuration:
if ((Get-Service docker).status -eq 'Running') {
$env:LCOW_SUPPORTED=1
docker context use default
}
For production environments, consider these optimizations:
{
"experimental": true,
"storage-driver": "lcow",
"storage-opts": [
"lcow.kirdpath=C:\\lcow",
"lcow.bootparameters=console=ttyS0"
],
"debug": true
}
Remember to restart the Docker service after configuration changes:
Restart-Service docker
For mixed workloads, you can explicitly specify the platform:
docker run --platform=windows mcr.microsoft.com/windows/servercore:ltsc2016
docker run --platform=linux alpine:latest