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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Docker

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

Q&A

解決済

1回答

1207閲覧

コンテナを起動させ、ブラウザでアクセスする際に指定するポート番号について

study_111

総合スコア82

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Docker

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

1グッド

0クリップ

投稿2020/05/03 06:26

編集2020/05/03 06:29

DockerによるNginxの起動を行なったのですが、ポート指定の部分で分からない部分があります。参考にした記事はこちらのQiita記事になります。
docker run --name hogehoge -d -p 8080:80 nginxこちらのコマンドを打ち込み
http://localhost:8080」とすると、Nginxのデフォルトの起動画面が表示されます。
こちらの「8080」番ポートですが、接続先のポート番号と理解しています。
その場合、接続先=コンテナ側のポート番号となり、80番ポートを指定しなくてはならないのではないでしょうか?
何故、ホスト側(ローカルPC)のポート番号を指定するのかが分からなかった為、質問させて貰いました。
どなたか、ご助言頂けましたら幸いです。
よろしくお願いします。

mit0223👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

こちらの「8080」番ポートですが、接続先のポート番号と理解しています。

その場合、接続先=コンテナ側のポート番号となり、80番ポートを指定しなくてはならないのではないでしょうか?

docker のコンテナは docker0 という仮想ネットワークに接続されていて、ホストとは通信できますが、外部とは通信できません。docker デーモンはホストが受信したパケットを Destination NAT (和訳すると宛先アドレス変換)という技術を使用して、IPパケットの宛先アドレスを書き換えてから、 docker0 に転送しています。
(コンテナの状況によってdoker0 という名前でない場合もありますが、詳細省略)

Linux のホストをご利用であれば、ホストで iptables コマンドを叩くことで Destination NAT の様子を見ることができます。

$ sudo iptables -L -v -n -t nat Chain PREROUTING (policy ACCEPT 3799K packets, 289M bytes) pkts bytes target prot opt in out source destination 25M 1813M DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL (省略) Chain DOCKER (1 references) pkts bytes target prot opt in out source destination 100 100 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.21.34.9:80
  • -t nat というオプションでNAT用のテーブルを表示します
  • PREROUTING というチェインで Destination NAT を処理します(上記では DOCKER というチェインに転送しています)
  • 転送を受けた DOCKER チェインで自分宛てのパケットのうち宛先ポート番号が8080 の場合は 172.21.34.9:80 に付け替えるという設定が行われているのがわかります

つまり、 localhost:8080 は 172.21.34.9:80 (アドレスは環境により異なります)に転送されるわけです。172.21.34.9が docker0 上のコンテナのIPアドレスであり、その中で80番ポートで待ち受けている nginx が処理するということです。

結構、話が長いのでかなり省略した形になってしまいました。不明点があれば、コメントでご質問ください。

投稿2020/05/03 06:45

mit0223

総合スコア3401

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

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

study_111

2020/05/03 07:10 編集

ご丁寧に回答頂きまして、ありがとうございます。 >docker デーモンはホストが受信したパケットを Destination NAT (和訳すると宛先アドレス変換)という技術を使用して、IPパケットの宛先アドレスを書き換えてから、 docker0 に転送しています。 こちらの部分についてなのですが「docker デーモンはホストが受信した」の「ホスト」は「コンテナ」との理解であっておりますでしょうか? また、そうであった場合、直接「localhost:80」として80番ポートを指定するのではなく、「docker run --name hogehoge -d -p 8080:80 nginx」こちらで設定した、ホスト側のポートの「8080」が「localhost:8080」のように指定され、アクセスがあった場合、Destination NAT により、仮想ネットワーク(docker0)のipアドレス(今回ご回答頂いた内容ですと、「172.21.34.9:80」)へ変換されるように、紐づけられているということでしょうか? 度々のご質問で申し訳ないのですが、ご返信頂けましたら幸いです。
study_111

2020/05/03 07:15 編集

すみません。↑のご質問が分かりにくいかもしれないのですが、自分としましては、通常、「http://localhost:接続先ポート番号」と指定されますが、docer0などの仕組みにより、ホスト側(localのPC)のポート番号を指定するといった言わば例外的な事象が発生しているのではないかと思っている次第でございます。
study_111

2020/05/03 07:22

あ、ですが、「ホスト」といった単語のみで考えますと、「localhost」は自分のPCを指しますし、ホストの中にコンテナがあると考えると、「8080」番を指定するのは、当たり前のことな気がして参りました... Dockerなどではなく、他の方法で仮想環境を立ち上げた場合も、「localhost:8080」として接続を行いますし、仮想環境のポートを指定して、アクセスは行わないですよね...
mit0223

2020/05/03 07:33

私の回答で「ホスト」という言葉はコンテナを収容している外側のコンピュータという意味で使用しております。 クライアント→(8080)ホスト→(80)コンテナ という構造なのですが。
study_111

2020/05/03 07:59

自分自身勘違いしてしまっている部分がありました。 確かに「ホスト」は「コンテナを収容している外側のコンピュータ」かと思いますが、ローカル上でコンテナを起動していた為、ローカルPCがホスト?と勘違いを起こしてしまっていました。 
study_111

2020/05/03 08:00

そう考えますと、localhostの次に「8080」を指定するのは特段おかしくはないですよね...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問