![見出し画像](https://assets.st-note.com/production/uploads/images/118135886/rectangle_large_type_2_c88136e7b4cb8672dd711cd92150e0ef.png?width=800)
【Dockerによるコンテナ仮想化】CLIとCompose - Springboot3 第12回
1.はじめに
こんにちは、今日は最近、いろいろ現場に要求される技術であるDocker(ドッカー)について勉強します。もしも、アプリケーションの環境差異や依存関係の問題に頭を抱えているなら、その解決策を提供します。Dockerは「コンテナ仮想化」技術を活用し、アプリケーションとその依存関係をコンテナと呼ばれる軽量で独立した単位に包み込みます。このおかげで、どんな環境でも同じようにアプリケーションを実行でき、開発から本番環境へのデプロイがより簡単かつ一貫性があります。
二日前実装した自動動画制作機で作った4分ぐらいの簡単な説明映像を聞いてみましょう。(英語で作られてTOEIC聴解試験みたいですね)
要は、CLI(1コンテナ)、 Compose(複数コンテナ)、Orchestration(複数のホスト)です。この記事ではCLIとComposeまで勉強します!
![](https://assets.st-note.com/img/1696552908967-0v0RJPhLrR.png?width=800)
OSとアプリケーションの間です。
![](https://assets.st-note.com/img/1696394357848-KJCT1YVqcY.png?width=800)
現プロジェクトのdockerファイルを作成します。
現在のプロジェクトのビルドでドッカーイメージを作成します。
現プロジェクトのドッカーイメージをドッカーハブにPushします。
ドッカーハブからドッカーイメージをPullします。
各端末でドッカーイメージをRunしてコンテナ化して実行します。
2.CLIによりコンテナ仮想化1: Springboot App
![](https://assets.st-note.com/img/1696396376200-8JNlyqnWFb.png?width=800)
1.プロジェクト作成
![](https://assets.st-note.com/img/1696395396250-FjJMWNYMnZ.png?width=800)
依存関係設定後、プロジェクトをダウンロードします。
![](https://assets.st-note.com/img/1696396128786-jVOu8t2BhP.png?width=800)
![](https://assets.st-note.com/img/1696396437222-IuPvbrBEIm.png?width=800)
文字列を返す関数を作ります。
![](https://assets.st-note.com/img/1696396575629-ZwODZmyReZ.png?width=800)
![](https://assets.st-note.com/img/1696396614259-2isgfk7FgT.png)
文字列値が表示されます。
2.ドッカーファイル生成
![](https://assets.st-note.com/img/1696397000866-8nzeASjbfH.png?width=800)
![](https://assets.st-note.com/img/1696397217354-gih6TaXv1d.png?width=800)
'Lifecycle' の 'clean' と 'package' をクリックします。
最後に、上部の矢印をクリックしてビルドします。
![](https://assets.st-note.com/img/1696397476277-euzrsVZ8my.png?width=800)
プロジェクト内にDockerfileというファイルを作ります。
最初の文字は大文字で、必ず「Dockerfile」という名前にします。
![](https://assets.st-note.com/img/1696397944284-YNr5IqEKvL.png?width=800)
OpenJDKはもうすぐサポートが終了するので、
他の代替イメージを探す必要があります。
ここではeclipse-temurinを使います。
(*でも、以後は設定問題でopenjdk:17に戻りました。)
![](https://assets.st-note.com/img/1696398904183-1LFS9joAOS.png?width=800)
FROM eclipse-temurin:17
LABEL maintainer="java.net@gmail.com"
WORKDIR /app
COPY target/springboot-docker-demo-0.0.1-SNAPSHOT.jar /app/spring-boot-docker-demo.jar
ENTRYPOINT ["java", "-jar", "springboot-docker-demo.jar"]
FROM eclipse-temurin:17: このコマンドは基本的なDockerイメージを定義します。eclipse-temurinはAdoptOpenJDKが提供する非公式のOpenJDKリリースであり、:17はJDK 17バージョンを使用することを示しています。
LABEL maintainer="java.net@gmail.com": このコマンドはDockerイメージにメタデータを追加します。java.net@gmail.comはイメージを管理する人またはチームの連絡先情報を示しています。
WORKDIR /app: このコマンドは作業ディレクトリを/appに設定します。以降のコマンドはこのディレクトリを基準に実行されます。
COPY target/springboot-docker-demo-0.0.1-SNAPSHOT.jar /app/spring-boot-docker-demo.jar: このコマンドはローカルマシンのtarget/springboot-docker-demo-0.0.1-SNAPSHOT.jarファイルをDockerイメージの/app/spring-boot-docker-demo.jarパスにコピーします。
ENTRYPOINT ["java", "-jar", "springboot-docker-demo.jar"]: このコマンドはコンテナが起動されるときに実行される必要があるコマンドを設定します。ここではSpring Bootアプリケーションを実行するためにjava -jar springboot-docker-demo.jarを使用しています。
3.ドッカーイメージのBUILD/RUN
![](https://assets.st-note.com/img/1696399707623-ee8x4psAcA.png?width=800)
「docker build -t springboot-docker-demo .」コマンドを入力
![](https://assets.st-note.com/img/1696405986504-UyeOYny0Tr.png?width=800)
![](https://assets.st-note.com/img/1696406102227-ZREQZM0l11.png?width=800)
![](https://assets.st-note.com/img/1696406284346-YLV2Tvv4hN.png?width=800)
![](https://assets.st-note.com/img/1696406366703-Q3ecUGFitm.png?width=800)
** 実行がうまくいかない場合は、イメージを削除して再試行してください。もし、「in user(dangling)」というメッセージが出たら、コマンドウィンドウに 「docker system prune -a」 と入力すると全て削除されます。
**ここでIntellijのバージョンがdockerのプラグインのバージョンと合わなかったのでかなり苦労しました。eclipse-temurinではなく、openjdk17に合わせました。 openjdk17はセキュリティの問題で推奨されないそうですが、この記事では実習のために仕方なくopenjdk17を使いました。
![](https://assets.st-note.com/img/1696422797274-jpXjaSTWA3.png?width=800)
「docker run -p 8081: 8080 -d springboot-docker-demo」入力!うまくいきますね!
docker run -p 8081: 8080 -d springboot-docker-demo
「-d」というオプションコマンドを説明します。
実行方式に関するコマンドで、実行方式はフォアグラウンドモードとバックグラウンドモードの二つがあります。
フォアグラウンドモード(Foreground Mode)
基本的にドッカーコンテナはフォアグラウンドモードで実行されます。このモードでは、コンテナの実行ログがターミナルに出力され、コンテナが実行中、ターミナルはそのコンテナの制御を占有します。ユーザーが特定のキーを押すまでコンテナは継続的に実行されます。
バックグラウンドモード (Background Mode)
「-d」または「-detach」オプションを使うと、Dockerコンテナをバックグラウンドモードで実行することができます。このモードでは、コンテナの実行ログがターミナルに表示されず、バックグラウンドで実行されます。ユーザーは他の作業をしたり、ターミナルを終了することができます。
バックグラウンドモードで実行した後、
「docker logs -f ****」コマンドで実行内容を確認することができます。
docker logs -f ****
![](https://assets.st-note.com/img/1696424846388-wv3u3GbnMh.png?width=800)
ログを実行させて確認する方が良いです。
docker ps
docker stop ****
![](https://assets.st-note.com/img/1696424977267-8HjFlHfz9L.png)
4.ビルドしたドッカーイメージをドッカーハブにPUSH
![](https://assets.st-note.com/img/1696427906561-xdPlv3E1lV.png?width=800)
docker login
docker tag spring-docker-demo ****/spring-docker-demo:0.1.RELEASE
docker push ****/spring-docker-demo:0.1.RELEASE
![](https://assets.st-note.com/img/1696428059560-9AggByr9WE.png?width=800)
5.ドッカーハブからドッカーイメージPULL
![](https://assets.st-note.com/img/1696429978650-Chi07TnlTP.png?width=800)
docker pull ****/spring-docker-demo:0.1.RELEASE
![](https://assets.st-note.com/img/1696430361700-1CPHCEV9t7.png?width=800)
うまくいきますね!
3.CLIによりコンテナ仮想化2: MySQLとSpringboot
![](https://assets.st-note.com/img/1696464501260-O198W3tMbG.png?width=800)
1.MySQLイメージをPULL/RUN
次はMysqlドッカーのイメージをPullしてみましょう。下記のコマンド入力し、バックグラウンドで実行します。
docker pull mysqldb
![](https://assets.st-note.com/img/1696431605602-xyypF22xc1.png?width=800)
強調された部分は自分のアカウントとパスワード入力。
「-d」バックグラウンドモードで実行されていて、「docker logs -f ****」コマンドで実行内容を確認することができます。
docker logs -f localhost
Dockerネットワーク
あるコンテナと別のコンテナを通信させるためには、同じDockerネットワークにデプロイする必要があります。
![](https://assets.st-note.com/img/1696466124899-ELYuGRNrDm.png?width=800)
「 docker network ls」を入力し、インストール完了確認
Dockerネットワークとしてspringbok-mysql-netを作成しました。ドライバはBridgeです。
SELECT user, host FROM mysql.user;
CREATE USER '****'@'localhost' IDENTIFIED BY '****';
GRANT ALL PRIVILEGES ON *.* TO '****'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
DBアカウントがrootしかなくて
MySQL Workbenchで上記のコマンドを入力し、
新しいアカウントを作った。
![](https://assets.st-note.com/img/1696468326867-za0mXLc8em.png?width=800)
docker run --name mysqldb --network springboot-mysql-net -e MYSQL_ROOT_PASSWORD=**** -e MYSQL_DATABASE=employee_db -d mysql
このコマンドを実行すると、Dockerは "mysqldb" という名前のコンテナを作成し、指定されたオプションに従ってMySQLが実行されます。データベースとネットワークに関する設定は、イメージを実行する際に構成され、これによりアプリケーションとデータベース間で通信が可能になります。
--name mysqldb: 実行されるコンテナの名前を指定します。ここでは "mysqldb" と指定されています。
--network springboot-mysql-net: コンテナが接続されるネットワークを指定します。"springboot-mysql-net"という名前のDockerネットワークにコンテナを接続します。
-d: コンテナをバックグラウンドで実行します。つまり、実行後もシェルを占有せず、他のコマンドを入力できます。
mysql: 使用するイメージの名前です。ここでは、公式のMySQLイメージを使用しています。
docker ps
docker logs -f 「process_id」
「docker ps 」プロセスのIdを照会し、
docker logs -f 「process_id」 で実行内容を確認。
ドッカーでDBにアクセスする
![](https://assets.st-note.com/img/1696468658259-pumBc9kQic.png?width=800)
mysql -u root -p
![](https://assets.st-note.com/img/1696468733118-rihDs78iGt.png)
一覧が表示されます。
![](https://assets.st-note.com/img/1696486717357-g1BkSK6Upn.png?width=800)
![](https://assets.st-note.com/img/1696486882263-5clnLxJKAG.png?width=800)
2.Dockerfileの作成
![](https://assets.st-note.com/img/1696469823412-GeNTDGaOO8.png?width=800)
![](https://assets.st-note.com/img/1696469938058-XkfBcTHOj1.png)
![](https://assets.st-note.com/img/1696470705851-b32PUDwUG0.png?width=800)
下記のコード入力。
FROM openjdk:17
LABEL mentainer="abc@gmail.com"
WORKDIR /app
COPY target/springboot-restful-webservices-0.0.1-SNAPSHOT.jar /app/springboot-restful-webservices.jar
ENTRYPOINT ["java", "-jar", "springboot-restful-webservices.jar"]
3.プロファイルの実装とDockerイメージのビルド
![](https://assets.st-note.com/img/1696471788814-6vEoBTsiYL.png?width=800)
src/main/resources/application-docker.properties
このパスにドッカー設定ファイルを作ります。
ここは 「localhost」ではなくて、「//mysqldb:3306/」です。
![](https://assets.st-note.com/img/1696487283678-hzU7EIE0NM.png?width=800)
spring.datasource.url=jdbc:mysql://localhost:3306/user_management
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.profiles.active=docker
![](https://assets.st-note.com/img/1696490635534-p6uLdvcTkF.png?width=800)
注意点!
application-docker.proeprtiesに入れるdbのパスワードは
最初にmysqlコンテナを動かす時設定したrootアカウントのパスワードと同じです。ここで迷うとかなり時間を無駄にする可能性があるので注意しましょう。
spring.datasource.url=jdbc:mysql://mysqldb:3306/employee_db
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto=update
![](https://assets.st-note.com/img/1696489266272-wTQGQqGE22.png)
「springboot-restful-webservices」のビルドがうまくいかない場合はテストをスキップしていないからです。
上部の円の中に斜線が引かれたアイコンをクリックして
ビルドする必要があります。
![](https://assets.st-note.com/img/1696472525796-GTvenlSbno.png?width=800)
*もし、MySQLのImageを間違ってビルド、実行したら、コンテナを止めて、削除し、再ビルドします。
![](https://assets.st-note.com/img/1696491218422-Uz8NgBfio4.png?width=800)
4. SpringBootのDockerイメージ実行・APIテスト
ついに、「springboot-restful-webservices」を実行します!!下記のコマンドをPowershellに入力します。
docker run --network springboot-mysql-net --name springboot-mysql-container -p 8080:8080 -d springboot-restful-webservices
docker logs -f [process_id]
![](https://assets.st-note.com/img/1696491570527-U4ZmwKfLty.png?width=800)
![](https://assets.st-note.com/img/1696491942309-8YtbfWKcdE.png?width=800)
![](https://assets.st-note.com/img/1696492045818-X0M0aDkIdx.png?width=800)
![](https://assets.st-note.com/img/1696492075022-27PyZMU9Bg.png)
4.Composeにより複数のコンテナ仮想化
![](https://assets.st-note.com/img/1696492132054-rW414VKehD.png?width=800)
「docker compose up」コマンドが核心。
別々にコンテナ仮想化をしたら、時間コストがかかります。
それで、Docker Composeを用いたら、数のコンテナ仮想化をよりしやすくなります。
![](https://assets.st-note.com/img/1696492924934-9T3Kaf97Sa.png?width=800)
![](https://assets.st-note.com/img/1696493379491-qlwDn6ANi3.png?width=800)
version: "3.8"
services:
mysqldb:
container_name: mysqldb
image: mysql
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: employee_db
networks:
springboot-mysql-net:
springboot-restful-webservices:
container_name: springboot-restful-webservices
build:
context: ./
dockerfile: Dockerfile
ports:
- "8080:8080"
depends_on:
- mysqldb
networks:
springboot-mysql-net:
restart: on-failure
networks:
springboot-mysql-net:
version: "3.8": Docker Composeファイルのバージョンを指定します。
services: 複数のサービスを定義します。
mysqldb: MySQLデータベースサービスを定義します。
container_name: コンテナの名前を指定します。
image: 使用するイメージを指定します。ここでは公式のMySQLイメージを使用しています。
environment: 環境変数を設定します。ここではMySQLルートユーザーのパスワードとデータベース名を設定しています。
networks: サービスが属するネットワークを指定します。
springboot-restful-webservices: Spring Boot Webサービスを定義します。
container_name: コンテナの名前を指定します。
build: Dockerfileを使用してイメージをビルドします。
ports: ホストとコンテナ間のポートマッピングを設定します。
depends_on: 他のサービスに依存していることを指定します。ここではmysqldbに依存しています。
networks: サービスが属するネットワークを指定します。
restart: コンテナの再起動ポリシーを設定します。
networks: 使用するネットワークを定義します。
springboot-mysql-net: サービスが属するネットワークです。
![](https://assets.st-note.com/img/1696495514765-Qu7UKZtXb1.png?width=800)
![](https://assets.st-note.com/img/1696495555766-5hdknFES89.png?width=800)
![](https://assets.st-note.com/img/1696495952242-LZHJLdAj5r.png?width=800)
![](https://assets.st-note.com/img/1696495959448-Yq2aZxqSKD.png?width=800)
![](https://assets.st-note.com/img/1696495972302-BmxnDC8oPh.png?width=800)
5.最後に
DockerのCLIとComposeを通じて、MySQLとSpringbootアプリを実行してみますた。今日、使ったコマンドをまとめてみました。
# Docker CLI コマンド
docker pull イメージ名:タグ # イメージのダウンロード
docker run [オプション] イメージ名:タグ # コンテナの実行
docker ps # 実行中のコンテナのリスト表示
docker ps -a # 停止したコンテナのリスト表示
docker exec [オプション] コンテナ名 コマンド # コンテナ内でコマンドを実行
docker build [オプション] パス # イメージのビルド
docker logs [オプション] コンテナ名 # ログの表示
docker rm [オプション] コンテナ名 # コンテナの削除
# Docker Compose コマンド
docker-compose up # Docker Composeアプリケーションの実行
docker-compose up -d # バックグラウンドでアプリケーションを実行
docker-compose ps # コンテナおよびネットワークの確認
docker-compose down # アプリケーションの停止
docker-compose logs [サービス名] # ログの確認
docker-compose up --build # ビルドおよび実行
docker-compose up [サービス名] # 特定のサービスだけを実行
docker-compose config # Docker Composeファイルの構文の確認
上記のコマンドでイメージのビルド、イメージのPULL、イメージをコンテナで実行までしますた。CLI は迅速な開発およびテストシナリオで素早く使用できます。Compose は複雑なアプリケーションを効果的に管理するのに役立ちます。いろいろ目的にあたって使いましょう!
エンジニアファーストの会社 株式会社CRE-CO
ソンさん
【参考】
[Udemy] Building Microservices with Spring Boot & Spring Cloud
この記事が気に入ったらサポートをしてみませんか?