4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWSでDockerコンテナを起動させる方法

Posted at

目的

AWSのEC2でDockerで動かしていたプロジェクトを起動させ、アプリをHostingすること。

目次

  1. EC2 Instanceを起動
  2. SSHでInstanceに接続
  3. GitとDockerをインストールする
  4. 事前にBuildしたイメージを使うか、EC2でBuildするか
  5. RepositoryをcloneしてDockerイメージをBuildする方法
  6. Docker Hubからイメージをダウンロードする方法
  7. コンテナを立ち上げる
  8. セキュリティグループを設定する

EC2 Instanceを起動

まずはこれから使うクラウド上のEC2 Instanceを立ち上げます。

EC2は、AWSでいう巨大な機械の最も基礎的な部品です。クラウド上で仮想コンピューターを作ってくれるサービスです。

スクリーンショット 2021-12-17 9.45.43.png
インスタンスを起動をクリックします。
スクリーンショット 2021-12-17 9.51.57.png
マシンイメージを選択します。Linux、Windows、Macまでも選べますが、AWSのまーさる機能が込み込みのAmazon Linuxを使いたいので、一番上のKernel 5.10を選びましょう。
スクリーンショット 2021-12-17 9.52.52.png
次はインスタンスタイプを指定します。これは、どれぐらいの資源を割り当てるかを決めるところですが、今回は無料枠を使いたいので、初期値のt2.microを使います。
機械学習とか、画像処理とか、多くのCPU資源を要するプロジェクトだったらここでその割り当てができます。
スクリーンショット 2021-12-17 9.55.25.png
次は詳細の設定でネットワーク設定を行いますが、下記のネットワークの部分にデフォルトの選択肢を選びます。なければ、新しいVPCの作成をクリックして作ってください。
スクリーンショット 2021-12-17 9.58.10.png
他の設定は変えなくてもいいので、そのまま確認と作成をクリックします。
スクリーンショット 2021-12-17 10.00.10.png
そして次のページでネットワークのセキュリティがやばいけど?という警告は出ます。これは、Instanceへの接続をどのIPアドレスからも許可しているからです。今度、アクセスができるIPアドレスを指定する方法について解説します。今回はそのままで起動をクリック。
スクリーンショット 2021-12-17 10.01.11.png
次の手順は非常に重要です。SSHで接続するには、キーペア(RSA鍵)が必要です。
新しいキーペアを作成し、名前をつけて、ダウンロードしましょう。この鍵を持っていれば、誰でも接続できる状態になっているので、扱いにご注意ください。
ダウンロードできたら、作成ボタンをクリックします。
スクリーンショット 2021-12-17 10.03.22.png
インスタンスが起動するまで待ちます。起動できたらこのような画面が確認できます。
スクリーンショット 2021-12-17 10.07.53.png

SSHでInstanceにアクセスする

まずダウンロードしたキーペア.pemファイルをユーザーのrootダイレクトリーに入れます。
Mac OSの場合だと、/Users/{ユーザー名}のところです。
それからTerminal(ターミナル)を開き、以下のCommandを実行

rootのダイレクトリーに念のために戻る

cd ~

ダウンロードした.pemファイルを隠れフォルダーの.sshに入れます。

mv next-socketio-chat.pem .ssh/

次、.pemファイルの権限をchownでお使いのパソコンのユーザーに直さないと読めないので、以下のCommandを実行します。

cd .ssh/
chmod 400 next-socketio-chat.pem 

これでこのキーペアが使えるので、接続してみましょう。 -i で.pemファイルを接続するときに使うように指定します。00-00-00-00のところは自分のパブリックIPv4アドレスを入れてください。

ssh -i "next-socketio-chat.pem" ec2-user@ec2-00-00-00-00.ap-northeast-1.compute.amazonaws.com

これで、この画面が出てきて、EC2に入れたぞ!ってことがわかって、喜ぶ場面になり、ティッシュで涙を拭い、下記を読み続けます。
スクリーンショット 2021-12-17 10.19.43.png

GitとDockerをインストール

EC2のAmazon Linuxはyumでパッケージをインストールします。
一番最初にパッケージのアップデートをした方がいいので、以下のCommandを実行します。 -y はYes・Noを聞かれる時に全部Yesで答えといてくれよーという意味を持っています。

sudo yum update -y

次、Gitをインストールします。

sudo yum install git -y

並びに、Dockerを。だけど、ここは普通のインストールじゃなくて、AWSのサービスを通してインストールすると楽なので、以下のCommandを実行します。

sudo amazon-linux-extras install docker

GitもDockerも無事にインストールされたことを以下のCommandで確認できます。

docker --version
git --version

DockerのServicesを起動させます。

sudo service docker start

ここまでくると、Dockerが普通に使えます。dockerのCommandの前にsudoを付ける必要があります。

事前にBuildしたイメージを使うか、EC2でBuildするか

進む前に、少し解説したいです。
EC2にイメージを持ってくるのに二つのやり方があります。

  1. EC2上にソースコードをGitなどでcloneし、そこでBuildする方法
  2. ローカルのパソコンで作ったイメージをDocker Hubなどにアップロードして、EC2でそれをダウンロードする方法

筆者は後者の方法をお勧めします。なぜなら、イメージを実行するのは環境に依存しないが、イメージをBuildするのは環境に依存することがあるからです。
Dockerでそういった悩みを解決したわけだし、せっかくローカルで駆動実験を行ったわけだから、それをそのまま使いたいでしょう?

しかし、ネット環境が悪かったりして、イメージをアップロードするのはめんどいということもあるだろうから、両方の方法をご紹介しましょうね。

RepositoryをcloneしてDockerイメージをBuildする方法

これから筆者が前回の記事で作ったNextアプリを使います。
https://qiita.com/tronicboy/items/7969a77817d8f2706b52

GitHubからソースコードをgitでcloneします。

git clone https://github.com/tronicboy1/next-socket.io-chat.git

そしてnext-socket.io-chatのフォルダーに入ってイメージをBuildします。

cd next-socket.io-chat/
sudo docker build -t next-socketio-chat .

このメッセージが表示されれば、無事にBuildできました!
スクリーンショット 2021-12-17 10.58.26.png

Docker Hubからイメージをダウンロードする方法

もう一つのやり方があります。それは、Dockerイメージを事前にBuildして、Docker Hubなどにアップロードしたものを、EC2 Instanceにダウンロードする方法です。

今回は筆者がアップロードしたイメージを使いましょう。
https://hub.docker.com/repository/docker/tronicboy/next-socket.io-chat

以下のCommandを実行すればダウンロードされます。

sudo docker pull tronicboy/next-socket.io-chat:latest

ちなみに、次のdocker runのCommandを実行する時点で上記のイメージがダウンロードされていなければ、Dockerが自動でPullしてくれるので、正直にいうとこれは不要です。

とりあえず、イメージがあることを確認しましょう。

sudo docker images

スクリーンショット 2021-12-17 11.10.55.png
バッチリ大丈夫やっさー

コンテナを立ち上げる

次はEC2上でコンテナを作って実行します。

sudo docker run -d --rm -p 80:3000 tronicboy/next-socket.io-chat

EC2側のPortは80番で、Nodeはソースコードで指定している3000番。EC2側でPortの80番を使うのは、下記のセキュリティグループ設定でわかりますが、外部からのHTTPリクエストは80番のみが許可される仕組みになっているからです。

セキュリティグループを設定する

今、Dockerでアプリを立ち上げて、よし!開けてみよう!と思ったら、ちょっと待った!今パブリックのIPアドレスで開こうとしてもつながりません。

セキュリティーグループで設定をしないと無理です。

まず、AWSで先ほど作成したInstanceの管理画面の下の方でセキュリティのタブをクリックして、セキュリティグループへのリンクをクリックします。
スクリーンショット 2021-12-17 11.23.55.png
「インバウンドルールを編集」をクリックします。
スクリーンショット 2021-12-17 11.25.58.png
今表示されているのはPortの22番でSSHのための接続を許可するルールです。HTTPリクエストを許可するルールを追加したいので、追加をクリックします。
スクリーンショット 2021-12-17 11.27.05.png
そして以下のように設定を変えて、保存します。
スクリーンショット 2021-12-17 11.30.32.png
そうするとパブリックのIPv4アドレスでアクセスすると、見事に顔を出してくれます!
スクリーンショット 2021-12-17 11.32.54.png

まとめ

以上、最も簡単なやり方でDockerのイメージをEC2上で起動させ、外部からアクセスできるようにしました。

dockerの前にsudoを使わんといけんかったり、実はこの辺にEC2の大事なことが秘められているのですが、今回はそれらについて触れてないです。

これからはより洗練されたやり方について記事を書いていきたいと思っています。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?