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の設定についてお詳しい方がいましたらご回答いただけないでしょうか?
よろしくお願いいたします。
あなたの回答
tips
プレビュー