
docker コンテナからホストのポートにアクセスするには?
ようするに、ドッカーコンテナを2つ立ち上げて、ドッカーコンテナAからドッカーコンテナBのポートにアクセスするには設定が必要です。
①リバースプロキシの nginx のコンテナを docker-compose で起動する。
②それとは別に apache のコンテナを docker-compose で起動する。
コンテナからホストにアクセスするには、ドッカーコンポーズのファイルに「host.docker.internal:host-gateway」を書くことは分かった。
nginxコンテナ から apacheコンテナ へは ping が届くことも確認した。
しかし、nginx から apache のポートにアクセスすると
「curl: (7) Failed to connect to 192.168.1.135 port 6080 after 0 ms: Couldn’t connect to server」
というエラーになった。
次に、nginxコンテナ から apacheコンテナ に nmap を実行して空いているポートがあるかを確認した。
apt install nmap
nmap apache
そうすると ssh だけがアクセスできることが分かった。
ssh にアクセスできるということは、iptables のルールの問題だと分かった。
chatgpt を使いポートの開け方を調べた。
「ufw allow 6080/tcp」ここにたどり着いた。
この対応、うっかり忘れそうですが重要ですね。ハマるポイントですね。

docker-compose.yml には、こちらを定義しておく。
extra_hosts:
- "host.docker.internal:host-gateway"
リバースプロキシには以下のように、ホストの6080番にアクセスするようにするが、エラーになる。
location / {
proxy_pass http://host.docker.internal:6080;
}
ホストの6080番のポートを開ける。
ufw allow 6080/tcp
別のパターンとして、ホストでPHPアパッチを起動して、別コンテナからPHPアパッチにアクセスすることも可能
PHPアパッチを起動
docker run --rm --name=php -p 80:80 php:apache
別コンテナからホストの80を使ってPHPアパッチにアクセスできないので、ポート80を開けます。
# curl http://host.docker.internal
curl: (7) Failed to connect to host.docker.internal port 80: 接続を拒否されました
# ufw allow 80/tcp
Rule added
Rule added (v6)
PHPアパッチにアクセスできました。
# curl http://host.docker.internal
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<hr>
<address>Apache/2.4.62 (Debian) Server at host.docker.internal Port 80</address>
</body></html>
以上