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

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

ただいまの
回答率

87.61%

Docker上でSpring Boot, MyBatisでコネクションが取得できない

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,309

score 6

 前提・実現したいこと

JavaでWebシステムを開発しようとしています。
今後の開発開始に使えるよう、認証機能までを持ったブランクプロジェクトを作って置きたいと考えています。

構成

  • Docker
  • compose
  • JDK8+Maven Dockerイメージ
  • Spring Boot, MyBatis, Thymeleaf, Log4J2
  • MySQL公式Dockerイメージ
  • PHPMyAdmin 公式Dockerイメージ

 発生している問題・エラーメッセージ

Unable to create initial connections of pool.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

WebアプリからDBへのコネクション取得に失敗しています。
PHPMyAdminからはDBへアクセスできているので、Docker composeの誤記は考えにくいです。

 該当のソースコード

version: '3'
services:
  db:
    image: mysql:5.7.21
    hostname: dbserver
    ports:
      - "3306:3306"
    volumes:
      - ./db_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_USER=root
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=myproject_db

  app:
    image: jamesdbloom/docker-java8-maven
    ports:
      - "8080:8080"
    volumes:
      - .:/app
    working_dir: /app
    links:
      - db
    command: ./mvnw spring-boot:run

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - "8888:80"
    volumes:
      - "./phpmyadmin/sessions:/sessions"
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - db
# DatSource
# ----------------------------------------
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://dbserver:3306/myproject_db
spring.datasource.username=root
spring.datasource.password=root
@Mapper
public interface UserMapper {
    // アカウントを登録する
    public int insert(User user);
    // アカウント情報を更新する
    public int updateByUid(Integer uid, User user);
    // アカウントを論理削除する
    public int deleteLogicallyByUid(Integer uid, Integer delFlag);
    // アカウントを検索する
    public List<User> findAll();
    public User searchByUid(Integer uid);
    public User searchByEmail(String emailAddress);
    public int isExists(User user);
}

 試したこと

設定ファイルの形式を変えてみたり、ネットで検索して見つけた方法を試してみました。

混乱しているのが、
ネットではH2などの組み込み系DBで構築する方法であったり、Springの設定方法とSpring Bootの設定方法(自動設定もできる)、SpringのDBアクセスの書き方でJDBC Template, JPA, MyBatisなど組み合わせが多く、参考にできる構成が見つからないというのがあります。

知見のある方にぜひご指導いただきたいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

まず原因の特定のためにも
物理的(というか仮想的?)にdbサーバとapサーバが繋がるか確認したほうがいいかと思います。

  • apサーバからdbサーバのIP指定で繋がるか。
  • apサーバからdbサーバのhostnameで繋がるか。

Spring-db間ではなく、先にサーバ間の通信ができているか。

ネットで参考文献を探したり、設定ファイルを見直す前に、
各コンテナを立ち上げた状況を把握されたほうが、
解決が早いと思います。

ボクはあまり詳しくないですが、docker networkコマンドで色々確認できます。

タグにdockerを追加したほうがいいかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/01 19:34

    docker network ls でbridgeは設定されているので、コンテナ間のネットワークは繋がっているようです。

    キャンセル

  • 2018/04/02 11:26

    >コンテナ間のネットワークは繋がっているようです。
    と言われると、
     「繋がるはずです」
    としか言いようがないのですが、、、

    例えば、
    ・双方向で両サーバからpingが通る
    ・dbサーバからcurlでapサーバのapacheに繋がる
    など、具体的な確認をしたほうが、解決するのが早いです。

    キャンセル

0

コンテナ間での通信という内容でしょうか?読み間違いや勘違いがあったらすみません。

docker composeのlinksで特定文字列をコンテナ内のホスト名として扱うことができますので、docker composeに該当箇所のlinksと開放するポートのportsを書くのが良いのではないでしょうか。
ただ上記の方が回答されているように、物理的に通信が阻害されてるかどうかの検討が必要ですので、例えばVirtualBoxなどであればポートフォワードができてるかどうかでしょうか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る