質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

0回答

1958閲覧

docker-composeでMariaDBのvolumesが存在しないとDB接続に失敗する

Linkey

総合スコア77

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2022/01/05 15:51

Dockerの勉強をしているものです。
docker-composeを使ってmariadbとSpring Bootアプリケーションのコンテナを起動してSpring Bootアプリからmariadbへの接続確認を
行おうとしています。しかしdocker-compose upコマンドを実行した後にSpring Bootコンテナにアクセスしログを確認したところ
以下のようなmariadbへの接続のログが出力されてしまいました。

Caused by: java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=db)(port=3306)(type=master) : Socket fail to connect to host:db, port:3306. Connection refused at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:73) at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:197) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1394) at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:635) at org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:150) at org.mariadb.jdbc.Driver.connect(Driver.java:89) at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:181) at org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl.getIsolatedConnection(DdlTransactionIsolatorNonJtaImpl.java:44) ... 77 more Caused by: java.sql.SQLNonTransientConnectionException: Socket fail to connect to host:db, port:3306. Connection refused at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:73) at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:188) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.createSocket(AbstractConnectProtocol.java:257) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.createConnection(AbstractConnectProtocol.java:521) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1389) ... 90 more Caused by: java.net.ConnectException: Connection refused at java.base/sun.nio.ch.Net.pollConnect(Native Method) at java.base/sun.nio.ch.Net.pollConnectNow(Unknown Source) at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(Unknown Source) at java.base/sun.nio.ch.NioSocketImpl.connect(Unknown Source) at java.base/java.net.SocksSocketImpl.connect(Unknown Source) at java.base/java.net.Socket.connect(Unknown Source) at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.createSocket(AbstractConnectProtocol.java:252) ... 92 more 05-Jan-2022 15:27:46.012 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/sample2.war] has finished in [7,217] ms 05-Jan-2022 15:27:46.015 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] 05-Jan-2022 15:27:46.028 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [7272] milliseconds

実施した手順は以下です。
①docker-compose.yamlファイルを作成する

yaml

1version: "3" 2services: 3 db: 4 image: mariadb:10.2 5 container_name: samplemariadb 6 restart: always 7 command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 8 environment: 9 MYSQL_ROOT_PASSWORD: root 10 MYSQL_USER: hogeuser 11 MYSQL_PASSWORD: password 12 MYSQL_DATABASE: test 13 ports: 14 - "3306:3306" 15 healthcheck: 16 test: mysqladmin ping -h 127.0.0.1 -u$$MYSQL_USER -p$$MYSQL_PASSWORD 17 volumes: 18 - ./docker/tmp/mysql:/var/lib/mysql 19 - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d 20 expose: 21 - "3306" 22 - "3307" 23 networks: 24 - app-net 25 26 java-sample: 27 image: (Dockerユーザ名)/springboot-sample2:v1 28 container_name: java-app2-container 29 ports: 30 - 8080:8080 31 depends_on: 32 - db 33 env_file: 34 - db-config.env 35 environment: 36 APP_PORT: 8080 37 tty: true 38 networks: 39 - app-net 40volumes: 41 data: 42 driver: local 43networks: 44 app-net: 45 driver: bridge

②db-config.envファイルを作成する
db-config.env

JDBC_NAME=mariadb DB_HOST=db DB_PORT=3306 DB_NAME=test USER_NAME=hogeuser USER_PASWORD=password DB_DRIVER_CLASS=org.mariadb.jdbc.Driver DB_DIALECT=org.hibernate.dialect.MariaDBDialect

③以下のコマンドを実行する(この時docker-compose.yamlのdbのvolumesに記載したディレクトリは存在していません)

docker-compose up -d

④Spring BootアプリのコンテナIDを確認する

>docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES adf8460c16d0 (Dockerユーザ名)/springboot-sample2:v1 "sh /usr/local/tomca…" 7 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp java-app2-container d0167b5ecaeb mariadb:10.2 "docker-entrypoint.s…" 7 seconds ago Up 5 seconds (health: starting) 0.0.0.0:3306->3306/tcp, 3307/tcp samplemariadb

⑤Spring Bootアプリのコンテナにアクセスする

docker exec -i -t adf8460c16d0 /bin/bash

⑥Tomcatログを確認するとMariaBDへの接続失敗が出力されている

root@adf8460c16d0:/usr/local/tomcat# vi /usr/local/tomcat/logs/catalina.2022-01-05.log Caused by: java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=db)(port=3306)(type=master) : Socket fail to connect to host:db, port:3306. Connection refused Caused by: java.sql.SQLNonTransientConnectionException: Socket fail to connect to host:db, port:3306. Connection refused Caused by: java.net.ConnectException: Connection refused

docker-compose.yamlのdbのvolumesに記載されたディレクトリが作成された状態で以下のコマンドでSpring Bootアプリのコンテナを再起動しました。

docker restart adf8460c16d0

再起動かけた後にもう一度Spring BootアプリのコンテナにアクセスしてTomcatログを確認したところ、MariaDBアクセス失敗のログは
出力されなくなり、curlコマンドでDBアクセスするAPIを実行したところDBの検索結果を取得することができました。
コンテナ再起動後のTomcatログ

05-Jan-2022 15:39:36.634 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1f 31 Mar 2020] 05-Jan-2022 15:39:36.947 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"] 05-Jan-2022 15:39:36.979 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [492] milliseconds 05-Jan-2022 15:39:37.018 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina] 05-Jan-2022 15:39:37.018 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/9.0.56] 05-Jan-2022 15:39:37.030 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/sample2.war] 05-Jan-2022 15:39:38.652 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 05-Jan-2022 15:39:42.795 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/sample2.war] has finished in [5,763] ms 05-Jan-2022 15:39:42.798 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] 05-Jan-2022 15:39:42.805 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [5825] milliseconds

docker-compose upコマンドでDBのコンテナを起動する場合、dbのvolumesに記載したディレクトリは事前に作成しないとうまく動かないのでしょうか?
もし、事前にディレクトリを作成する必要がない場合、docker-compose.yamlをどのように修正すれば初回でDB接続エラーが発生されなくなるのでしょうか?
docker-compose volumesというキーワードでいろいろと調べているのですが、ヒントとなる情報は見つかりませんでした。
docker-composeの設定についてお詳しい方がいましたらご回答いただけないでしょうか?
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問