Top 5 Exclusive Features of Docker Desktop For Mac That You Can’t Afford to Ignore

Top 5 Exclusive Features of Docker Desktop For Mac That You Can’t Afford to Ignore

Play this article

Docker for Mac 18.04.0 CE Edge Release went GA early last month. This was the first time Kubernetes version 1.9.6 & Docker Compose 1.21.0 was introduced under any Docker Desktop edition. ICYMI — Docker for Mac VM is entirely built with LinuxKit, hence this was the first release which enabled the RBD and CephFS kernel modules under LinuxKit VM. In case you’re new to RBD, the linux kernel RBD (rados block device) driver allows striping a linux block device over multiple distributed object store data objects. Usually the libceph module takes care of that.This release brought a number of fixes around upgrades from Docker for Mac 17.12, synchronisation between CLI `docker login` & GUI login, support for AUFS and much more.

Under this blog post, I will talk about top 5 exclusive and very useful features of Docker of Mac that you can’t afford to miss out.

#1: Docker for Mac support Docker Swarm, Swarm Mode & Kubernetes

Starting from Docker for Mac 17.12 CE Edge Release, Docker Inc introduced a standalone Kubernetes server and client, as well as Docker CLI integration. The Kubernetes server runs locally within your Docker instance, is not configurable, and is a single-node cluster.

One of the most anticipated feature introduced with this release was the Kubernetes server running within a Docker container on your local system. When Kubernetes support is enabled, you can deploy your workloads, in parallel, on Kubernetes, Swarm, and as standalone containers. Enabling or disabling the Kubernetes server does not affect your other workloads.

You can use Docker for Mac to test single-node features of swarm mode introduced with Docker Engine 17.12, including initializing a swarm with a single node, creating services, and scaling services. Docker “Moby” on Hyperkit serves as the single swarm node. You can also use Docker Machine, which comes with Docker for Mac, to create and experiment a multi-node swarm.

While testing Kubernetes, you may want to deploy some workloads in swarm mode. You can use the DOCKER_ORCHESTRATOR variable to override the default orchestrator for a given terminal session or a single Docker command. This variable can be unset (the default, in which case Kubernetes is the orchestrator) or set to swarm or kubernetes.

Check out my blog post:

2-minutes to Kubernetes Cluster on Docker for Mac 18.01 using Swarm CLI

#2: You can use the same Docker Compose to build Swarm & Kubernetes Cluster

Yes, you read it correct. Starting from Docker for Mac 17.12, Docker introduced a new type called “Stack” under This object, that you can create with kubectl or more easily with docker stack deploy, contains the compose file.Behind the scene, a controller watches for stacks and create/update corresponding kubernetes objets (deployments, services, etc). The job of the controller is to reconcile the stacks (stored in the api-server or crd) with k8s native object.

The docker stack deploy manages to deploy to K8s. It convert docker-compose files to k8s manifests (something like kompose) before deployment. Let me showcase an example which shows how one can use the same YAML file to build Swarm Mode as well as K8s cluster.

Clone the Repository

$git clone [](

Change to the right location

$cd docker101/play-with-kubernetes/examples/stack-deploy-on-mac/

Example-1 : Demonstrating a Simple Web Application

Building the Web Application Stack

$docker stack deploy -c docker-stack1.yml myapp1

Verifying the Stack

$docker stack ls

Verifying using Kubectl

$kubectl get pods

Verifying if the web application is accessible

$curl localhost:8083

Cleaning up the Stack

$docker stack rm myapp`

Example:2 — Demonstrating ReplicaSet

Building the Web Application Stack

$docker stack deploy -c docker-stack2.yml myapp2

Verifying the Stack

$docker stack ls

Verifying using Kubectl

$kubectl get pods
Ajeets-MacBook-Air:testenviron ajeetraina$ kubectl get stacks NAME AGE myapp2 22m
Ajeets-MacBook-Air:testenviron ajeetraina$ kubectl get pods NAME READY STATUS RESTARTS AGE db1-d977d5f48-l6v9d 1/1 Running 0 22m db1-d977d5f48-mpd25 1/1 Running 0 22m web1-6886bb478f-s7mvz 1/1 Running 0 22m web1-6886bb478f-wh824 1/1 Running 0 22m
Ajeets-MacBook-Air:testenviron ajeetraina$ kubectl get stacks myapp2 -o yaml apiVersion: kind: Stack metadata: creationTimestamp: 2018-01-28T02:55:28Z name: myapp2 namespace: default resourceVersion: "3186" selfLink: /apis/ uid: b25bf776-03d6-11e8-8d4c-025000000001 spec: stack: Configs: {} Networks: {} Secrets: {} Services: .. WorkingDir: "" Volumes: {} status: message: Stack is started phase: Available

Verifying if the web application is accessible

$curl localhost:8083

Cleaning up the Stack

$docker stack rm myapp2

An Interesting Read:

5 Minutes to Bootstrap Kubernetes Cluster on GKE using Docker for Mac 18.03.0

#3: Docker for Mac provides Multi-Architecture Support

Docker for Mac provides binfmt_misc multi architecture support. This means that now you can run containers for different Linux architectures, such as arm, mips, ppc64le, and even s390x.

#4: Support for NFS Volume sharing under Swarm as well as Kubernetes

With Docker for Mac 18.03 release, NFS Volume sharing support for both Swarm & Kubernetes was introduced. To demonstrate this feature, follow the below steps:


  • Install Docker for Mac 18.03 and future version
  • Enable Kubernetes under Preference Pane UI

Cloning the Repository

git clone cd docker101/for-mac/nfs

Execute the below script on your macOS system

sh +-----------------------------+ | Setup native NFS for Docker | +-----------------------------+ WARNING: This script will shut down running containers. -n Do you wish to proceed? [y]: y == Stopping running docker containers... == Resetting folder permissions... Password: == Setting up nfs... == Restarting nfsd... The nfsd service does not appear to be running. Starting the nfsd service == Restarting docker... SUCCESS! Now go run your containers ?

Bringing up Your Application

docker stack deploy -c docker-compose.yml myapp2 docker stack ls NAME SERVICES myapp2 1
[Captains-Bay]? > kubectl get po NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 3m [Captains-Bay]? > kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP <none> 443/TCP 1d web ClusterIP None <none> 55555/TCP 3m
[Captains-Bay]? > kubectl describe po web-0 Name: web-0 Namespace: default Node: docker-for-desktop/ Start Time: Wed, 11 Apr 2018 23:00:18 +0530 Labels: com.docker.stack.namespace=up2u controller-revision-hash=web-7dbbf8689d Annotations: <none> Status: Running IP: Controlled By: StatefulSet/web Containers: web: Container ID: docker://ec9ad2a3192bdeb0cc5028453310f40fd0ac3595021b070465c4e7725f626d63 Image: alpine:3.6 Image ID: docker-pullable://alpine@sha256:3d44fa76c2c83ed9296e4508b436ff583397cac0f4bad85c2b4ecc193ddb5106 Port: <none> Args: ping State: Running Started: Wed, 11 Apr 2018 23:00:19 +0530 Ready: True Restart Count: 0 Environment: <none> Mounts: #{CONTAINER_DIR} from nfsmount (rw) /var/run/secrets/ from default-token-n8trf (ro) Conditions: Type Status Initialized True Ready True PodScheduled True Volumes: nfsmount: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: nfsmount-web-0 ReadOnly: false default-token-n8trf: Type: Secret (a volume populated by a Secret) SecretName: default-token-n8trf Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: for 300s for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 5m default-scheduler Successfully assigned web-0 to docker-for-desktop Normal SuccessfulMountVolume 5m kubelet, docker-for-desktop MountVolume.SetUp succeeded for volume "pvc-bbdc7903-3dad-11e8-a612-025000000001" Normal SuccessfulMountVolume 5m kubelet, docker-for-desktop MountVolume.SetUp succeeded for volume "default-token-n8trf" Normal Pulled 5m kubelet, docker-for-desktop Container image "alpine:3.6" already present on machine Normal Created 5m kubelet, docker-for-desktop Created container Normal Started 5m kubelet, docker-for-desktop Started container

#5: Docker for Mac support context switching from docker-for-desktop to Cloud instances in a matter of a Click

Starting from Docker for Mac 18.02 RC release, the context switching feature was introduced which helped developers and operators to switch from docker-for-desktop to any Cloud environment in just a matter of a “toggle”.

I have a detailed blog post published early this year which demonstrates this feature with crystal clear examples. Check it out.

Context Switching Made Easy under Kubernetes powered Docker for Mac 18.02.0

Other attractive features of Docker for Mac 18.04 includes -

How to enter into LinuxKit VM?

$screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
/ # cat /etc/issue Welcome to LinuxKit ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === { / ===- \______ O __/ \ \ __/ \____\_______/
/ # cat /etc/os-release PRETTY_NAME="Docker for Mac" / #
linuxkit-025000000001:~# cat /etc/os-release PRETTY_NAME="Docker for Mac" linuxkit-025000000001:~# runc list ID PID STATUS BUNDLE CREATED OWNER 000-metadata 0 stopped /containers/onboot/000-metadata 2018-05-05T06:27:44.345735031Z root 001-sysfs 0 stopped /containers/onboot/001-sysfs 2018-05-05T06:27:44.768313965Z root 002-binfmt 0 stopped /containers/onboot/002-binfmt 2018-05-05T06:27:45.630283593Z root 003-format 0 stopped /containers/onboot/003-format 2018-05-05T06:27:46.341011253Z root 004-extend 0 stopped /containers/onboot/004-extend 2018-05-05T06:27:47.08889973Z root 005-mount 0 stopped /containers/onboot/005-mount 2018-05-05T06:27:55.334088074Z root 006-swap 0 stopped /containers/onboot/006-swap 2018-05-05T06:27:56.486815308Z root 007-ip 0 stopped /containers/onboot/007-ip 2018-05-05T06:28:03.894591249Z root 008-move-logs 0 stopped /containers/onboot/008-move-logs 2018-05-05T06:28:05.980232896Z root 009-sysctl 0 stopped /containers/onboot/009-sysctl 2018-05-05T06:28:06.15775421Z root 010-mount-vpnkit 0 stopped /containers/onboot/010-mount-vpnkit 2018-05-05T06:28:06.356833391Z root 011-bridge 0 stopped /containers/onboot/011-bridge 2018-05-05T06:28:06.551619273Z root linuxkit-025000000001:~# ctr tasks ls
  • Docker for Mac uses raw format VM disks for systems running APFS on SSD on High Sierra by default
  • DNS name should be used instead of docker.for.mac.localhost (still valid) for host resolution from containers.

Did you find this blog helpful? Feel free to share your experience. Get in touch with me at twitter @ajeetsraina.

If you are looking out for contribution/discussion, join me at Docker Community Slack Channel.

Originally published at on May 1, 2018.

Did you find this article valuable?

Support Collabnix by becoming a sponsor. Any amount is appreciated!