My previous post focussed on getting WSL 2 integrated with VS Code, so at this point, you should have a fully-fledged WSL 2 distro that plays nicely with VS Code.
The next step is to get WSL 2 working with Docker.
Docker, in a nutshell, is a tool for deploying and managing containers. Containers are loosely isolated environments that allow you to package your application into a standardised "unit". They allow you to abstract away your application from the environment you're running them on. You create containers from an image, which in turn is created through a set of steps defined through a Dockerfile.
I've been using Docker increasingly over the last couple of years, and the more I use it, the more uses I find for it:
I've worked with Docker as part of projects; providing consistent, repeatable and scalable environments for use by others.
I've used it to run tooling; meaning that I don't have to clutter my machine with a multitude of packages as I jump between projects, I can simply pull an image, run it, and trash it once I'm done.
More recently, I've started to use it as a fully functioning development environment, thanks in no small part to the VS Code Remote Container extension. @benmatselby has written a great tutorial on getting up and running with VS Code dev containers, I'd wholeheartedly recommend that you give it a read.
First things first, you're going to need to install Docker Desktop Stable 184.108.40.206 or later. Docker Desktop is the application that will allow us to build and run our containers on both Windows and WSL.
During the installation, you'll be prompted to enable any Windows components necessary for WSL 2. You want to do this.
Provided you've followed the steps from my first post in the series, you should be ready to go with Docker Desktop 🐳
Now we've got Docker Desktop installed, there's a two-step checklist we'll need to run through to integrate with WSL 2.
Step 1: Enable the WSL 2 based engine
Theoretically, this option should be enabled by default; Docker Desktop will recognise the fact that you have WSL 2 enabled and assume that you want this feature switched on, which you do. It's always good to confirm these things though, so open up Docker Desktop, then select
Settings -> General.
If for whatever reason you did need to enable the WSL 2 engine, be sure to "Apply & Restart" Docker Desktop.
If we have a little peek under the hood at what's happened here, you'll notice that we now have a couple of extra WSL distros.
> wsl -l -v NAME STATE VERSION * Ubuntu-18.04 Running 2 docker-desktop-data Running 2 docker-desktop Running 2
These are installed by Docker Desktop when you enabled the WSL 2 engine. At the risk of horribly exposing my lack of knowledge around the architecture of Docker Desktops WSL 2 backend, I'll keep this short and sweet:
docker-desktopreplaces the Hyper-V VM implementation Docker Desktop previously used. This handles bootstrapping and management of containers.
docker-desktop-datais where your images and configuration are stored; this is essentially a direct replacement of the Virtual Hard Disk that was used previously by Hyper-V.
This is great for a couple of reasons. Firstly, it solves the odd restriction Microsoft placed on Windows Home users, for whom Hyper-V (and by extension, Docker) is not available. Although as Jeff says, life finds a way.
Secondly, because your WSL distros get full access to all of your CPU cores and 80% of your RAM, resource allocation is far more dynamic, which on the whole helps to improve a Windows users' Docker experience.
Step 2: Enable WSL integration for your distro
Now we have the WSL 2 Engine running, we need to make sure our distro has access to the Docker server running in
docker-desktop. Open up Docker Desktop, then select
Settings -> Resources -> WSL Integration.
Any WSL 2 distro will appear in this list. Select whatever distros you'd like to have access to Docker, then select "Apply & Restart".
All that's left to do now is give Docker a go in our WSL 2 distro of choice:
Although I'm a strong advocate of using WSL 2, there may be reasons why this is either unavailable or impractical for you.
There's a little more legwork involved (and a lot less documentation) in getting WSL 1 working with Docker, so here's a quick guide on how I got this working before I migrated to WSL 2:
Step 1: Install Docker Desktop
If you don't already have it, you're going to need to install Docker Desktop for Windows.
Step 2: Expose the Docker daemon on Docker Desktop
Docker Desktop has an option that allows you to open a port to expose the Docker daemon to other clients. You're going to need to have this setting selected:
Step 3: Install the Docker CLI on WSL 1
Follow the instructions for installing Docker on Ubuntu, right up until you get to this point:
sudo apt-get install docker-ce docker-ce-cli containerd.io
You need only install
docker-ce-cli, as you're going to connect to the exposed port on your Windows machine to access the Docker daemon.
sudo apt-get install docker-ce-cli
Step 4: Update
The Docker CLI has a list of environment variables that it looks for when it runs. One of these is
We want to update
DOCKER_HOST in WSL so that the Docker CLI knows that we want to connect to the exposed Docker daemon on your Windows machine:
If you want to make this change a little more permanent, you can add it to a shell config file of your choosing:
echo "export DOCKER_HOST=tcp://localhost:2375" >> ~/.zshrc && . ~/.zshrc
With those 4 steps complete, you'll be able to run Docker commands from WSL 1.
Part 3 of the series is complete! The next item I'll discuss is using a standalone terminal with WSL 2, and how to configure it.
- Getting started with Docker
- Docker Desktop - User Manual
- Installing Docker Desktop on Windows
- Docker Desktop - WSL 2 Backend Architecture
Jexo for the photo 📷