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

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

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

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Docker

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

Q&A

解決済

1回答

6244閲覧

DockerのコンテナのIPアドレスとポート番号の扱い方を教えて下さい。

suvera

総合スコア106

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Docker

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

0グッド

0クリップ

投稿2016/10/03 07:50

###前提・実現したいこと

現在、MacPCでCentOSのコンテナとMySQLのコンテナを1つずつ開発用に
作成して運用しています。

この開発用とは別に
常に動く状態のものを稼働させておくサーバーをもう1つずつ準備したいです。

今までCentOSは
ポート番号を-p 8080:80
IPアドレスはbridgrネットワークから自動設定

MySQLは
ポート番号を-p 3306:3306
IPアドレスはbridgrネットワークから自動設定

でコンテナ作成を行っていました。
しかし、サーバーを使い分けるのにIPアドレスが自動割当では不便だったのでIPアドレスを指定して割り当てられるようにしました。

しかし、複数運用する際のポート番号をどうすればいいかがわかりませんでした。

今までのCentOSのポート番号はHTTPの代替ポート番号としてよくつか合われているということだったので8080を設定し
MySQLにはそのまま3306を設定していました。

ただこれを複数準備していく際はポート番号はどのように付けていくものなんでしょうか?

また、IPアドレスについても適当なルールを作って番号を割り当てればいいものなのでしょうか?
例として1~10は常に稼働させるものに使い、それ以降を開発用とするなど。

IPアドレスやポート番号に対する理解が足りていないために悩んでいるだけの問題なのかもしれませんが、こういった際にどのように割当を行っていくのが違和感がないものなのかを教えて下さい。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ネットワーク環境とDockerのホストの関係を確認させてください。

  • Mac OS の PC が1台あって、そこに Virtual Box の仮想サーバが2台立ち上がっている
  • それらの仮想サーバはブリッジでPCのネットワークインタフェースにつながれており、固定IPを割り当てた
  • 仮想サーバの片方には Cnetos の Web サーバの Docker コンテナが動いており、8080ポートで exportしている
  • もう、片方にはMySQLの Dockerコンテナが動いており、3306ポートで動いている

ということで間違いないでしょうか?

ただこれを複数準備していく際はポート番号はどのように付けていくものなんでしょうか?

基本的に他と競合しなければ、どのように割り振ってもかまいません。ただし、ポート番号の範囲毎にその予約度合いが決まっていて、Wikipedia ポート番号にあるとおり、 1023 以下を使うと、他のサービスを立ち上げるときに競合したり、ポート番号からサービスを特定しようとする人を騙したりしてしまうので、避けたほうが良いでしょう。

IPアドレスについても適当なルールを作って番号を割り当てればいいものなのでしょうか?

これも自分でルールを決めれば良いと思います。普通は DHCP のレンジと固定IPのレンジに分けます。
その比率は今後の運用でどっちがどのくらい増えそうかと言うので決めれば良いと思います。

投稿2016/10/03 08:51

mit0223

総合スコア3401

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

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

suvera

2016/10/04 00:57

>ネットワーク環境とDockerのホストの関係 それであっています。 いつも解答いただき本当に助かっています。 ありがとうございます。
suvera

2016/10/04 02:26

解決後に追加で申し訳ありません。 もしよければお答えください。 Wikiをみてポート番号の種類があることが分かりました。 今回のようにルールを決める際は 「一般的なポート番号」や「登録済みポート番号」の範囲外の 「自由に使用できるポート番号」である 49152番 - 65535番 の間でルールを作って行くという形にしたほうがいいのでしょうか? もし、8000番から8099番をWeb サーバ用に使おうとすると 「登録済みポート番号」にかぶっているため問題が起きる可能性がある という認識であっているでしょうか?
mit0223

2016/10/04 04:34

> 8000番から8099番をWeb サーバ用に使おうとすると「登録済みポート番号」にかぶっているため問題が起きる可能性があるという認識であっているでしょうか? はい、そのとおりです。 「登録済みポート番号」が IANA で登録制になっているのは、製品ベンダーが他の製品との競合をさけるためのものです。自分がポート番号を決めた後に購入した製品がたまたまデフォルトのポート番号で競合したということが起こり得るかもしれません。ただし、このあたりのポートを使用している製品は、ポート番号を変更できるのが一般的なので、あまり気にしなくて良いでしょう。 > 49152番 - 65535番 の間でルールを作って行くという形にしたほうがいいのでしょうか? いいえ、それはよくありません。その領域はOSがクライアント用のポート番号を勝手に割り当てるので、サーバを起動しようとしたらたまたまクライアントがすでにそのポートを使っていたということが起こりかねません。こちらはタイミングで運次第になるので、「登録済みポート番号」よりもたちが悪いです。 参考: https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%95%E3%82%A7%E3%83%A1%E3%83%A9%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88 上記 Wikipedia よると、、Linux の場合、32768からクライアントのIPを割り当てるようなので、 32768 未満にしておいたほうが良さそうです。Windows サーバの1025-5000も念のため避けたほうが良いでしょう。 結論: 5001-32767 の範囲で割当ルールを作るのが良いと思います。
suvera

2016/10/04 07:39

ありがとうございます!
suvera

2016/10/14 05:34

日数が経っていますが、 先日6000番のポートを利用しようとしたところ利用できませんでした。 5001からと言うのは間違いなんでしょうか? こちらのサイトには http://27bit.com/question-number.html > 49513~65535までの番号は、ダイナミック/プライベートポートと言い、基本的には、この間が自由に使えるポート番号です。 と、ありました。
mit0223

2016/10/14 06:00

割当ルールの範囲については、間違っていないと思います。6000番を使っているプログラムがあるのであれば、それを割当範囲から除いて、今後ぶつからないようにするしかないと思います。基本的に単純な番号を取り合っているので、全く競合しないというのは不可能です。 49513~65535までの番号は、エフェメラルポートとして利用されるので、いつ何番が使われているかを予測することは不可能です。 https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%95%E3%82%A7%E3%83%A1%E3%83%A9%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88 クライアントとサーバが通信するとき、サーバ側は指定したポート番号で通信しますが、クライアント側はエフェメラルポートを利用します。つまり、OSが空いてる番号を勝手に割り当てるのです。エフェメラルポートにどのような番号を使うかについては、 - 多くのLinuxカーネルは32768から61000を使う - Microsoft WindowsはWindows XPとWindows Server 2003まではデフォルト設定で1025から5000をエフェメラルポートとして使用していた。 - Windows VistaとWindows Server 2008以降はIANAの提言する範囲(49513~65535)を使用している とのことですので、前回のコメントのとおり、5001-32767 の範囲であれば、OSがエフェメラルポートとして割り当てたポート番号とはぶつからないですむだろうということです。 サーバプログラムどうしで競合する場合は、起動時にわかるので、ぶつからないように構成すればいいのですが、エフェメラルポートとの競合は運しだいになるので、いつ競合するかわかりません。例えば、Linux上であるWebアプリがLDAPで認証をするためにLDAPクライアントとしてソケットを開くと、そのポート番号は32768から61000の中から開いてるものが割り当てられます。例えば、それが 50000 だったとしましょう。このときにサーバのポート番号として50000 を指定したサーバを起動しようとすると起動に失敗します(めったに当たらないとは思いますが)。したがって、エフェメラルポートに割り当てられる可能性のあるポート番号をサーバに割り当てるのは避けたほうが良いと思います。
mit0223

2016/10/14 06:47

方法を思いつきましたので、訂正させてください。 - ダイナミック/プライベートポートは、49513~65535 - Linuxのエフェメラルポートは、32768〜61000、 なので、Linux の場合は、61001〜65535 は完全に空いてるわけです。 ここをサーバのポート割当に使われてはどうでしょうか? Linuxでエフェメラルポートの範囲を確かめる方法は $ cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 です。この範囲を変更する方法は http://b.l0g.jp/linux/ip-local-port-range/ にあります。 プライベートに運用するサーバプロセスのポート番号であればこの運用ルールで充分ではないでしょうか。
mit0223

2016/10/14 07:04

連投ですが、補足です。Windows Server 2008 以降では、ダイナミック/プライベートポートの範囲すべてをエフェメラルポートとして利用するので、61001〜65535 も空いてません。 https://support.microsoft.com/ja-jp/kb/929851 によると、Windows でも範囲が変更できて、 netsh int ipv4 set dynamicport tcp start=49513 num=11488 netsh int ipv4 set dynamicport udp start=49513 num=11488 netsh int ipv6 set dynamicport tcp start=49513 num=11488 netsh int ipv6 set dynamicport udp start=49513 num=11488 とすることで、エフェメラルポート範囲のお尻をLinux に合わせられます。 ただし、エフェメラルポートをたくさん使うようなアプリが入ってる場合は注意が必要ですが、15000個なら足りて11000個だと足りないというようなケースは少ないかと。
suvera

2016/10/16 23:56

解答を終えた問題に対して詳しく説明していただき本当に有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問