nginxにアクセス
docker run -d --name=nginx mynginx
で起動してみても、nginxってアクセスできないですですけど … アレ???
いえ、それが正常な動作です。
docker コンテナは一つの閉じた世界を作っています。
管理者特権の世界でログインする(docker exec ... /bin/bash
してログインする)のは出来ても、
ユーザにサービスはしていません。
正確には、 コンテナのなかで nginx は 80/tcp を開いて待ち受けしているのですが、 docker はコンテナの境界をこえた通信(インターネット -> コンテナ)を許していません (コンテナは隔離された空間なのです)
ユーザにサービスするには、
つまりコンテナの外から nginx の 80/tcp へアクセスするには、
docker へ明示的にコンテナにアクセスできる穴をあけてください
という指令が必要です。
それが-p
オプション(publish の p)になります。
次のコマンドを実行してみてください
docker run -d --name=nginx -p 80:80 mynginx
ちなみに-p 80:80
という(ポート番号が同じ)場合-p 80
と省略可能です
docker run -d --name=nginx -p 80 mynginx
実行したら、アクセスしてみましょう。 ブラウザを使わずとも curl コマンドで確認できます
curl http://127.0.0.1:80/
を実行すると
<!DOCTYPE html>
<html>
... 省略 ...
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
のような表示が出てきましたか?
公開するポート番号を変更したい
インターネットからのアクセスを 8080/tcp で受けたい場合は
docker run -d --name=nginx -p 8080:80 mynginx
とします。
-p ホスト側のポート番号:コンテナ側のポート番号
この場合、下図のような static NAT (destination NAT)をしている状態になります
ホスト コンテナ
ユーザ ----> 8080/tcp ---> 80/tcp
不要なポート番号は公開しない
docker は、デフォルトで、この状態を実現しています。 運用ポリシーとして、これは正しい姿勢です。
実際、この構築ガイドで作成するシステムでは3つのサーバプロセスが動作し、 80/tcp、8080/tcp、3306/tcpと合計3つのポートで待ち受けしています。 しかしながら、 インターネットからdocker コンテナ空間へのアクセスを許しているのは 80/tcp だけです