Socktainer で Apple container を docker コマンドから使う
この記事でやること
Apple 純正のコンテナCLI container を、docker / docker compose コマンドからそのまま叩けるようにする socktainer を、最新版で一気にセットアップして動かす最短手順です。
socktainer は「Apple container をバックエンドに、Docker 互換の REST API を Unix ソケットで生やす CLI/daemon」。これを起動して DOCKER_HOST を向けるだけで、普段の docker / docker compose がそのまま Apple container を操作できます。
- ✅
docker run/docker compose(localhostポート公開・サービス間DNS) - ✅ 対話
docker exec -it/docker run -it(TTY サイズも伝播) - ✅
docker build(DOCKER_BUILDKIT=0のレガシービルダー)
検証環境
| 項目 | 値 |
|---|---|
| Mac | Apple Silicon |
| macOS | 26.5 |
Apple container
|
1.0.0 |
| socktainer |
main 最新を brew install socktainer --HEAD でビルド(検証時は HEAD-93de854。ビルドに Xcode 26 が必要) |
| docker CLI | 29.4.0(クライアント。数字は環境で変わる) |
| docker compose | v5.1.2(docker compose プラグイン) |
1. インストール
socktainer 本体(--HEAD で main をビルド)
brew install socktainer --HEAD
-
--HEADはmainをソースからビルドします(Xcode 26 が必要・数分かかります。実測で約8分半)。 - 依存として Apple
containerも一緒に入ります(以前のように.pkgを別途入れる必要はありません)。
ビルド後、入ったか確認します(brew installは通常そのままlinkまでやります。socktainerが見つからなければbrew link socktainer)。
socktainer --version
# 例: socktainer: HEAD-93de854 (git commit: unspecified)
docker コマンド(クライアント)
socktainer が提供するのはデーモン / API 側だけで、docker コマンドは別途必要です。OrbStack や Docker Desktop があればその docker CLI がそのまま使えます。socktainer 単体で使うなら Homebrew の CLI クライアントを入れます(Docker Desktop アプリ=cask ではなく、CLI だけの formula)。
brew install docker docker-compose docker-buildx
プラグイン(docker compose / docker buildx)を認識させるため、~/.docker/config.json に次を設定します(無ければ新規作成、あれば既存 JSON にこのキーを足す)。
{ "cliPluginsExtraDirs": ["/opt/homebrew/lib/docker/cli-plugins"] }
導入確認(プラグインが見えれば成功。なおデーモン未起動の docker version が「Cannot connect to the Docker daemon」になるのは正常で、次章で繋がります):
docker --version # 例: Docker version 29.4.0, build 9d7ad9f
docker compose version # 例: Docker Compose version v5.1.2
2. デーモンを起動して DOCKER_HOST を向ける
# 常駐サービスとして起動(ログイン時にも復帰)
brew services start socktainer
# 手動なら: HOME="/opt/homebrew/var/run/socktainer" /opt/homebrew/opt/socktainer/bin/socktainer
# (~/.zshrc 等に追記する)
export DOCKER_HOST="unix:///opt/homebrew/var/run/socktainer/.socktainer/container.sock"
起動ログに DNS server listening on port 2054 が出れば、サービス間DNS が使える最新版が立っています。
✅ Apple Container compatibility check passed
[ NOTICE ] DNS server listening on port 2054
[ NOTICE ] Server started on http+unix: /opt/homebrew/var/run/socktainer/.socktainer/container.sock
疎通確認(Server: socktainer と出ればOK):
docker version
# Server: socktainer
# API version: 1.51 (downgraded from 1.54)
3. 動かす
単発 run + localhost ポート公開
docker rm -f web 2>/dev/null
docker run -d --name web -p 8087:80 nginx:alpine
curl -s -o /dev/null -w "localhost:8087 HTTP %{http_code}\n" http://localhost:8087/
# → localhost:8087 HTTP 200 ✅
docker rm -f web 2>/dev/null
-p がそのまま localhost に通ります。
docker compose(サービス名で相互通信)
作業用ディレクトリを作り、その中に compose.yaml を置いて、同じディレクトリで実行します。
name: sock-compose
services:
web:
image: nginx:alpine
ports: ["8082:80"]
redis:
image: redis:alpine
docker compose up -d
docker compose ps # web / redis が Up になるのを確認
# compose 生成コンテナの中からサービス名で疎通確認(自動で socktainer DNS を向く)
docker exec sock-compose-redis-1 sh -c \
'nslookup web; wget -qS -O /dev/null http://web/ 2>&1 | grep "HTTP/"'
Name: web
Address: 192.168.65.3
HTTP/1.1 200 OK
localhost:8082(compose の publish)も curl で HTTP 200 が返ります。
対話 exec / run(TTY サイズも伝播)
docker exec -it <ctr> sh # 対話シェルが開く(tty=/dev/pts/0)
docker run --rm -it alpine sh # 同上
シェル内で stty size が正しいサイズ(例 40 120)を返すので、vim / htop / less などの全画面 TUI も崩れません。
PR #244
docker build
# 既定の buildx は失敗するので、レガシービルダーで
DOCKER_BUILDKIT=0 docker build -t myimg .
# compose の build: も同様
DOCKER_BUILDKIT=0 COMPOSE_DOCKER_CLI_BUILD=0 docker compose build
4. 注意点(実測した落とし穴)
まとめ
brew install socktainer --HEAD で main を入れれば、docker / docker compose・localhost ポート・サービス間DNS・対話 exec(TTY サイズ込み)・DOCKER_BUILDKIT=0 でのビルドまで、Apple container 上でひと通り動きます。machine もカーネル差し替えも不要の最短ルートです。
-
これらの修正が安定版リリースに入れば、将来は
brew install socktainerだけで同じことができます(--HEADのビルドも不要に)。 -
本物の dockerd で 100% の compose 互換が欲しいなら、machine の中に dockerd を入れる方式もあります → Apple container で docker compose を動かす。
🔗https://github.com/socktainer/socktainer
Discussion