こんにちは。じゅんです。
今回はSpringBootアプリをDockerで動かしてみたいと思います。
Dockerについてはあまりよく知らないので、イチから調べて自分なりの理解もまとめていきます。
これまでの作業内容については以下の記事にまとめています。
例え話の前提
プログラミングを学ぶ際にはよく料理やレストランを例に考えるようにしています。
アプリケーションはユーザーからのアクセスに応じてWebサイトやデータを返します。
レストランもお客様の注文に対して料理やサービスを返します。
今回もレストランの例として、注文したら料理が出てくる全自動調理器なるものをアプリケーションに例えて考えてみます。
Dockerの前提知識
まず、Dockerを使う上で、DockerコンテナとDockerイメージ、Dockerfileという概念を理解する必要があります。
Dockerコンテナとは
Dockerコンテナとは、実際に動いているアプリケーションそのものです。
Dockerの特徴として、このDockerコンテナを持ち運ぶことができるという特徴があります。。
DockerHubというクラウド上の場所から、誰かが作ってくれた実行環境をダウンロードして使用することができるということです。
実際に稼働している1台の全自動調理器のようなものです。
実際に注文が来たら料理を作って提供します。
さらに、実際に稼働している個体単位で簡単にダウンロードすることができる特徴を持っています。
Dockerイメージとは
Dockerイメージとは、アプリケーションのテンプレートのようなものです。
Spring BootをDockerで使用する際には、jarファイルを関連づけることでjarファイルが持つアプリケーションの動作や依存関係、設定ファイルの情報を取得します。
情報の種類 | Dockerイメージ | jarファイル | 説明 |
アプリケーションコード | 含まれる | 含まれる | アプリケーションの処理内容 |
依存関係 | 含まれる | 含まれる | 処理に必要なライブラリやフレームワークの情報 |
設定ファイル | 含まれる | 含まれる (application.propertiesなど) | 接続先などの環境変数 |
実行環境 | 含まれる | 含まれない | OSやミドルウェア |
どのような注文の受け方(券売機などの設定)や注文を受けた後の処理を定義する全自動調理器の鋳型のようなものです。
Dockerfileとは
Dockerfileとは、テンプレートを作成してアプリケーションに実体化するまでの手順書です。
実体はDockerイメージを作成してDockerコンテナとして起動するためのコマンドを順番に記述したテキストファイルです。
全自動調理器の鋳型を作成するための手順書のようなものです。
・稼働させるレストランの設備の指定
・全自動調理器の挙動を定義した仕様書の指定
・全自動調理器を起動させる方法の指定
こういった情報が記述されます。
Docker環境の作成
それではDocker環境を作成してみます。
Dockerのインストール
まずDockerを公式ページからDocker Desktopをインストールします。
(バージョンは4.30.0でした)
Docker Desktopはサインインできたら閉じます。
Dockerfileの作成
プロジェクトのルートディレクトリにDockerfileを作成します。
今回はSpringBootをDockerで起動させるので、SpringBootプロジェクトのルートディレクトに作成します。
なお、Spring Bootアプリの作成については以下に詳しく書いています。
作成したDockerfileにコマンド情報を記述します。
# ベースイメージとしてOpenJDK 17のslimバージョンを使用
FROM openjdk:17-jdk-slim
# 作成したアプリケーションのJarファイルをイメージ内にコピー
COPY target/simple-memo-0.0.1-SNAPSHOT.jar /app.jar
# アプリケーションを実行
ENTRYPOINT ["java", "-jar", "/app.jar"]
【openjdkのslim】
Dockerイメージにおける「slim」とは、イメージのサイズを小さくした軽量バージョンを指します。
この軽量バージョンは、必要最低限のパッケージとライブラリだけを含むように設計されており、通常は開発や本番環境で使用する際に十分な機能を提供します。
Dockerイメージの作成
次にターミナルで以下のコマンドを実行してDockerイメージを作成します。
# Dockerイメージをビルドし、'simple-memo-backend'という名前をつける
docker build -t simple-memo-backend .
コマンドの意味です。
build
: DockerfileからDockerイメージを作成します。-tオプション
: Dockerイメージに名前(タグ)をつけるオプションです。
指定しないと<none>という名前のDockerイメージが作成されます。
(管理が困難になるため非推奨).
: Dockerfileが存在するディレクトリを指定します。
ターミナルの場所に依存するため実行するときはDockerfileが存在するディレクトリで実行する必要があります。
Dockerイメージが作成されたか確認してみます。
# Dockerイメージの一覧
docker images
Dockerイメージを作成できました。
Dockerコンテナの起動
次に、ビルドして作成されたDockerイメージを使用してDockerコンテナを起動します。
# Dockerコンテナを起動し、ホストの8080ポートをコンテナの8080ポートにマッピング
docker run -d -p 8080:8080 simple-memo-backend
コマンドの意味です。
run
: Dockerイメージから新しいコンテナを作成し、実行するためのコマンドです。-dオプション
: デタッチモードで実行するという意味です。
デタッチモードで実行しないと作業しているターミナルが実行ログで占領されてしまいます。引き続き同じターミナルでコマンドを実行したい時には-d
オプションを使用します。-p 8080:8080
: ポートマッピングを表しています。
これにより、ブラウザでhttp://localhost:8080
(実行している端末の8080ポート)にアクセスすると、そのリクエストはコンテナ内の8080ポートにルーティングされ、Spring Bootアプリケーションにリクエストを送ることができます。simple-memo-backend
: 起動するコンテナの元となるDockerイメージを指定しています。
実行結果です。(出力された文字列はコンテナIDです。)
Dockerコンテナが正常に動作しているかを確認します。
# 実行中のDockerコンテナのリストを表示
docker ps
ps
はprocess status の略で、現在起動中のコンテナを表示します。
コンテナIDの先頭文字列が一致していることやIMAGE列の名前がDockerfileで設定した名前になっていることが確認できます。
また、logsコマンド
でDockerコンテナのログを確認することもできます。
# コンテナを指定してログを表示
docker logs <コンテナID>
runコマンド実行時に-dオプションで非表示にした実行ログが表示されます。
では、実際にSpring Bootが起動しているかAPIのテストをcurlコマンド
でしてみます。
コマンドの詳細については以下の記事を参考にしてください。
# メモを作成
$ curl -s -X POST -H "Content-Type: application/json" -d 'サンプル0' http://localhost:8080/api/memos
0
# メモ一覧を表示
$ curl -s -X GET http://localhost:8080/api/memos | jq
[
{
"id": 0,
"content": "サンプル0",
"createdAt": "2024/06/02 09:09:25",
"updatedAt": "2024/06/02 09:09:25"
}
]
正常に動作していることが確認できました!
Dockerコンテナの停止
最後に以下のコマンドでDockerコンテナを停止します。
# コンテナを指定して停止
docker stop <コンテナID>
StatusがExited
になっているため、停止中であることが分かります。
なお、以下のコマンドで再起動することができます。
# コンテナを指定して再起動
docker start <コンテナID>
まとめ
以上がDockerの概要とSpring BootをDockerで起動する方法でした。
参考ページを読んでいるだけでは腹落ちしなかったところも、実際に手を動かすことで頭に入ってきました。
忘れかけたらこの図を思い出そうと思います。
Macユーザーの方は手順を参考にぜひやってみてください!
コメント