What’s Changed in Docker Services Term
Docker has just announced updates to their services terms and here is the most important change that you need to be aware of:
Commercial use of Docker Desktop in larger enterprises (more than 250 employees OR more than $10 million USD in annual revenue) requires a Docker Pro, Team or Business subscription for as little as $5 per user per month.
Disclaimer: this post is not to be considered legal advice and is merely an opinion piece.
What’s Docker Desktop
Docker (the engine and its accompanying toolset like docker-compose) remain open-source under Apache 2.0 license which allows commercial use of the software. However, Docker Engine does not natively work on non-Linux operating systems. This is where Docker Desktop comes into play.
Before Docker Desktop, we had to use tools such as Boot2Docker and Docker Machine to spin up virtual machines with hypervisors such as VirtualBox or cloud providers like Amazon Web Services or Digital Ocean to host one or more Docker Engines for us. It worked but was a bit fiddly when it came to file sharing and port-forwarding between the VMs and the host OS.
Docker Desktop encapsulates this and while behind the scenes uses a VM to host Docker Engine, it did that in a way that did not require user intervention. So the need for Docker Machine faded away as evident from their GitHub repository pulse and Boot2Docker’s readme:
Boot2Docker is officially deprecated and unmaintained. It is recommended that users transition from Boot2Docker over to Docker Desktop instead (especially with the new WSL2 backend, which supports Windows 10 Home).
Now, over 5 years after its inception, Docker Desktop provides seamless integration with Docker Engine and offers a variety of GUI features like a menubar icon for you to quickly stop/start the engine, see a list of your images, your volumes, auto-update, and more. I personally have never used any of the GUI features but these are features that always came in the bundle so I just ignored them.
Why You Should Act
This brings us to where we are today. Docker Desktop (the bundle) continues to be free for Personal, Educational, and Small Business use. For larger businesses however, this is no longer the case.
If you or your employees use Docker on Windows or MacOS development machines, there is a good chance that Docker Desktop is being used. If that’s the case and your business is not considered a “Small Business Environment” as described in the terms, then it is in your interest to start making some changes.
The new terms take effect on August 31, 2021 with a grace period until January 31, 2022 for those that will require a paid subscription to continue using Docker Desktop. By continuing to use Docker, you are agreeing to the new Docker Subscription Service Agreement.
Even if you don’t have a use for Docker Desktop and only need the open-source Docker Engine. They’re inseparable… kind of!
As for servers and CI/CD pipelines, as long as you are not using Docker Desktop then there is probably no actions required.
What Are Your Options
You have two options from here:
Subscribe to a Docker Desktop plan that works for you and your team from docker.com/pricing
Replace Docker Desktop with an alternative solution
Have in mind that while Docker (the company) are the pioneers who made process isolation technology like cgroups accessible to the general consumer, they also played a big role in standardising the technology with the Open Container Initiative (OCI). Because of that, today it is possible to switch runtimes and frontends with minimum hassle the same way Kubernetes switched from Docker to OCI runtimes last year rather seamlessly.
Alternatives to Docker Desktop
A lot has changed since the times we had to mess around with Boot2Docker. So let’s have a look at a couple of options that work in this day and age.
Also, for migrating your images I’ll provide a method that should apply to any option you decide to go with.
containerd
containerd is a runtime daemon that supports Linux and Windows natively. MacOS users may wish to move on to the next item in this list.
Windows users may refer to this guide for more details. I’m not your guy when it comes to system engineering on Windows. I use a package manager called Steam on Windows and that’s plenty good for me.
Lima
Lima is a Linux Virtual Machine for MacOS that runs containerd (the same runtime adopted by major managed Kubernetes providers). It also provides seamless port-forwarding and file sharing which was an issue back in the Boot2Docker days of glory. nerdctl is containerd’s CLI which is Docker compatible meaning most Docker CLI commands carry across with minimum drama.
Installing Lima
Using Homebrew:
brew install lima
limactl start default
And for a quick demo:
nerdctl.lima pull docker.io/library/httpd
nerdctl.lima run -d -p 8080:80 httpd
curl localhost:8080
Notice that we didn’t have to manually intervene and port-forwarding our VM’s port 8080.
Podman
What is Podman? Podman is a daemonless container engine for developing, managing, and running OCI Containers on your Linux System.
Podman supports the Docker API and its CLI remains close to that of Docker CLI. Here’s a list of supported and unsupported Docker commands in the Podman ecosystem.
Installing Podman
Using Homebrew:
brew install podman
podman machine init
podman machine start
For other platforms, refer to the podman installation guide.
Another quick demo:
podman pull docker.io/library/httpd
podman run --network bridge -d -p 8080:80 httpd
curl localhost:8080
Migrating Your Images
If you don’t want to start with clean slate and have images you wish to keep, then follow these steps otherwise move on to the next part.
You can save your docker images in tarballs using the docker image save command:
docker image save -o my_images.tar my-image-name-or-id [other-image-ids]
Alternatively, you can create create a tarball that includes all of your docker images. Be mindful that if you have a large number of images, this can take a while and produce a large output. So I recommend using this opportunity to do a bit of spring cleaning and docker rmi any images that you don’t actually need anymore.
Once happy with the list of images you wish to export, proceed with:
docker images --filter 'dangling=false' --format '{{ .Repository }}:{{ .Tag }}' | \
xargs docker image save -o images.tar
Now import the exported tarball into your newly installed CLI, I’m using nerdctl.lima for the sake of the example:
nerdctl.lima image load -i images.tar
Verify your imported images:
nerdctl.lima images
Docker Machine
Surprisingly, Docker Machine still works with all its known quirks. It’s been unmaintained for several years and runs an older version of Docker Engine. Because of that, it is not recommended to use it until someone decides to revive the project and dust it off. I wouldn’t be surprised if Docker (the company) let it continue dying its silent death and don’t accept patches. So, a fork may emerge.
Good Luck
These are early days of this announcement. The projects that provided support for Docker on non-Linux operating systems stopped being developed in favour of Docker Desktop only for the rug to be pulled after a couple of years. Luckily there are modern alternatives like containerd, Lima, and Podman, however the road ahead will be a little bumpy until these projects reach maturity in their non-native environments like MacOS. Until then, good luck and may you have patience.