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
この出力は以下を示している。
- colima が context を生成し、ホスト側( docker CLI をインストールしている local 環境 ) の unix domain socket で通信できるように endpoint を設定してくれている様子
- 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外のアプリケーションからの利用
- docker コマンドでの接続先は docker context use で設定できる
- 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_HOST
か DOCKER_CONTEXT
の設定
だった。
DOCKER_HOSTやDOCKER_CONTEXTといった環境変数を使うか、コマンドラインから–contextや–hostフラグを指定することで、その対象をオーバーライドすることができます。