質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

334閲覧

NuxtをDocker起動したときのIPアドレス0.0.0.0とは?

mar1293787543

総合スコア2

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

1グッド

0クリップ

投稿2024/11/05 12:38

NuxtをDocker起動したときの「0.0.0.0:[ポート番号]」「172.18.0.2[ポート番号]」の意味が分かりません。

フロント環境構築の学習のためNuxt3をDocker起動してみました。
無事に起動出来たのですが、コンソールに出力される「0.0.0.0:[ポート番号]」「172.18.0.2[ポート番号]」の意味が分かりません。
localhostでは普通にアクセス出来ますが、0.0.0.0も172.18.0.2もアクセスしても開けません。この二つのIPアドレスは何を表しているんでしょうか?0.0.0.0はcompose.yamlのenvironmentで設定したIPアドレスだとは思うのですが、実際にはlocalhostで起動しているのになぜこれが出力されるのか良く分かりません。

compose.yaml

1services: 2 nuxt: 3 container_name: nuxt 4 build: docker/nuxt 5 volumes: 6 - ./TestProduct:/app:cached 7 - nuxt_node_modules:/app/node_modules 8 ports: 9 - "80:3000" 10 - "24678:24678" 11 tty: true 12 environment: 13 - HOST=0.0.0.0 14 - port=80 15 - CHOKIDAR_USEPOLLING=true 16volumes: 17 nuxt_node_modules:

Dockerfile

1FROM node:18-slim 2 3ENV TZ Asia/Tokyo 4 5WORKDIR /app 6 7RUN apt-get update \ 8 && apt-get install -y \ 9 git \ 10 vim 11

イメージ説明

quickquip👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まずDockerのことは忘れて、物理的なコンピュータのことを考えてください。
1つのコンピュータに複数のNICが存在する、ということがありえます。Wi-Fi と有線LANとか普通にありますね。

ファイアウォールとかルータを考えてください。
複数のNICが、それぞれ別のネットワークに接続されていて別のIPアドレスを持っている、ということがありえます。
あるLAN端子にはインターネットのグローバルIPアドレスが振られてていて、別のLAN端子にはローカルIPアドレスが振られている、という状況はファイアウォールとかルータでは普通です。

グローバル側(インターネット側)のIPアドレスが203.0.113.1で、ローカル側のIPアドレスが198.51.100.1だとしましょう。

203.0.113.1:80 でリッスンしている」時、グローバル側のIPアドレスでだけ待っているという意味になります。ローカル側で接続している別のマシンから198.51.100.1:80にアクセスしても繋がりません。
198.51.100.1:3000 でリッスンしている」時、ローカル側のIPアドレスでだけ待っているという意味になります。インターネットから203.0.113.1:3000にアクセスしても繋がりません。

で、「0.0.0.0:80 でリッスンしている」時、すべてのNICで待っているという意味になります。グローバル側から1203.0.113.1:80にアクセスしても、ローカル側から198.51.100.1:80にアクセスしても繋がるということになります。


127.0.0.1のようなループバックアドレスも、ただの 仮想的なNICに振られている仮想の別IPアドレス でしかないです。

「あなたのマシン(のホストOS)で0.0.0.0:80 でリッスンしている」なら、そのマシンが属するLAN内のほかのマシンから(ファイアウォールやルータで遮られない限り)IPアドレス:80で繋がりますし、そのマシンから自分自身に127.0.0.1:80でも繋がります

これがリッスンポートの0.0.0.0の意味です。

(ブラウザから0.0.0.0で自分自身に繋がるのは"ブラウザが気を利かせている"から、というだけの話です。RFCでは、クライアントから0.0.0.0に接続しようとするのは無効、とされています)


ここまで納得できたならDockerの話に入れます。
Docker内のコンテナで動いているプログラムから見ると「自分が動いているマシン」は、Dockerによって作られた仮想のマシンであってホストOSではないです。
その仮想のマシンが接続している仮想のネットワーク上で、仮想のNICに振られている仮想のIPが、質問で言う172.18.0.2です。

でもホストOS側には172.18.0.0/12というセグメントに属しているNICは存在しませんね。(めちゃくちゃDockerの仮想ネットワーク設定を頑張れば作れないこともない? かもしれませんが普通はないはず)
その仮想のネットワークへルーティングしてくれるルータもありません。
だからホストOS側から172.18.0.2に接続しても繋がりません。

ports: - "80:3000"

と書くと、DockerがホストOSで80番ポートをリッスンします。そこにきたリクエストはDockerコンテナの3000番に転送されます。IPが指定されてないなら、ホストOS側のリッスンは0.0.0.0行われます
だからホストOSで、http://localhost/に接続するとコンテナで動かしているプログラムに繋がったかのように振る舞います。

投稿2024/11/06 08:46

quickquip

総合スコア11213

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mar1293787543

2024/11/15 08:33

ありがとうございます。まだまだ理解が浅いですが、なんの数字かは理解出来ました。
guest

0

0.0.0.0:[ポート番号]

これは、「任意のIPv4アドレスからの接続をリッスンしている」という意味です。localhostでリッスンした場合には、localhostの接続からしか受け付けられません。

172.18.0.2[ポート番号]

172.16.0.0/12はプライベートアドレスですので、Dockerの内側でのみ通信可能なIPアドレスです。

投稿2024/11/05 13:09

maisumakun

総合スコア145939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mar1293787543

2024/11/06 06:57

ご回答ありがとうございます。 「任意のIPv4アドレスからの接続をリッスンしている」というのは理解出来ましたが、そうするとポート番号はなんの意味を持つのかが分かりませんでした。 また、172.18.0.2[ポート番号]はなんのためになんのアプリケーションが起動しているのでしょうか?
maisumakun

2024/11/06 07:51 編集

> 「任意のIPv4アドレスからの接続をリッスンしている」というのは理解出来ましたが、そうするとポート番号はなんの意味を持つのかが分かりませんでした。 リッスンしているポート番号です。IPアドレスとポート番号はそれぞれ別個に指定できるものである以上、こちらとしては「そうすると」のつながりがわからない状況です。 > 172.18.0.2[ポート番号]はなんのためになんのアプリケーションが起動しているのでしょうか? 同じサーバから送信する際の発信元となるアドレスです。Docker外と通信する場合にはNATで変換されます。
mar1293787543

2024/11/06 09:10

ありがとうございます。つまり、 たとえば11.123.123.123:3000と表示される場合、11.123.123.123からしかアプリケーションにアクセス出来ないということでよろしいでしょうか? また、ターミナルなどからアプリケーションを直接起動した場合はhttp:localhost:3000のように起動している環境が表示されるのに、なぜdockerで起動した場合はこのような表示になるんでしょうか?
mar1293787543

2024/11/06 09:18

すみません。なぜDocker起動した場合はこのような表記になるのかは別の回答で答えを頂きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問