I understand that it is currently possible to run Ubuntu on Windows 10 in two different ways:
- Using the Windows Subsystem for Linux (WSL).
- Installing docker for Windows 10, and use a container with Ubuntu.
However, I could not find an easy to understand explanation of what are the differences between them (talking about applications), as well as advantages and disadvantages.
I found a post talking about using docker on WSL: Ubuntu via (Windows Linux Subsystem) and Docker. But I'm talking about using it directly on Windows 10. So I will appreciate any information about these two.
Updated 2020/02/18 to reflect changes introduced in WSL2
Hi! Microsoft PM working on WSL & Command Line here.
WSL allows you to run native, unmodified Linux ELF-64 binaries directly on Windows, and enables you to run your favorite Linux tools atop your Windows "host" OS.
WSL1 took an approach of adding a Linux syscall compatible layer at the top of the NT kernel, allowing Linux binaries to run atop NT, sharing the same underlying filesystem, networking, process list, etc. as the host OS.
The soon to be released WSL2, on the other hand, runs distros' binaries within Linux containers, atop a real Linux kernel, inside a lightweight VM that allocates only the RAM needed by the apps it runs, and then releases freed RAM back to the host OS. This provides 100% Linux compatibility, and allows your Linux tools to run with near native performance, and consumes minimum resources necessary from the host, ensuring your machine runs fast and smoothly.
Prior to WSL2, one could run the Docker client in WSL1, using it to drive Docker for Windows running atop Hyper-V on the local host, or to manage a remote Docker server. But one cannot run Docker Engine on WSL1 for many technical reasons.
However, you can do the same in Docker on WSL2, but you can also run the Docker Engine itself atop WSL if you prefer. This is, Docker's preferred and future path for running Docker on Windows desktop.
To learn more about WSL, review the videos & docs here: https://aka.ms/learnwsl
That is correct. One thing that you do fail to mention is that WSL is currently rather slow in io even with a fast ssd/lots of ram/8-core xeon cpu. This is still a problem in 01/2019. I just did a ray@DESKTOP-O0MT13B:/mnt/c/Users/rayjh$ dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync on my workstation with a samsung SSD and only got 97.6 MB/s.
Running bare metal ubuntu LTS this box will get SEVERAL times that. Never mind the endless problems when you try to combine WSL with VSCODE.
I'm wiping windows 10 off of here and installing ubuntu 18.04LTS.
At the time the question was asked, there were actually three ways to run Ubuntu on Windows 10:
Currently, there are two additional options:
All five of these options are currently viable, and most are still useful in certain situations. All of these options allow ELF64 binaries to run unmodified in an Ubuntu ecosystem.
Ubuntu running under Docker Desktop with the WSL2 backend
Best for:
Weaker when:
Just about anything else. This isn't a bad thing -- Docker is a great containerization tool, but containers aren't meant to be a way to "run Ubuntu" in a general sense.*
For starters (and probably most importantly), containers are built up in an overlay filesystem that adds a layer each time you make a change. So each
sudo apt update && sudo apt upgrade
generates an entirely new layer on top of the old. This would be an incredibly wasteful way to run a "general use" system.Containers are usually rebuilt each time you need to make a change to the underlying system.
Also, when you are running Docker Desktop on Windows, you are almost always going to be using the WSL2 backend anyway. It's much more efficient to just use Ubuntu on WSL2 in that case.
Summary:
Ubuntu on WSL2
Best for:
Weaker when:
Summary:
Ubuntu in a virtual machine
Best for:
Weaker when:
Summary:
Ubuntu on WSL1
Best for:
inotify
support for files on a Windows drive, as this is not supported currently under WSL2.Weaker when:
The application you are running requires "lesser utilized" kernel capabilities. Since kernel syscalls are "translated" to the Windows API, not all capabilities are supported. Features such as Cgroups, namespaces, and others are not supported on WSL1 (but are on WSL2 and all other methods listed here).
The applications you are using (or directions you are following) utilize Systemd, which is not easily supported in WSL (1 or 2).
You need access to a Desktop environment (Gnome, Xfce4, etc.)
Summary:
Ubuntu in Docker Desktop using the Hyper-V backend
Best for:
Weaker when:
One of the biggest WSL issues is exactly IO, specially when mounting different filesystems. For instance, placing your files in Windows and mapping it through Docker Compose is terribly slow. Another way of working with WSL + Docker is to move your files to the box and connect remotely, like Visual Studio Code does with the Remote-WSL plugin (https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl). That way, you get rid of the overhead of unnecessary mounting points, which in fact, are nothing but network shares.