始める前に
- macOS 26以降のAppleシリコンMac。
- イメージとボリュームのコピー中にコンテキストが応答するよう、移行元アプリを起動しておきます。
- 本当に必要なものを整理します。再度pullできないイメージと、データ(データベース、アップロードファイル)が入った名前付きボリュームです。それ以外は作り直すほうが早く済みます。
- まず代表的なComposeプロジェクトを1つ試します。サービスが起動し、データが揃い、公開ポートが応答することを確認してから残りを移します。
Oxcartへの移行手順
- Oxcartをインストールします。 Oxcart(Appleシリコン、macOS 26以降)をダウンロードして開きます。セットアップはオフラインで数秒で完了します。コマンドラインツールをリンクするヘルパーのために、管理者パスワードを1回入力します。
- dockerツールをどうするか決めます。 Docker DesktopやOrbStackが
dockerをインストールしている場合、Oxcartは各ツールの両方のバージョンを表示し、置き換え前に確認します。Replaceは既定でオンです。Uninstallを実行すると、ほかのアプリのツールを復元します。 - oxcartコンテキストを選びます。 セットアップは
oxcartDockerコンテキストを作成します。現在のコンテキストがdefaultで、何も応答しない場合にだけ切り替えるため、ほかのアプリから移る場合は通常、自分でdocker context use oxcartを実行します。 - 必要なイメージを移します。 再度pullするか、ほかのアプリの
docker saveをdocker loadへストリームで渡します。タグとダイジェストは維持されます。 - データのあるボリュームを移します。 移行元アプリの小さなコンテナを使って各名前付きボリュームをtarファイルにまとめ、Oxcartの新しいボリュームに展開します。
- Composeプロジェクトを起動します。 各プロジェクトフォルダーで
docker compose up -d --waitを実行します。同じ名前で移したボリュームが使われます。 - 接続先が固定のツールをOxcartに向けます。 Dockerコンテキストに従うツールは自動でOxcartを見つけます。
DOCKER_HOSTだけを読むツールでは、これをoxcartコンテキストのエンドポイントに設定します。
コマンド
コンテキストを確認して切り替える
docker context ls 一覧にoxcartとほかのアプリのコンテキストが表示され、現在のコンテキストにはアスタリスクが付きます。続いて次を実行します。
docker context use oxcart ほかのアプリからイメージをコピーする
中間ファイルを作らずに、イメージを一方のエンジンからもう一方へ直接ストリーム転送します。タグとダイジェストも引き継がれます。
# OTHER is the other app's context name from `docker context ls`
OTHER=<other-context>
docker --context "$OTHER" save postgres:17-alpine myapp:dev | docker --context oxcart load タグ付きイメージをすべて一度に移すには:
docker --context "$OTHER" images --format '{{.Repository}}:{{.Tag}}' | grep -v '<none>' \
| xargs docker --context "$OTHER" save | docker --context oxcart load Dockerfileからビルドしたイメージは、Oxcartでdocker buildやdocker compose buildを使って再ビルドするほうが速いことも多くあります。ベンチマークでは、キャッシュを使った再ビルドは121 msでした。
名前付きボリュームを移す
この例では、pgdataというPostgresボリュームを移します。tarファイルはホームフォルダー内のフォルダーに書き出します。Oxcartは既定でホームフォルダーをコンテナと共有しており、移行元アプリでもそのフォルダーをバインドマウントできる必要があります。コピーの整合性を保つため、先にそのボリュームを使用するコンテナを停止してください。
mkdir -p ~/volume-move && cd ~/volume-move
# 1. Pack the volume in the other app
docker --context "$OTHER" run --rm -v pgdata:/from -v "$PWD":/backup alpine \
tar -C /from -czf /backup/pgdata.tgz .
# 2. Unpack it into a new volume in Oxcart
docker --context oxcart volume create pgdata
docker --context oxcart run --rm -v pgdata:/to -v "$PWD":/backup alpine \
tar -C /to -xzf /backup/pgdata.tgz Composeはボリュームに<project>_<volume>という名前を付けます。同じ完全名でOxcartにボリュームを作れば(移行元のコンテキストでdocker volume lsを確認)、Composeがそのボリュームを使います。
Composeプロジェクトを起動する
cd ~/code/myproject
docker compose up -d --wait ヘルスチェックによる依存関係、up --wait、サービス名DNS、init: true、network_mode: service:はこれまでどおり使えます。AppleシリコンでDocker Composeを使うをご覧ください。
DOCKER_HOSTを読むツール
Oxcartは/var/run/docker.sockを作成・置換しません。docker CLI、Compose、Buildx、ほとんどのSDKは現在のコンテキストに従います。DOCKER_HOSTだけを読むツールでは、次のようにOxcartを指定します。
export DOCKER_HOST="$(docker context inspect oxcart --format '{{.Endpoints.docker.Host}}')" コンテナ内では、Testcontainers、docker-outside-of-docker、Portainer、Traefik用の/var/run/docker.sockマウントを通常どおり利用できます。MacでDev ContainersとTestcontainersを使うをご覧ください。
元に戻す
docker context use <other-context> # back to the other app
docker context use oxcart # and to Oxcart again 移行後に変わること
| 操作 | Oxcart 0.1.2 | OrbStack 2.2.3 | Docker Desktop 4.94.0 |
|---|---|---|---|
docker run --rm … true | 42.3 ms | 220 ms | 143 ms |
docker stop | 19.2 ms | 107 ms | 128 ms |
| 20個のコンテナを停止・削除 | 76.7 ms | 1,224 ms | 683 ms |
| キャッシュを使ったビルド | 121 ms | 283 ms | 149 ms |
Oxcart 0.1.2は2026-10-10に同梱のdocker 29.9クライアントで測定しました。OrbStack 2.2.3とDocker Desktop 4.94.0は同日のそれ以前に、同じMacと測定ハーネスを使い、docker 29.4で測定しました。全データはDocker Desktopとの比較とOrbStackとの比較をご覧ください。
さらに、コーディングエージェント向けのローカルMCPサーバー(1回の貼り付けで設定)、リポジトリとブランチごとにまとまったポート、VPN・DNS・ファイアウォールのルールに従うコンテナ通信も利用できます(ネットワークガイド)。
よくある質問
先にDocker DesktopやOrbStackをアンインストールする必要はありますか?
いいえ。Oxcartは独自のoxcart Dockerコンテキストを持ち、ほかのアプリと共存できます。docker context useで切り替えます。必要なものの移行が終わるまで、移行元アプリを残しておいてください。
Oxcartは現在のDockerコンテキストを変更しますか?
現在のコンテキストがdefaultで、何も応答しない場合のみ変更します。ほかのアプリのコンテキストが選択されていれば変更せず、自分でdocker context use oxcartを使って選びます。
イメージとボリュームは自動で移りますか?
いいえ。各アプリは独自のイメージとボリュームを保持します。イメージは再度pullするか、docker save | docker loadでストリーム転送します。データの入った名前付きボリュームは、上記のとおりtarファイルで移します。キャッシュなど使い捨てのデータが入ったボリュームは、作り直すだけで構いません。
レジストリのログイン情報はどうなりますか?
pull時に認証情報を求められたら、docker loginを1回実行します。Oxcartはdocker-credential-osxkeychainを通じてパスワードをmacOSキーチェーンに保存し、config.jsonにはレジストリ名だけを残します。
今の開発ワークフローを維持できますか?
はい。docker CLI、Compose、Buildx、Dev Containers、Testcontainersを引き続き使えます。OxcartはComposeのprivileged: trueを含め、特権コンテナをサポートしています。まず1つのプロジェクトを移し、ポートとデータを確認してから、準備ができた時点で残りを切り替えてください。移行中も、ほかのDockerコンテキストは利用できます。
更新してもコンテナは残りますか?
はい。Oxcartの更新では、すべてのコンテナ、イメージ、ボリューム、ネットワークを維持します。
元に戻すには?
ほかのアプリのコンテキスト名を指定してdocker context useを実行します。Oxcartをアンインストールすると、Uninstallは置き換えたdockerツールをすべて元に戻します。
出典と測定方法
- セットアップ、コマンドラインツール、Dockerコンテキスト:出荷版Oxcart 0.1.3に基づきます。
- 互換性:2026-10-10にOxcartでテスト(タグとダイジェストを保ったsave/load、Compose、コンテナ内Dockerソケット)。
- ベンチマーク:Oxcart 0.1.2、OrbStack 2.2.3、Docker Desktop 4.94.0を2026-10-10に1台のApple M5 Maxで測定。各8 CPU・12 GB、製品を1つずつ実行、5回測定の中央値。
- ほかのアプリのコンテキスト名はアプリやバージョンによって異なります。
docker context lsで確認してください。