web-dev-qa-db-ja.com

Docker Compose + Spring Boot + Postgres接続

Java Postgresデータベースで動作するSpring Bootアプリがあります。両方にDockerを使用したいです。最初はDockerにPostgresのみを配置し、docker-compose.ymlファイルは次のように定義されています。

version: '2'
services:
    db:
        container_name: sample_db
        image: postgres:9.5
        volumes:
            - sample_db:/var/lib/postgresql/data
        environment:
            - POSTGRES_PASSWORD=sample
            - POSTGRES_USER=sample
            - POSTGRES_DB=sample
            - PGDATA=/var/lib/postgresql/data/pgdata
        ports:
            - 5432:5432

volumes:
    sample_db: {}

その後、コマンドを発行したときにSudo dockerdおよびSudo docker-compose -f docker-compose.yml up、データベースを起動していました。たとえば、pgAdminをサーバーおよびポートとして使用することにより、localhostを使用して接続できます5432。次に、Spring Bootアプリのapplication.properties file次のプロパティを定義しました。

spring.datasource.url=jdbc:postgresql://localhost:5432/sample
spring.datasource.username=sample
spring.datasource.password=sample
spring.jpa.generate-ddl=true

この時点で、Spring Suiteを介してローカルでSpring Bootアプリを実行できましたが、すべて正常に機能していました。次に、Spring BootアプリもDockerイメージとして追加したいと考えました。私はまず、プロジェクトディレクトリに次のようなDockerfileを作成しました。

FROM Java:8
EXPOSE 8080
ADD /target/manager.jar manager.jar
ENTRYPOINT ["Java","-jar","manager.jar"]

次に、発行されたプロジェクトのディレクトリにmvn clean に続く mvn install。次に、docker build -f Dockerfile -t manager . に続く docker tag 9c6b1e3f1d5e myuser/manager:latest(IDは正しい)。最後に、既存のdocker-compose.ymlファイルは次のようになります。

version: '2'
services:
    web:
      image: myuser/manager:latest
      ports: 
          - 8080:8080
      depends_on:
          - db
    db:
        container_name: sample_db
        image: postgres:9.5
        volumes:
            - sample_db:/var/lib/postgresql/data
        environment:
            - POSTGRES_PASSWORD=sample
            - POSTGRES_USER=sample
            - POSTGRES_DB=sample
            - PGDATA=/var/lib/postgresql/data/pgdata
        ports:
            - 5432:5432

volumes:
    sample_db: {}

しかし、今、Sudo docker-compose -f docker-compose.yml upコマンドを実行すると、データベースは再び正しく起動しますが、Webアプリパーツのエラーと終了コード1が表示されます。問題は接続文字列です。私はそれを何か別のものに変更しなければならないと信じていますが、それがどうあるべきか分かりません。次のエラーメッセージが表示されます。

web_1  | 2017-06-27 22:11:54.418 ERROR 1 --- [           main] o.a.Tomcat.jdbc.pool.ConnectionPool      : Unable to create initial connections of pool.
web_1  | 
web_1  | org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections

何か案は?

11
typos

各コンテナには、独自のローカルホストを持つ独自のネットワークインターフェイスがあります。だから、JavaがPostgresを指すように変更する:

spring.datasource.url=jdbc:postgresql://localhost:5432/sample

に:

spring.datasource.url=jdbc:postgresql://db:5432/sample

dbは適切なPostgres IPに解決されます。


ボーナス。 docker-composeを使用すると、手動でイメージを作成する必要はありません。だから変更:

web:
  image: myuser/manager:latest

に:

web:
  build: .
18
Robert