docker コンテナからホストのポートにアクセスするには?

ショコラ
ショコラ

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>

以上

Scroll to Top