Spring bootで作ったHello WorldをAWS ECSで実行
Spring Bootを使ってHello Worldアプリを作る
以下の記事を参考に。
作ったHelloWorldアプリをDockerイメージとしてbuildする
以下の記事を参考に。
注意点1
記事内の手順ではJDK8を使用していたが、今回はJDK11を使いたかったので、docker hubからopenjdk:11を探してDockerfileのFROMに書いた。また、作成するイメージは「springio/gs-spring-boot-docker」となっているが、springioのところを自分のユーザーIDに置き換えた。そうしないとpushできない。記事内にも書いてある。
注意点2
M1 チップのMacで特にオプション指定せずにdocker buildしたため、ARMアーキテクチャで作られて、最初はAWS ECSにクラスターを作ったときにエラーが発生した。--platform amd64 というオプションをつけてdocker buildしたらうまくいった。
buildしたイメージをDocker HubにpushしてAWS ECSで動かす
Docker HubへのpushはDocker Desktopから行った。
AWS ECSのクラスタを作る際にはコンテナ定義は「custom」を使用。Dockerイメージ・タグ名を指定して、ポートは8080にした。その他はデフォルトのままにした。サービス起動後、ログを確認してSpring Bootのアプリ起動時のログが出ていたらOK。タスクからパブリックIPを確認して、http(sなし)で、クラスタ作成の際に指定したポート番号8080を付与してブラウザからアクセス。ローカルでの稼働時と同じように表示されることを確認した。
以下の記事は画面イメージつきでクラスタ作成から画面表示までを説明してくれている。
docker buildは、指定したフォルダ以下をdockerイメージ化するものと理解しました。
Spring Boot の場合はTomcatを内包しているから上記の手順になるけど、JavaEEの場合はPayaraとかGlassFishとかのアプリケーションサーバーにデプロイするところまで行って、デプロイ済のサーバーをdockerイメージ化するのでしょう。きっと。
違っていました。Dockerfileの中のCOPYコマンドでホストからコンテナイメージにファイルコピーしていました。(2021/08/17追記)
そうして作ったdockerイメージを使ってコンテナを起動するときにアプリケーションサーバーの起動コマンドを自動投入するように、DockerfileのENTRYPOINTに書いておく。そうすると、コンテナ起動時にサーバーも起動して、ブラウザでアクセスすると応答が返ってくるようになる。