Docker Desktop for Mac と Docker Toolbox の比較

既に Docker Toolbox をインストール済みの場合は、最初にこのトピックを読み、Docker Desktop on Mac と Docker Toolbox の違いを学び、どのようにして共存するかを学びます。

Docker Toolbox 環境

Docker Toolbox は Mac 上の /usr/local/bin に、 dockerdocker-composedocker-machine をインストールします。また、 VirtualBox もインストールします。インストール時に、 Toolbox は docker-machinedefault という名前の VirtualBox 仮想マシンをプロビジョン(自動構築)し、 boot2docker Linux ディストリビューション上で Docker Engine を実行し、Docker Engine が使う証明書を $HOME/.docker/machine/machines/default に置きます。

Mac 上で dockerdocker-compose を使う前に、 eval $(docker-machine env default) のような典型的なコマンドを使い、 dockerdocker-compose が VirtualBox 上で実行している Docker Engine と通信するために必要な環境変数を指定します。

セットアップすると下図のようになります。

Docker Desktop on Mac 環境

Docker Desktop on Mac は、 /Applications にインストールする Mac ネイティブのアプリケーションです。インストール時に /Applications/Docker.app/Contents/Resources/bin から :code: /usr/local/bindockerdocker-compose 等のシンボリックリンクを作成し、様々なコマンドを実行できるようにします。

以下は、 Docker Desktop on Mac を使い始める前に知っておく重要なポイントです:

  • Docker Desktop は VirtualBox の代わりに HyperKit を使います。Hyperkit は軽量な macOS 仮想化ソリューションであり、 macOS 10.10 Yosemite 以降の Hypervisor.framework 上で構築されています。
  • Docker Desktop on Mac をインストールしても、Docker Machine で作成したマシンは影響を受けません。
  • Docker Desktop は仮想マシンのプロビジョンに docker-machine を使いません。Docker Engine API は Mac ホスト上の /var/run/docker.sock に露出しているソケットで利用できます。これは Docker と Docker Compose クライアントが Docker デーモンと通信するためのデフォルトの場所です。つまり、 dockerdocker-compose CLI コマンドが Mac 上で使えます。

セットアップすると下図のようになります。

Docker Desktop on Mac では、得られるのは1つの仮想マシン(通常必要なのは1つ)です。この仮想マシンは Docker Desktop によって管理されます。Docker Desktop は更新が利用出来るようになれば、自動的に Docker クライアントとデーモンを自動的に更新します。

また、Docker Desktop はコンテナに対するトラフィックは径路付け(route)できないので注意してください。つまり、ホストマシン上で実行しているコンテナが公開しているポートに、直接アクセスできません。

複数のノードの swarm のような、複数の仮想マシンが必要な場合は、Docker Machine を利用し続けられます。Docker Machine は Docker Desktop が操作する範囲外です。詳細は Docker Toolbox と Docker Desktop の共存 をご覧ください。

Docker Desktop on Mac を動かすためのセットアップ

  1. どこで Toolbox の DOCKER 環境変数が指定されているか確認します。
$ env | grep DOCKER
DOCKER_HOST=tcp://192.168.99.100:2376
DOCKER_MACHINE_NAME=default
DOCKER_TLS_VERIFY=1
DOCKER_CERT_PATH=/Users/<your_username>/.docker/machine/machines/default

コマンドを実行しても出力が何もなければ、既に Docker Desktop を利用する準備が整っています。

もし(上の例のように)出力があれば、 DOCKER 環境園数を無効化し(次のステップ)、 Docker Desktop エンジンとクライアントが通信できるようにします。

2.  シェル上で DOCKER 環境変数を無効化(unset)するために、以下の unset コマンドを実行します。

unset DOCKER_TLS_VERIFY
unset DOCKER_CERT_PATH
unset DOCKER_MACHINE_NAME
unset DOCKER_HOST

それから、次のコマンドを実行しても、何も出力がないのを確認します。

$ env | grep DOCKER

Bash シェルを使っている場合は、 unset ${!DOCKER_*} を使い、全ての DOCKER 環境変数を一度で無効化できます。(これは zsh のような他のシェルでは動作しません。すなわち、環境変数を1つ1つ無効化する必要があります)

注釈

コマンド画面を開くとき、自動でシェルスクリプトの profile ファイルの一部で各 DOCKER 環境変数を読み込んでいる場合、Docker Desktop を使いたい時には都度それぞれの環境変数を無効化する必要があります。

警告

Docker Toolbox がインストール済みのマシンに Docker Desktop をインストールすると...
Docker Desktop は /usr/local/bin にある dockerdocker-compose コマンドラインのシンボリックリンクを、Docker Desktop のものへ書き換えます。

Docker Machine トピックにある 現在のシェルで環境変数をアンセットする もご覧ください。

Docker Toolbox と Docker Desktop の共存

同じマシン上で Docker Desktop と Docker Toolbox を一緒に利用できます。Docker Desktop を使いたい場合は、全ての DOCKER 環境変数を無効化します。これを bash でするには unset ${!DOCKER_*} です。 docker-machine で設定した VirtualBox 仮想マシンの1つを使いたい場合には、 eval $(docker-machine env default) を実行します(あるいは、対象となるマシン名を指定します)。現在操作しているコマンドのシェルで切り替えることにより、特定の Toolbox マシンと通信できるようになります。

セットアップした状態は、下図のように表せます。

異なるバージョンの Docker ツール群を使う

Docker Desktop と Docker Machine を共存するセットアップをすると、 docker-machine でプロビジョンした VirtualBox 仮想マシンはそのまま残っています。もしも古いバージョンの Docker Engine が動作している仮想マシンを使う必要があれば、 Docker Version Manage のようなツールを使い、docker クライアントで複数のバージョンを管理できるようにします。

コンポーネントのバージョン確認

理想としては、 Docker CLI クライアントと Docker Engine のバージョンは同一であるべきです。クライアントとサーバまたはホストマシンでの不一致により、作成した Docker Machine が何らかの問題を引き起こす可能性があります(クライアントがサーバやホストマシンと通信できないなど)。

既に Docker Toolbox をインストールしていて、追加で Docker Desktop をインストールした場合、おそらく新しいバージョンの Docker クライアントを入手します。コマンド・シェル内で docker version を実行し、クライアントとサーバのバージョンを確認します。以下の例では、Docker Desktop でインストールしたクライアントのバージョンは Version: 19.03.1 で、サーバ(Docker Toolbox で先にインストールしていたもの)は Version: 19.03.2 です。

$ docker version
Client:
Version:      19.03.1
...

Server:
Version:      19.03.2
...

また、(Toolbox でインストールした)Docker Machine でマシンを作成していた場合は、アップグレードや Docker Desktop のインストールにより、異なるバージョンの Engine を実行することがあります。 docker-machine ls を実行し、作成したマシンのバージョン情報を表示します。 DOCKER 列で、各マシン上で異なるバージョンのサーバが動作しているのがわかります。

$ docker-machine ls
NAME             ACTIVE   DRIVER         STATE     URL                         SWARM   DOCKER    ERRORS
aws-sandbox      -        amazonec2      Running   tcp://52.90.113.128:2376            v19.03.1
default          *        virtualbox     Running   tcp://192.168.99.100:2376           v19.03.2
docker-sandbox   -        digitalocean   Running   tcp://104.131.43.236:2376           v19.03.1

Docker Universal Control Plane (UCP) を使っている場合であれば、似たような状況になるでしょう。

この問題への対処や古いマシンを使い続けるには、複数の方法があります。解決策の1つは、 DVM のようなバージョン管理ソフトを使う方法です。

Docker Toolbox から Docker Desktop on Mac への移行

Docker Desktop では、バージョン 18.01.0 以降のインストーラの一部として、 Toolbox イメージ移行を提案しなくなりました。既存の Docker Toolbox イメージの移行は、以下のスクリプトで行えます(この移行方法では、 Docker と Toolbox の両方の統合はできません。なぜなら、あらゆる既存の Docker イメージは Toolbox のイメージに置き換えるからです)。

ターミナル内で以下のシェル・コマンドを実行します。動作には MacPorts と Brew 両方の qemu パッケージに含まれる qemu-img が必要です。

$ brew install qemu  # or sudo port install qemu

まず、自分の Toolbox ディスクイメージがどこか探します。おそらくこちらでしょう: ~/.docker/machine/machines/default/disk.vmd

$ vmdk=~/.docker/machine/machines/default/disk.vmdk
$ file "$vmdk"
/Users/akim/.docker/machine/machines/default/disk.vmdk: VMware4 disk image

次に、 Docker Desktop が使用しているディスク・イメージの場所とフォーマットを確認します。

$ settings=~/Library/Group\ Containers/group.com.docker/settings.json
$ dimg=$(sed -En 's/.*diskPath.*:.*"(.*)".*/\1/p' < "$settings")
$ echo "$dimg"
/Users/akim/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw

今回はフォーマットは raw です( qcow2 の場合もあります) 。また、場所は ~/Library/Containers/com.docker.docker/Data/vms/0/ です。

それから

  • フォーマットが qcow2 であれば、次の様に実行します。
$ qemu-img convert -p -f vmdk -O qcow2 -o lazy_refcounts=on "$vmdk" "$dimg"
  • フォーマットが raw であれば、以下のコマンドを実行します。ディスク容量の空きが少なければ、おそらく失敗するでしょう。
$ qemu-img convert -p -f vmdk -O raw "$vmdk" "$dimg"

(オプション)最後に、Docker Toolbox を使い終えるのであれば、完全に アンインストール したらよいでしょう。

Docker Toolbox をアンインストールするには?

新しい Docker Desktop を手に入れ、Docker Toolbox が不要になれば、アンインストールを決意するでしょう。Mac 上の Toolbox を完全にアンインストールするための詳細は、Toolbox Mac トピックの アンインストール をご覧ください。

参考

Docker Desktop on Mac vs. Docker Toolbox
https://docs.docker.com/docker-for-mac/docker-toolbox/