Spring Boot 2.1.x の Web アプリを 2.2.x へバージョンアップする ( その14 )( Docker で複数の Tomcat を起動して動作確認する )
概要
記事一覧はこちらです。
- 今回の手順で確認できるのは以下の内容です。
- jar ファイルを作成して動作確認します。
- Tomcat の起動はサービスからではなく docker-compose.app.yml を使用して行います。
- docker-compose.app.yml から起動するコンテナの docker image は最新版にバージョンアップします。
参照したサイト・書籍
目次
手順
docker-compose.app.yml で起動するコンテナの docker image をバージョンアップする
docker-compose up -d
コマンドを実行した後、build タスクを実行して jar ファイルを作成します。
docker-compose.app.yml の以下の点を変更します。
services: app: build: context: . dockerfile: docker/app/Dockerfile image: ksbysample-webapp-lending volumes: - ./build/libs/ksbysample-webapp-lending-2.2.2-RELEASE.jar:/app.jar - ./docker/app/docker-entrypoint.sh:/usr/local/bin/docker-entrypoint.sh environment: - SPRING_DATASOURCE_HIKARI_JDBC_URL=jdbc:postgresql://postgresql/ksbylending - SPRING_MAIL_HOST=mail-server - SPRING_RABBITMQ_HOST=haproxy deploy: mode: replicated replicas: 3 # entrypoint: /bin/sh # stdin_open: true # tty: true haproxy-app: image: haproxy:2.1.2-alpine container_name: haproxy-app volumes: - ./docker/app/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro ports: - "8080:8080" depends_on: - app haproxy-app-rsyslog: image: rafpe/docker-haproxy-rsyslog:latest container_name: haproxy-app-rsyslog volumes: - ./docker/app/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro depends_on: - haproxy-app
- app コンテナの記述で
- ./build/libs/ksbysample-webapp-lending-2.1.3-RELEASE.jar:/app.jar
→- ./build/libs/ksbysample-webapp-lending-2.2.2-RELEASE.jar:/app.jar
に変更します。 - haproxy-app コンテナの記述で
image: haproxy:1.8.14-alpine
→image: haproxy:2.1.2-alpine
に変更します。 - haproxy-app-rsyslog コンテナの記述で
image: rafpe/docker-haproxy-rsyslog
→image: rafpe/docker-haproxy-rsyslog:latest
に変更します。
docker/app/Dockerfile の以下の点を変更します。
FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine-slim RUN apk add --no-cache tzdata ENV TZ="Asia/Tokyo" ENV LANG="ja_JP.UTF-8" VOLUME /tmp EXPOSE 8080 ENTRYPOINT ["docker-entrypoint.sh"]
FROM adoptopenjdk/openjdk11:jdk-11.0.2.9-alpine-slim
→FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine-slim
に変更します。
IntelliJ IDEA の Service Tool Window から docker の ksbysample-webapp-lending:latest の image を削除した後、docker-compose -f docker-compose.app.yml --compatibility build --no-cache
コマンドを実行して image を作り直します。。。が、docker/prometheus/storage の下のファイルを参照できず PermissionError が発生しました。
プロジェクトのルートディレクトリ直下に .dockerignore ファイルを作成して以下の内容を記述し、build 時に参照しないようにします。
docker/prometheus/storage/*
再度 docker-compose -f docker-compose.app.yml --compatibility build --no-cache
コマンドを実行すると、今度は成功しました。
IntelliJ IDEA の Service Tool Window から不要になった以下の docker image を削除します。
- adoptopenjdk/openjdk11:jdk-11.0.2.9-alpine-slim
Docker で複数の Tomcat を起動して動作確認する
docker-compose -f docker-compose.app.yml --compatibility up -d
、docker-compose -f docker-compose.mail.yml up -d
コマンドを実行します。
http://localhost:8080/haproxy?stats にアクセスして全てのインスタンスが緑色になるまで待ちます。。。が、いつまで経っても緑色になりませんでした。
IntelliJ IDEA の Service Tool Window で app コンテナを見ると ... org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'server.tomcat.basedir' to java.io.File
エラーメッセージが出て落ちていました。
Docker で起動する時は product profile で起動しており、server.tomcat.basedir
は application-product.properties では以下のように定義しています。起動しなくて当然でした。以前はよくこれで起動していましたね。。。
server.tomcat.basedir=D:/webapps/ksbysample-webapp-lending logging.file.name=${server.tomcat.basedir}/logs/ksbysample-webapp-lending.log spring.autoconfigure.exclude=com.integralblue.log4jdbc.spring.Log4jdbcAutoConfiguration valueshelper.classpath.prefix=BOOT-INF.classes.
docker-compose -f docker-compose.app.yml --compatibility down
コマンドを実行して app コンテナを終了させた後、docker/app/docker-entrypoint.sh の以下の点を変更します。
#!/bin/sh # 改行コードを LF にすること。LF でないと実行されない。 export JAVA_OPTS="-Xms1024m -Xmx1024m -XX:MaxMetaspaceSize=384m" exec java $JAVA_OPTS \ -Djava.security.egd=file:/dev/./urandom \ -Dspring.profiles.active=product \ -Dserver.tomcat.basedir=/ \ -Dlogging.appender=CONSOLE \ -jar /app.jar
-Dserver.tomcat.basedir=/ \
を追加します。
再び docker-compose -f docker-compose.app.yml --compatibility up -d
コマンドを実行した後、http://localhost:8080/haproxy?stats にアクセスして全てのインスタンスが緑色になるまで待つと今度は緑色になりました。
以下の手順で動作確認します ( 画面キャプチャは省略します )。
- ブラウザを起動して http://localhost:8080/ にアクセスしてログイン画面を表示します。tanaka.taro@sample.com / taro でログインします。
- 検索対象図書館登録画面が表示されます。"東京都" で検索した後、一覧表示されている図書館から「国立国会図書館東京本館」を選択します。
- ログアウトします。
- ログイン画面に戻るので suzuki.hanako@test.co.jp / hanako でログインします。
- 貸出希望書籍 CSV ファイルアップロード画面が表示されます。以下の内容が記述された CSV ファイルをアップロードします。
"ISBN","書名"
"978-4-7741-6366-6","GitHub実践入門"
"978-4-7741-5377-3","JUnit実践入門"
"978-4-7973-8014-9","Java最強リファレンス"
"978-4-7973-4778-4","アジャイルソフトウェア開発の奥義"
"978-4-87311-704-1","Javaによる関数型プログラミング" - 「貸出状況を確認しました」のメールが送信されるので、メールに記述されている URL にアクセスします。
- 貸出申請画面が表示されます。3冊程「申請する」を選択して申請します。
- ログアウトします。
- 「貸出申請がありました」のメールが送信されるので、メールに記述されている URL にアクセスします。ログイン画面が表示されるので、tanaka.taro@sample.com / taro でログインします。
- 貸出承認画面が表示されます。「承認」あるいは「却下」を選択して確定させます。
- ログアウトします。
- 「貸出申請が承認・却下されました」のメールが送信されるので、メールに記述されている URL にアクセスします。ログイン画面が表示されるので、suzuki.hanako@test.co.jp / hanako でログインします。
- 貸出申請結果確認画面が表示されるので内容を確認します。
動作確認は特に問題ありませんでした。
docker-compose -f docker-compose.app.yml --compatibility down
、docker-compose -f docker-compose.mail.yml down
、docker-compose down
コマンドを実行してコンテナを停止します。
履歴
2020/01/13
初版発行。