How to set up Docker within Windows System for Linux (WSL2) on Windows 10
I've written about WSL2 and it's glorious wonders many times. As its release (presumably) grows closer - as of this writing it's on Windows Insiders Slow and Fast - I wanted to update a few posts. I've blogged about a few cool thing around WSL and Docker
- Docker Desktop for WSL 2 integrates Windows 10 and Linux even closer
- Remote Debugging a .NET Core Linux app in WSL2 from Visual Studio on Windows
- Cool WSL (Windows Subsystem for Linux) tips and tricks you (or I) didn't know were possible
- Ruby on Rails on Windows is not just possible, it's fabulous using WSL2 and VS Code
- Easily move WSL distributions between Windows 10 machines with import and export!
- What's the difference between a console, a terminal, and a shell?
Here's a little HanselFAQ and some resources.
I want to run Linux on Windows
You can certainly use HyperV or VirtualBox and run a standard Virtual Machine. Download an ISO and mount it and run "a square within a square." It won't be seamlessly integrated within Windows - it'll be like the movie Inception - but it's time-tested.
Better yet, install WSL or WSL2. It'll take 5-10 minutes tops if your Windows 10 is somewhat up to date.
- How to install WSL on Windows 10
- WSL doesn't include a Linux kernel. Its Linux file system access is kinda slow, but it accesses Windows files super fast. If you use Cygwin, you'll love this, because it's really Linux, just the kernel is emulated.
- How to install WSL2 on Windows 10
- WSL2 ships an actual Linux kernel and its Linux file system is 5x-10x faster than WSL. WSL2 uses a tiny utility VM that expands contracts its memory and you can manage distros with the wsl command line.
- Do all your development work inside here, while still using VS Code on Windows. It's amazing. Watch me set up a friend with WSL2, LIVE on YouTube.
I want to SSH into Linux stuff from Windows
There's 15 years of websites telling you to install Putty but you might not need it. OpenSSH has been shipping in Windows 10 for over two years. You can add them with Windows Features, or if you like, grab a release and put it on your PATH.
You can also do things like set up keys to use Windows 10's built-in OpenSSH to automatically SSH into a remote Linux machine. I also like to setup Signed Git Commits with a YubiKey NEO and GPG and Keybase on Windows.
I need a better Terminal in Windows
The new Windows Terminal is for you. Download Windows Terminal now for free. It's open source. You can then run the Win64/Win32 ssh from above, or run any Linux distros SSH. Have fun. It's time.
NOTE: Have you already downloaded the Terminal, maybe a while back? Enough has changed that you should delete your profiles.json and start over.
You can download the Windows Terminal from the Microsoft Store or from the GitHub releases page. There's also an unofficial Chocolatey release. I recommend the Store version if possible.
My prompt and fonts are ugly
Make them pretty. You deserve the best. Go get Cascadia Code's CascadiaPL.ttf and PowerLine and buckle up buttercup. Get a nice theme and maybe a GIF background.
I want to use Docker on Windows and I want it to not suck
Surprise, it's actually awesome. You may have had some challenges with Docker a few years ago on Windows and gave up, but come back. There's been a huge (and fascinating) architecture of Docker on Windows. It's very nicely integrated if you have WSL2.
If you have WSL2 set up nicely, then get Docker Desktop WSL2. This version of Docker for Windows uses WSL2 as its engine allowing you to share your docker context across Windows and Linux on the same machine! As the maker intended!
WSL 2 introduces a significant architectural change as it is a full Linux kernel built by Microsoft, allowing Linux containers to run natively without emulation. With Docker Desktop running on WSL 2, users can leverage Linux workspaces and avoid having to maintain both Linux and Windows build scripts.
So that means
- Install Windows 10 Insider Preview build 19018 or higher
- Enable WSL 2 feature on Windows. For detailed instructions, refer to the Microsoft documentation.
- Download Docker Desktop Edge 184.108.40.206 or a later release.
Ensure your default WSL instances is WSL2. You can do that with
wsl -l -v, and then
wsl --set-version <distro> 2
Then within Docker Desktop for Windows you've got two things to check. First, are you using WSL2 as your backend?
And then, the often missed setup, check under Resources | WSL Integration and tell Docker which WSL2 distros you want to use to access Docker. If you're paying attention you may notice that Docker Desktop tries to prompt you with a notification in Action Center but you might miss it.
NOTE: If you used an early Tech Preview, you might have an extra now-vestigial Docker context named "wsl." You want to use the Default one, not the WSL one.
This isn't intuitive or obvious and you might get weird errors like these
docker wsl open //./pipe/docker_wsl: The system cannot find the file specified.
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_wsl/v1.40/images/json?all=1: open //./pipe/docker_wsl: The system cannot find the file specified.
You can see if you have an extra context from before like below. That "wsl" one is older (if you have it) and you want to use default in both Windows and WSL2.
docker context ls
NAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT
default * Current DOCKER_HOST based configuration npipe:////./pipe/docker_engine https://kubernetes.docker
wsl Docker daemon hosted in WSL 2 npipe:////./pipe/docker_wsl
I actually removed that one to avoid confusion with
docker context rm wsl.
Here's Ubuntu on my Windows machine
And here's my Windows machine. Note that docker images in both instances returns the same list. They are the same Docker backend!
I want to code in VS Code on Windows but compile on Linux
At this point once I've set things up I can go bananas. I can do Container-based development, where I use VS Code to run all my developer tools and builds insider a container...maybe I never event install Go or PHP or .NET Core. It's all just inside a container.
Oh, by the way, please Subscribe to my YouTube! I talk a lot about this stuff over there.