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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Docker

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

Q&A

解決済

1回答

6964閲覧

dockerのIPマスカレードについて

mint.cherry

総合スコア284

Docker

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

0グッド

0クリップ

投稿2015/11/09 08:36

編集2015/11/09 09:34

dockerのネットワークについては、過去に質問したのでわかりました。
ただ、いまいちdockerのIPマスカレードがわかりません。

コンテナ側IP172.17.0.1
ホスト側IP192.168.1.1

コンテナの172.17.0.1はホスト側から外へ出る場合にホスト側のIP192.168.1.1に変換し出てくれるということなのでしょうか?

また、なにかIPアドレスを確認する方法があれば教えてください。
例えばコンテナから外のPCへpingを飛ばした時に、PCは受け取ったICMPの送信元IPを確認したいです。
192.168.1.1になっているか、172.17.0.1になっているか調べたいです。

よろしくお願いしますm(__)m

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

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

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

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

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

guest

回答1

0

ベストアンサー

NATIPマスカレード がどのような技術で なぜ必要か? が分かれば疑問も解決するはずなので、まずは下記ページを参考に基礎的な部分の復習をする事をオススメします。

[ネットワークアドレスとホストアドレス](http://www.itbook.info/study/p54.html) [NAT,IPマスカレード完全攻略](http://itpro.nikkeibp.co.jp/members/NNW/NETPOINT/20040921/1/)

今の場合、ホスト側(PC側)とゲスト側(Dockerコンテナ上のサーバー)は異なるネットワークなので、直接接続する事は出来ませんし、ホスト側からコンテナ内部の「172.17.0.1」というアドレスは見えません

それでも通信が出来るのは、NATやIPマスカレードのような「アドレス変換技術」があるお陰です。アドレスが変換されている訳ですから、ホスト側から見ればコンテナ内部のサーバーは「192.168.1.1」としか見えない、というよりも「192.168.1.1」という同一ネットワーク内のアドレスを割り当てる(いわば別名を与える)事で、他のネットワークにあるサーバーと通信出来るようにしている訳です。

具体的に確認したければ、例えばゲスト側からPCのNICに割り当てられたアドレスへPingを打ちつつ、ホスト側でnetstatコマンドで確認するか、パケットキャプチャしても良いです。下記ページを参考に頑張ってみてください。

[netstat:ネットワークの統計やルーティングテーブルの確認](http://www.itbook.info/study/trouble2.html) [ICMP – ping, traceroute 詳細説明](http://changineer.info/ccie/cisco_security/icmp_ping_traceroute.html)

投稿2015/11/09 10:48

pi-chan

総合スコア5936

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

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

mint.cherry

2015/11/10 03:15

回答ありがとうございますm(__)m IPのホスト部やネットワーク部に関してはすべて理解しています。 私は、今のイントラネットにただ172.17.0.0/16というネットワークが追加されたものだと思ってます。 host側でroute -nでルーティングテーブルを確認したところ、「172.17.0.0/16宛はdocker0へ」、「192.168.1.0/24宛はeth0へ」と記述があります。 ホストにつないでいるルータにも172.17.0.0/16宛は192.168.1.1宛と静的ルートを設定しています。 お互いのroutingテーブルに必要なルート情報を持っていることから、192.168.1.0/24のネットワークからping172.17.0.1と記述をすれば、きちんと返答も帰ってきます。 IPマスカレードが必要なのでしょうか?って思ってしまってます><(汗)
pi-chan

2015/11/10 23:39 編集

「IPマスカレードが必要なのでしょうか?って思ってしまってます」 これはちょっと順序が逆では? 一口にDockerコンテナと言っても、どんなネットワーク構成で使用するかによって事情が全く異なって来ます。 ブリッジモードで運用するならば、ホストとゲストは「同じネットワーク」に属しますので、IPマスカレードなど出る幕はありません。 別のネットワークとして「分離」するなら、IPマスカレードが必要な場合もありますし、別の方策でネットワークを繋ぐ方法もあるかもしれません。 ちなみに、『host側でroute -nでルーティングテーブルを確認したところ、「172.17.0.0/16宛はdocker0へ」、「192.168.1.0/24宛はeth0へ」と記述があります。』というのは、Dockerの設定とは別個にマニュアルで設定されたものなのですか!? Dockerは、元々linuxに備わっている「コンテナ」技術を発展させたもので、ネットワークの仮想化もlinux既存のネットワーク関連機能を組み合わせて実現しています。ただ、従来(LXC)ではipコマンド等を使用してマニュアルで設定する必要のあったものを、(ザックリとした言い方をすれば)Dockerコマンドでラッピングしてあるだけです。 自分はDocker初心者ですので実装を詳しく知っている訳ではないですが、仮想ブリッジといってもブリッジ機能を持つ「実態」が存在するわけではなく、linuxのルーティングテーブル等を適宜設定して「ブリッジ機能をシミュレートしている」だけです。 確かし、コマンドを駆使してルーティングテーブルを自由自在に設定できるのであれば、DockerのIPマスカレード設定をする必要は無いかもしれません。しかし、Dockerを使用する最大のメリットは、そうした個別のコマンドによる細々した設定を「Docker」という仕組みによって隠蔽し、テスト環境にも本番環境にも同じ「コンテナ」という入れ物を準備することで、安全かつ迅速にリリースを実施することにあります。 ですから、(仮想)ネットワークを含めてコンテナ周りのリソース全ての管理を、Dockerという同じ枠組みの中で管理できることはとても重要なことだと思います。 ご参考までに、LXCとDockerのネットワークに関連した解説ページのURLを張り付けておきます。 > http://gihyo.jp/admin/serial/01/linux_containers/0006?page=1 > http://enakai00.hatenablog.com/entry/20140424/1398321672 ⇒非常に類似している事がお分かりと思います。
mint.cherry

2015/11/11 09:19

返信ありがとうございます。 ubuntuのルーティングテーブルには私は何も設定していません。おそらく、eth0自身に固定IPを振っていますのでdirectconnectで各経路を学んだものだと思います。 記載してくれたURLでいろいろと学ばせていただきましたm(__)m (dockerってもともとLXCの技術を使っていたんですね。。。) もしかして、私自身間違えた考え方をしてしまったのかもしれません。 IPマスカレード:ローカルIP複数に対して1つのグローバルIPでインターネットにでれる。 ローカルIPとグローバルIPに注目しておもいました。 これを、私の解釈として「172.17.0.1は192.168.1.1としてイントラネットで通信できます。」 と考えていました。 複数のコンテナ内ローカルIP(172.17.0.0/16)から一つのホスト側のローカルIP(192.168.1.1)に変換できるということです。これだと、複数のローカルIPから1つのグローバルIPではなくローカルIPですね。。。 ただ、私の考えのイントラネットに仮想的なものですけど172.17.0.0/16のネットワークが追加されていますという考えは変わりません。 ただ、コンテナはインターネットに出る際にはIPマスカレードを使用できます。ということであっていますかね(汗)
pi-chan

2015/11/11 11:51

自分はネットワークに関しては素人なので、詳しくは分かりませんが… コンテナからインターネットに「出る」には、IPマスカレードは必ずしも必要ではありません。逆に、外(インターネットだけでなく、ホストのネットワークも含む)からコンテナ内へアクセスするには、IPマスカレード(またはそれに相当するアドレス変換)が必要です。 コンテナ使用時のベストプラクティスは、1コンテナ=1サービスで運用することではありますが、いずれにしても「外」からコンテナ内の特定のサービス(WebサーバーだったりDBサーバーなど)へアクセスするには、単にIPアドレスの紐付けだけでなく、サービスが使用しているListenポートも含めて対応付ける必要があるためです。 そこが、NATとIPマスカレード(NAPT)の一番の違いなのだと素人なりに理解しています。
mint.cherry

2015/11/16 02:51 編集

返信ありがろうございます。遅くてすいませんm(__)m 先週の土日に本屋に行ってdockerの書籍を見てきました。私の構成だとIPマスカレードは動作をしているのですが、使っていません。 ipマスカレードの特徴として外部(ホスト外)から内部(ホスト内)へpingが送れませんが送れてしまってます。 本来なら、docker run -p でポートを指定してやらなければならないことがわかりました。 docker run -p 8080:80 でコンテナに外部から通信したいときに、「ホスト側のアドレス:8080」とのやり方が本来のやり方でした。 (-pで8080:80とか1組のポート番号しかできないので、そのため1つのコンテナに対し1サービスなのかな?)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問