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.
https://asciinema.org/a/179186
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 compose.docker.com. 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 https://github.com/ajeetraina/docker101
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: compose.docker.com/v1beta2
kind: Stack
metadata:
creationTimestamp: 2018-01-28T02:55:28Z
name: myapp2
namespace: default
resourceVersion: "3186"
selfLink: /apis/compose.docker.com/v1beta2/namespaces/default/stacks/myapp2
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.
https://asciinema.org/a/179189
#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:
Pre-Requisite:
- Install Docker for Mac 18.03 and future version
- Enable Kubernetes under Preference Pane UI
Cloning the Repository
git clone https://github.com/ajeetraina/docker101/
cd docker101/for-mac/nfs
Execute the below script on your macOS system
sh env_vars.sh
sh setup_native_nfs_docker_osx.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 10.96.0.1 <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/192.168.65.3
Start Time: Wed, 11 Apr 2018 23:00:18 +0530
Labels: com.docker.service.id=up2u-web
com.docker.service.name=web
com.docker.stack.namespace=up2u
controller-revision-hash=web-7dbbf8689d
statefulset.kubernetes.io/pod-name=web-0
Annotations: <none>
Status: Running
IP: 10.1.0.34
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
127.0.0.1
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/kubernetes.io/serviceaccount 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: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute 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 –
- Docker for Mac VM is entirely built with LinuxKit
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 docker.for.mac.host.internal 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.
Comments are closed.