Macのコンテナネットワークの仕組み
macOSはLinuxコンテナを直接実行できないため、MacのコンテナアプリはどれもLinux環境でコンテナを動かし、Macとの間で通信を中継します。重要なのは次の3つの経路です。
- 内向き通信:Macで公開したポートからコンテナへ転送します。
- 外向き通信:コンテナからインターネット、社内ネットワーク、Mac上のサービスに接続します。
- 名前解決:コンテナがホスト名を検索します。
これらの経路がMac自身のネットワークを迂回すると、VPNルートが適用されず、社内ホスト名が解決できず、ファイアウォールも通信元のアプリを把握できません。Oxcartはそうならないように設計されています。
外向き通信:VPN、DNS、ファイアウォールをそのまま適用
Oxcartはコンテナとビルドステップから出るIPv4、IPv6のTCP通信をMacに転送し、Mac自身のソケットで接続を開きます。経路はVPNクライアントが追加したルートも含め、Macのルーティングテーブルで決まります。OxcartはMacのルート、VPN設定、ファイアウォール設定を変更しません。
アドレス検索(AとAAAA)は/etc/hostsやVPNが設定するリゾルバー選択を含むmacOSのシステムリゾルバーを使うため、社内ホスト名はブラウザと同じようにコンテナ内でも解決されます。コンテナ名はそれぞれのDockerネットワーク内に限定され、DNSはUDPとTCPの両方で動作します。
Little Snitch、LuLu、エンドポイントエージェント
ネットワークフィルターは確認を求める間、新しいプログラムの最初の接続を2秒ほど保留することがあります。Oxcartは待ちません。主リンクが確認できるまでは代替経路を使い、遅い接続や失敗した接続は自動的に切り替えます。3回連続で失敗するとリンクを30秒間停止してから再確認します。フィルターでOxcartを一度許可すれば、以後はそのルールが適用されます。
内向き通信:公開ポート
通常のDocker構文でポートを公開します。
# Mac loopback only (recommended for development)
docker run -d -p 127.0.0.1:8080:80 nginx
# Ephemeral host port, UDP
docker run -d -p 127.0.0.1::9000/udp my-udp-service
# IPv4 and IPv6 listeners on the Mac
docker run -d -p "[::]:8080:80" nginx アドレスを指定しないバインドはMacのすべてのIPv4アドレスで待ち受けるため、macOSのファイアウォールで遮断されない限り、同じネットワークのほかのマシンからアクセスできます。TCPとUDPは同じホストポート番号を使えます。公開したリスナーはコンテナの停止時に解放されます。
公開ポートはエンジン自身のlocalhostでも応答するため、コンテナ内で動かすレジストリにイメージをプッシュできます。
docker run -d -p 127.0.0.1:5000:5000 --name registry registry:2
docker tag my-app localhost:5000/my-app
docker push localhost:5000/my-app Portsビュー:ポートが応答しない理由
OxcartのPortsビューにはMac上のすべてのリスナーとコンテナポートがリポジトリ、ワークツリー、ブランチ別に表示されるため、同じプロジェクトの2つのチェックアウトを混同しません。各バインドは準備完了、待機中、エラーのいずれかで、理由も示されます。
- Mac上ですでにそのアドレスが使われている。
- コンテナ内のサーバーが
127.0.0.1だけで待ち受けている。 - そのポートではまだ何も待ち受けていない。
ほかのマシンからアクセスできるポートにはマークが付きます。コーディングエージェントもOxcartのMCP portsツールを通じて同じ情報を確認できます。AIコーディングエージェントのためのDockerをご覧ください。
コンテナからMacにアクセス
host.docker.internalはコンテナ内でもビルドステップでも名前解決でき、Macの127.0.0.1にバインドされたサービスにTCPで接続できます。Macでネイティブに動くデータベースや開発サーバーをコンテナから利用できます。
docker run --rm curlimages/curl http://host.docker.internal:3000/health これは意図的に開いたアクセス経路として扱ってください。実行するどのコンテナも、この方法でMacのループバック上のサービスに接続できます。信頼できないコンテナを動かす間は、認証のない管理サービスを127.0.0.1に置かないでください。
Macとエンジン間の暗号化リンク
MacとLinux間の通信は、macOSが同じMac上のほかの仮想化ソフトウェアと共有する仮想ネットワークを通ります。Oxcartはこのリンク上の公開ポートと外向きのTCP通信をTLS 1.3(TLS_AES_128_GCM_SHA256)で包み、エンジン起動ごとに生成する証明書にピン留めし、起動ごとの256ビットbearerトークンを使います。無効なトークンでは接続を閉じ、Macのアドレス以外からの接続はTLS開始前にLinux側で閉じます。
これが防ぐのは、共有ネットワーク上のほかのソフトウェアがアドレスを偽装して通信を読んだり挿入したり、コンテナに新しい接続を開いたりする脅威です。ゲスト側のファイアウォールも、未公開のコンテナポートや内部リゾルバーへのアクセスを防ぎます。このリンクの暗号化にはコストがあり、私たちはそれを選びました。Docker API自体はネットワークを通らず、専用のUnixソケットを使います。ポートを公開していなければ、OxcartはMac上にTCPやUDPのソケットを保持しません。
現在の制限
- ホストネットワークモード(
--network host)とIPv6のコンテナネットワークは未実装です。コンテナはIPv4アドレスを使います。 host.docker.internalはTCPを扱います。ホストゲートウェイへのUDPは未実装です。- 公開したTCPとUDPではクライアントのアドレスを保持しません。コンテナからはLinux側が接続相手に見えます。
- アドレス以外のDNSレコード(SRVやTXTなど)は、macOSのスプリットDNSではなく、ネットワークのDHCPリゾルバーを使います。
トラブルシューティング
| 症状 | 考えられる原因 | 対処 |
|---|---|---|
localhost:PORTへの接続が拒否される | コンテナ内のサーバーが127.0.0.1で待ち受けている | 0.0.0.0で待ち受ける。Portsビューにこの原因が表示される |
| "port is already allocated" | 別のプロセスやコンテナがホストポートを使用中 | 別のホストポートを選ぶ。Portsビューで使用元を確認できる |
| コンテナ内で社内ホスト名が解決できない | 名前がVPNのDNSにしか存在しない | MacでVPNに接続する。アドレス検索はMacのリゾルバーに従う |
| コンテナからMacの開発サーバーに接続できない | コンテナ内でlocalhostを使っている | host.docker.internalを使う |
| 最初のpullが数秒止まる | ネットワークフィルターが新しい接続の確認を求めている | Oxcartを一度許可する。それまでは代替経路で接続する |
| チームメンバーから開発用ポートにアクセスできる | アドレスを指定せずに公開している | 127.0.0.1に公開する |
よくある質問
MacのDockerコンテナはVPNを使いますか?
Oxcartでは使います。コンテナの外向き接続はMac自体が開くため、Macのルート、VPN、アドレス検索用のスプリットDNS、アプリ単位のファイアウォールが適用されます。OxcartはMacのルート、VPN設定、ファイアウォール設定を変更しません。
コンテナからMac上のサービスにアクセスするには?
host.docker.internalを使います。Oxcartではコンテナ内とビルドステップから、Macの127.0.0.1にバインドされたサービスにTCPで接続できます。--add-host mac:host-gatewayを使えば、同じアドレスに別の名前を付けられます。
コンテナは動いているのにポートに接続できないのはなぜですか?
多くはコンテナ内のサーバーが、公開ポートから届かない127.0.0.1で待ち受けていることが原因です。0.0.0.0で待ち受けるようにしてください。ほかにはホストポートが使用中、またはまだ何も待ち受けていない場合があります。OxcartのPortsビューで原因を確認できます。
OxcartはLittle SnitchやLuLuと併用できますか?
はい。ネットワークフィルターが確認のためにOxcartの最初の接続を保留しても、リンクが確認できるまでは代替経路を使うので、動作が止まったり回答を待ったりしません。遅い接続や失敗した接続は自動的に代替経路へ切り替わります。
Mac上のコンテナ通信は暗号化されますか?
MacとOxcartのエンジン間の公開ポートおよび外向きTCP通信はTLS 1.3で運ばれ、エンジン起動ごとに生成する証明書にピン留めされ、起動ごとの256ビットトークンを使います。Macの共有ネットワーク上にあるほかの仮想化ソフトウェアから、このリンクを守ります。インターネットへの通信はHTTPSなど、アプリ自体が使う仕組みで保護されます。
公開ポートは同じネットワークのほかのマシンから見えますか?
アドレスを指定せずに公開したポートはMacのすべてのIPv4アドレスで待ち受けるため、macOSのファイアウォールで遮断されなければ、ほかのマシンから接続できます。Mac内に限定するには127.0.0.1に公開してください。Oxcartはほかのマシンからアクセスできるポートにマークを付けます。
OxcartはコンテナのホストネットワークやIPv6に対応していますか?
いいえ。ホストネットワークモードとIPv6のコンテナネットワークは未実装です。コンテナはIPv4アドレスを使いますが、"[::]:8080:80"でIPv6上にポートを公開することはできます。
出典と測定方法
ここで説明したネットワーク動作は2026年10月10日にOxcartで確認しました。外向きTCP、DNS、公開ポート、ホストへのアクセス、Macとコンテナ間のTLSを含みます。