Switch between docker platforms (macOS)

Introduction

Docker Engine … Client-server application

Docker CLI <--[ Unix domain socket ]--> Docker daemon
  (docker)      (Docker REST API)       (dockerd)

Docker Desktop / OrbStack … Superset of Docker Engine

                                              |   Linux VM    |
    Docker CLI <--|                           |---------------|
                  |--[ Unix domain socket ]-->| Docker daemon |
Docker Desktop <--|                           |---------------|
or OrbStack GUI

Motivation
If you have installed multiple Docker platforms (Docker Desktop, OrbStack) on your macOS, you most likely want to switch between them.


Switch the Docker CLI

Scenario
You are using the console to interact with docker. To switch the Docker CLI, you have to switch the symlink.

Bash script

#!/bin/bash

DOCKER_SYMLINK="/usr/local/bin/docker"
ORBSTACK="/Applications/OrbStack.app/Contents/MacOS/xbin/docker"
DOCKER_DESKTOP="/Applications/Docker.app/Contents/Resources/bin/docker"

function usage() {
    echo "Usage: $0 [orbstack|desktop|status]"
    exit 1
}

function switch_to_orbstack() {
    sudo ln -sf "$ORBSTACK" "$DOCKER_SYMLINK"
    echo "Switched Docker CLI to OrbStack."
}

function switch_to_desktop() {
    sudo ln -sf "$DOCKER_DESKTOP" "$DOCKER_SYMLINK"
    echo "Switched Docker CLI to Docker Desktop."
}

function show_status() {
    TARGET=$(readlink "$DOCKER_SYMLINK")
    echo "Current symlink: $DOCKER_SYMLINK -> $TARGET"
    if [[ "$TARGET" == "$ORBSTACK" ]]; then
        echo "Currently using: OrbStack."
    elif [[ "$TARGET" == "$DOCKER_DESKTOP" ]]; then
        echo "Currently using: Docker Desktop."
    else
        echo "Currently using: Unknown target."
    fi
}

case "$1" in
    orbstack)
        switch_to_orbstack
        ;;
    desktop)
        switch_to_desktop
        ;;
    status)
        show_status
        ;;
    *)
        usage
        ;;
esac

Switch the Unix domain socket

Scenario
You are using a Docker toolchain with an IDE like CLion (JetBrains). To switch the used Unix domain socket, you have to change the toolchain settings.

Sockets

Docker Desktop: /Users/{user}/.docker/run/docker.sock
OrbStack: /Users/{user}/.orbstack/run/docker.sock

For CLion

  1. "Settings" --> "Build, Execution, Deployment" --> "Toolchains"
  2. Change "Docker for mac" in "Server" settings