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
何か案は?
各コンテナには、独自のローカルホストを持つ独自のネットワークインターフェイスがあります。だから、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: .