---
slug: "docker-chromium-cdp-port"
title: "Docker コンテナ内 Chromium のリモートデバッグポートを外部公開する方法"
description: "Dockerコンテナ内のChromiumでリモートデバッグ(9222)が外部公開できない原因（M113以降で0.0.0.0が127.0.0.1へ強制）と、socatで9222→127.0.0.1:9223へ安全にフォワードしてCDP接続する手順を解説。"
url: "https://www.ytyng.com/blog/docker-chromium-cdp-port"
publish_date: "2026-01-09T03:03:09.654Z"
created: "2026-01-09T03:03:09.656Z"
updated: "2026-04-20T01:19:15.742Z"
categories: []
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20260109/90fe37f992144866ac56a10176dd933d.png.webp?width=768"
has_video: true
has_music: true
video_urls: ["https://media.ytyng.net/ytyng-blog/329/featured-video-1.mp4", "https://media.ytyng.net/ytyng-blog/329/featured-video-2.mp4", "https://media.ytyng.net/ytyng-blog/329/featured-video-3.mp4"]
music_urls: ["https://media.ytyng.net/ytyng-blog/329/featured-music-329-1.mp3", "https://media.ytyng.net/ytyng-blog/329/featured-music-329-2.mp3"]
lang: "ja"
---

# Docker コンテナ内 Chromium のリモートデバッグポートを外部公開する方法

Docker コンテナ内で動作する Chromium ブラウザのリモートデバッグポート (9222) を、ホストマシンや他のコンテナから接続可能にする方法を解説します。

## 背景

Selenium Grid や Playwright などを使った E2E テスト環境では、Docker コンテナ内でブラウザを動かすことが一般的です。デバッグや自動化のために Chrome DevTools Protocol (CDP) を使用する場合、リモートデバッグポートへの外部接続が必要になります。

通常、Chromium に `--remote-debugging-port=9222` と `--remote-debugging-address=0.0.0.0` を指定すれば外部からアクセスできるはずですが、最近のバージョンではこれが機能しません。

## 問題

Chromium を以下のオプションで起動しても、外部から接続できません。

```bash
chromium \
    --remote-debugging-port=9222 \
    --remote-debugging-address=0.0.0.0 \
    --no-sandbox \
    about:blank
```

コンテナ内で確認すると、`0.0.0.0:9222` ではなく `127.0.0.1:9222` でリッスンしています。

```bash
$ netstat -tlnp | grep 9222
tcp  0  0  127.0.0.1:9222  0.0.0.0:*  LISTEN  11/chromium
```

## 原因

**Chromium M113/M114 以降、セキュリティ上の理由から `--remote-debugging-address=0.0.0.0` は内部的に `127.0.0.1` に強制リマップされるようになりました。**

Chromium のソースコードには以下のような処理が含まれています。

```cpp
// headless/lib/headless_browser_main_parts.cc
if (remote_debugging_address.IsIPv4AllZeros()) {
    remote_debugging_address = net::IPAddress::IPv4Localhost();
} else if (remote_debugging_address.IsIPv6AllZeros()) {
    remote_debugging_address = net::IPAddress::IPv6Localhost();
}
```

この変更の理由は、リモートデバッグポートがブラウザを完全に制御できる強力な機能であり、ネットワークに公開することは深刻なセキュリティリスクになるためです。

Chromium の Bug Tracker (Issue 1425667) でも報告されていますが、ステータスは「WontFix」となっており、意図的な仕様変更として扱われています。

## 解決策

Chromium 公式が推奨するワークアラウンドは以下の3つです。

1. SSH トンネリング
2. リバースプロキシ (nginx, socat 等)
3. VPN

Docker 環境では SSH トンネリングは現実的ではないため、**socat によるポートフォワーディング**が最も簡単な解決策です。

### 実装手順

#### 1. Dockerfile に socat を追加

```dockerfile
FROM debian:trixie-slim

RUN apt-get update && apt-get install -y --no-install-recommends \
    chromium \
    socat \
    # ... その他必要なパッケージ
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
```

#### 2. Chromium のデバッグポートを内部用ポートに変更

Chromium は `127.0.0.1` でしかリッスンしないため、内部用のポート (例: 9223) を使用します。

```bash
# start-chrome.sh
exec /usr/lib/chromium/chromium \
    --remote-debugging-port=9223 \
    --remote-allow-origins=* \
    --no-sandbox \
    --disable-gpu \
    about:blank
```

#### 3. socat でポートフォワーディングを設定

socat を使って `0.0.0.0:9222` から `127.0.0.1:9223` にフォワードします。

supervisord を使用している場合の設定例:

```ini
[program:chromium]
command=/usr/local/bin/start-chrome.sh
autostart=true
autorestart=true

[program:socat-debug]
command=/usr/bin/socat TCP-LISTEN:9222,fork,reuseaddr TCP:127.0.0.1:9223
autostart=true
autorestart=true
```

#### 4. Docker でポートを公開

```bash
docker run -p 9222:9222 your-image
```

### 動作確認

コンテナ起動後、ホストマシンから以下のコマンドで確認できます。

```bash
$ curl -s http://127.0.0.1:9222/json
[ {
   "description": "",
   "devtoolsFrontendUrl": "https://chrome-devtools-frontend.appspot.com/...",
   "id": "...",
   "title": "about:blank",
   "type": "page",
   "url": "about:blank",
   "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/page/..."
} ]
```

JSON が返ってくれば成功です。

## Apple Silicon Mac での注意点

Apple Silicon (M1/M2/M3) Mac で Docker を使用する場合、追加の注意が必要です。

`--platform linux/amd64` を指定して x86_64 イメージをビルドすると、Rosetta 2 でエミュレーションが行われます。しかし、Chromium は SSE3 命令セットを要求するため、Rosetta では正常に動作しません。

```
The hardware on this system lacks support for the sse3 instruction set.
```

ローカル開発時は ARM64 ネイティブでビルドし、本番デプロイ時のみ x86_64 でビルドする運用が必要です。

```bash
# ローカル開発用 (ARM64)
docker build -t my-image .

# 本番デプロイ用 (x86_64)
docker build --platform linux/amd64 -t my-image .
```

## まとめ

- Chromium M113 以降、`--remote-debugging-address=0.0.0.0` はセキュリティ上の理由で無効化されています
- Docker 環境では socat によるポートフォワーディングが現実的な解決策です
- Apple Silicon Mac では ARM64 ネイティブビルドが必要です

この変更は Chromium の意図的なセキュリティ強化であり、将来的に元に戻る可能性は低いと考えられます。
