質問: 以下の説明において、3台のマシンが登場します | マシン名 | 説明 | | --- | --- | | ホスト | vps上にあるlinuxマシン。Dockerがインストールされている。グローバルip割り当て済み。以下のコマンドはこのホスト上で実行された。nginxも動いている | | Dockerのコンテナ | ホストにインストールされているDockerで作成された仮想マシン。nodejsが動いている | | ホスト外 | ホストとは別のマシン。目の前にあるwindowsマシン。ここからホストにsshで接続している | ``` [user@localhost web-server-docker]$ cat Dockerfile FROM centos:6.7 ~webサーバーを立てる~ EXPOSE 80 [user@localhost web-server-docker]$ sudo docker run -d -p 2525:80 web-server ``` この状態ですと、ホスト側からは curl localhost:2525 でdockerの中のwebサーバーにアクセス出来ますし、ホスト外からも[グローバルip]:2525 でアクセスする事が出来ます。 そこで質問なのですが、ホスト外から[グローバルip]:2525で直接繋がらず、ホストのnginx経由でしか繋がらないようにするにはどうしたらよいうのでしょうか。 nginxの設定はlocalhost:2525にポート転送すればいいので問題ないのですが、Dockerのコマンド・Dockerfileにどう書けば **・ホストからはlocalhost:2525で繋がる ・ホスト外からは[グローバルip]:2525で繋がらない** という状態にする事が出来るのでしょうか。 また、このような使い方はDockerの標準な使い方からは逸脱しているのでしょうか。 「いやいや、工夫すれば出来るけどDockerはそういう目的で使うもんじゃない」というのであればご指摘頂けたらと思います。 今回の質問内容の環境ですとDockerを使う意味が薄いかなと自分でも思っているのですが、勉強のためDockerを使ってみたい。出来ればnodejsのサービスはそのまま別のvpsに引っ越す事が出来るように環境をdockerで隔離しておきたい。という理由がありDockerに挑戦してみた次第です。
回答: Dockerはコンテナであり、あくまでネットワークやカーネルは隔離されながらもホストと共有しています。なのでDockerの機能でホストとのみつなぐことはできず、従来の「ホストの◯番ポートへのアクセスはこのコンテナに転送する」ということしかできません。 なので、今回のケースとしては、 * Dockerで2525番の転送は有効にしておく * ホストのファイアウォールで、外部→2525を拒否、内部→2525を許可 のような設定にしてみてはいかがでしょうか。 また、コンテナはファイルシステム等を隔離して実行させてセキュリティを高めるもので、質問者さんは本来の使い方をしていると思います。