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 composelocalhost ポート公開・サービス間DNS)
  • ✅ 対話 docker exec -it / docker run -it(TTY サイズも伝播)
  • docker buildDOCKER_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 本体(--HEADmain をビルド)

brew install socktainer --HEAD
  • --HEADmain をソースからビルドします(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 を置いて、同じディレクトリで実行します。

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 --HEADmain を入れれば、docker / docker composelocalhost ポート・サービス間DNS・対話 exec(TTY サイズ込み)・DOCKER_BUILDKIT=0 でのビルドまで、Apple container 上でひと通り動きます。machine もカーネル差し替えも不要の最短ルートです。

Discussion