EC2 に接続して docker をみてみたい状況ありますよね。
EC2 のインスタンス上で docker を用いて Adminer や nginx などのコンテナを起動した時、そのコンテナのポートにローカルのブラウザからアクセスする方法をお伝えします 🐳
TL;DR
重要なのは SG の設定です!
ローカルの docker 版
まずはローカルの docker でコンテナを起動した時、そこにブラウザからアクセスするためにはhttp://localhost:<port>
にアクセスすると思います。
この際に必要なのは ポートフォワーディング です。
これは簡単にいうとローカルとコンテナのポートの紐付けを行うイメージです。
例えば ローカルの ポート8080とコンテナのポート8080を紐付けると、ローカルのポート8080からコンテナのページなどにアクセスすることができるわけです。(ポート番号は同一である理由はないです。が、同じの方がわかりやすいです。)
EC2 インスタンスの docker 版
ここまでがローカルの docker でコンテナを作成したときの話でした。
ここからは EC2 のインスタンス上の docker にアクセスしてみましょう。
ここで EC2 に SSH 接続して docker 等をインスタンスに入れる方法は巷にたくさん紹介されているのでこちらで SSH 接続 & docker のインストールまでやりましょう。また、コンテナの起動もしておいてください。
ちょっと脇道にそれるのですが、今は URL の localhost としているところは実は 自分のPCの という意味を担っています。つまり、そこを EC2インスタンスのパブリック IP にすれば、ローカルから EC2 上で建てたコンテナにアクセスできます。
具体的には http://x.x.x.x:8080
にアクセスすれば良いです。
しかし、aws のセキュリティグループ(以下SG)などの設定によりアクセスできないことがあります。以下でその対処法を紹介します。
netcat を使ってEC2 と docker の疎通確認を ローカル からと EC2インスタンス からの2つで行います。
EC2上から疎通確認
こちらはおそらくうまくいっています。
EC2に適宜 netcat をインストールしてください。(yum などで)
netcatの使い方は
(ec2-user) $ nc -vz <IP> <Port>
という感じです。(ポート番号はコンテナのではなくホストのです。)
今、SSH 接続しているのでこの目線からの localhost はEC2インスタンスのことです。つまり、EC2とコンテナの疎通確認をインスタンス上で行うには
(ec2-user) $ nc -vz localhost 8080
connected to hoge
が返ってきていればOK。
ここにエラーが出ていたら EC2インスタンス自体とコンテナの疎通がうまくいっていません。
Dockerfile や compose あたりのファイル自体を見返してみてください。
ローカルから疎通確認
ここがおそらくうまくいっていません。
まずはncをインストールしてください。(mac は標準であります)
今度はローカルから nc します。
$ nc -vz x.x.x.x 8080
ここでエラーが出ていたら、9割 SG に原因があります。
なので aws のインスタンスのページに飛びましょう。
そしたら画面下部のセキュリティに行き、SG のページに飛んでください。
次にインバウンドルール からインバウンドルールの編集を押してください。
今は SSH 接続用の 22 だけが設定されていると思います。
ルールを追加 → カスタムTCP → あけたいport って感じで画像のように port を設定してください。
そしたら再び nc をしてみて connected になっていることを確認してください。
これでhttp://x.x.x.x:8080
にアクセスできるはずです!
最後に
読んでいただきありがとうございました🙇♂️