docker contextとDOCKER_HOSTが分かったのでcolimaがすごく便利になった

結論

  • Docker は複数の接続先 ( engine ) を切り替えながら利用することができる
  • このとき利用するのは context と $DOCKER_HOST
  • 外部のコマンドが docker を起動する場合、$DOCKER_HOST しか影響しない場合があるので default の docker engine を local machine ではないものにしたい場合は docker context と $DOCKER_HOST の両方の設定が大事

docker context

docker 19.03.0 以降かな?

Docker Engine 19.03 release notes | Docker Documentation

Docker Context | Docker ドキュメント

  • docker CLI は context を利用して単一の CLI ( docker クライアント ) から複数の swarm クラスタ、複数の kubernates クラスタ、複数の docker ノードを操作できる
  • Docker Desktop をインストールすると default context が一つ生成される

colimaとcontextコマンド

abiosoft/colima: Container runtimes on macOS (and Linux) with minimal setup

colima を利用すると lima を利用した VM 上の Linux 環境とその Linux 上で利用できる docker 環境を簡単に構築できる。

※ 詳細は端折るが M1 Mac では VirtualBox は使えないし、コマンドからお手軽に Linux VM を作るには lima / colima はとてもよい選択肢だと思う。あまり考えずに colima 使っとくといい。Vagrant + VirtualBox よりお手軽。

colima start

した状態で

docker context ls

を実行すると以下のような出力を得られる。

NAME       TYPE  DESCRIPTION                    DOCKER ENDPOINT 
colima     moby  colima                         unix:///${HOME}/.colima/docker.sock
default *  moby  Current DOCKER_HOST based ...  unix:///var/run/docker.sock      

この出力は以下を示している。

  1. colima が context を生成し、ホスト側( docker CLI をインストールしている local 環境 ) の unix domain socket で通信できるように endpoint を設定してくれている様子
  2. default は(恐らく Docker Desktop で設定された) /var/run/docker.sock が選択されていること

例えばここで

docker context use colima

を叩くと

docker context ls

上でのアスタリスク (*) の位置が colima 側に移り、以降の docker コマンドの接続先は colima 内の dockerd になり、colima の設定次第だが M1 Mac 上でも Linux on x86_64 の環境を前提にした作業が普通に行えるようになる。docker 越しなら。

context useとdocker外のアプリケーションからの利用

  1. docker コマンドでの接続先は docker context use で設定できる
  2. docker コマンド外からの接続には context が使われない場合もあり、その際は環境変数 DOCKER_HOST や DOCKER_CONTEXT の設定が必要

ハマった事例

Getting Started · Cloud Native Buildpacks

docker build を真面目に頑張りたくないと思い、buildpacks の利用を考えたのだが、この際 buildpacks で利用できる image は x86_64 向けしかなく、M1 Mac ( Arm64 arch ) では動作しないという問題に当たった。

そこで

  • colima を利用して x86_64 環境を用意
  • docker context use で colima 上の dockerd に接続できていることを確認

を準備し、pack コマンドから x86_64 の Linux 環境上で docker build を実行したつもりだったが、実は local の dockerd に繋ごうとしていた

ここで必要だったのは docker context use ではなく

環境変数 DOCKER_HOSTDOCKER_CONTEXT の設定

だった。

DOCKER_HOSTやDOCKER_CONTEXTといった環境変数を使うか、コマンドラインから–contextや–hostフラグを指定することで、その対象をオーバーライドすることができます。

リンク

More