Server Build Exercises on AWS (Amazon Web Services) 2022 edition

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 だけです

Last updated on 7 Dec 2021
Published on 7 Dec 2021
Copyright (C) 2021-2022 Ken'ichi Fukamachi, All rights reserved. CC BY-NC-SA 4.0
We appreciate AWS Academy Japan for the offer of the learning environment.

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.