Dokcer PostgreSQL 실행 오류

Mixer·2024년 4월 26일
0

Docker Images

REPOSITORY TAG IMAGE ID CREATED SIZE
backend latest aa743c2294b7 2 hours ago 1.04GB
postgres latest cb65f77993aa 2 months ago 453MB

docker network ls

NETWORK ID NAME DRIVER SCOPE
e9f492b29d80 bridge bridge local
59d8bed54ca2 host host local
20ff8ae63c98 none null local
1d86eb583a13 sniff-step bridge local < 이걸 사용중

docker run -it --rm --name postgres -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres

docker run -d --restart=always --name backend --network sniff-step backend

docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
name backend "java -jar Sniff-Ste…" About an hour ago Restarting (1) 21 seconds ago backend
name postgres "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:5432->5432/tcp postgres

docker logs -f backend

아래의 해당 오류가 발생했다

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource 

Caused by: jakarta.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is 

org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution [Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.] [n/a]


Caused by: 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.


Caused by: java.net.ConnectException: Connection refused
~중략~
	... 64 common frames omitted

해당 에러 메시지에 대한 챗GPT의 의견은

원인

  • 데이터베이스 서버 접속 거부: 애플리케이션이 localhost:5432 주소의 PostgreSQL 데이터베이스에 연결하려고 시도했지만, 접속이 거부되었습니다. 이는 일반적으로 데이터베이스 서버가 실행되지 않거나, 네트워크 설정이 올바르지 않을 때 발생합니다.
  • TCP/IP 연결 설정 문제: PostgreSQL 서버 설정에서 TCP/IP 연결을 허용하지 않거나 잘못 구성되어 있을 수 있습니다.

현재 문제는 두 컨테이너 사이에서 데이터베이스 서버로 접속이 거부
그때문인지 계속 backend 컨테이너가 꺼져버리는 현상이 생긴다.

처음엔 네트워크를 연결시켜서 로컬에서 서버를 올리듯이 DB 컨테이너와 Backend 컨테이너가 연결되어 실행이 될거라고 생각했다.

챗GPT에게 질문

도커 컨테이너가 네트워크끼리 연결되어있으면 localhost:3000에서 curl로 localhost:4000에 리퀘스트를 보낼 수 있지않아?

답변
ChatGPT
Docker 컨테이너들이 같은 네트워크 내에 있을 때, 컨테이너간 통신을 하기 위해 각각의 localhost 주소를 사용하는 것은 작동하지 않습니다. localhost는 각 컨테이너의 내부 네트워크 환경을 가리키기 때문에, 컨테이너 A의 localhost는 그 컨테이너 자체를 의미하고, 컨테이너 B의 localhost도 마찬가지로 그 컨테이너 자체를 가리킵니다.
따라서, 컨테이너 A에서 컨테이너 B로 요청을 보내려면 다음과 같은 방법을 사용해야 합니다:
Docker 네트워크 사용: Docker 네트워크를 사용하면 컨테이너들이 서로의 이름으로 통신할 수 있습니다. 예를 들어, 컨테이너의 이름이 containerB라면, 컨테이너 A에서 curl http://containerB:4000과 같은 명령으로 컨테이너 B에 접근할 수 있습니다.
포트 포워딩 설정: Docker에서는 컨테이너의 포트를 호스트의 포트에 매핑할 수 있습니다. 만약 컨테이너 B의 4000 포트를 호스트의 4000 포트에 연결했다면, 컨테이너 A에서는 호스트의 IP 주소를 사용하여 curl http://host-ip:4000 형태로 컨테이너 B에 접근할 수 있습니다.
호스트 네트워크 사용: Docker 컨테이너를 호스트 네트워크 모드로 설정하면, 컨테이너가 호스트의 네트워크 환경을 직접 사용하게 됩니다. 이 설정을 사용하면, 컨테이너 내부에서 localhost를 사용하여 호스트 시스템의 서비스에 접근할 수 있지만, 보통은 컨테이너간 격리를 위해 사용하지 않는 것이 일반적입니다.
따라서, 여러분의 Docker 설정에 따라 적절한 방법을 선택하여 컨테이너 간에 통신할 수 있습니다.

아직 정확하게는 모르겠지만
backend 컨테이너의 포트는 localhost:8081
postgresql 컨테이너의 포트는 postgres:5432
로 구성되어있다는 대답을 한거같다

그래서 docker network를 사용하면
컨테이너들의 서로의 이름:port로 통신을 할수있다는것이다

Container Backend 
curl http://postgres:5432

와 같은 명령어로 컨테이너 postgres에 접근이 가능하다는 점

그래서

application.properties 파일에

# Spring Datasource and JPA settings
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.default_batch_fetch_size=100
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:postgresql://postgres:5432/postgres

으로 바꾸어주면 내가 도커에서 jsp와 db를 연결시킬수있다

또한 build run 컨테이너 이미지를 만드는 순서도
postgres를 우선으로 만드는게 중요하다

docker run \
--name postgres \
--network sniff-step \
-e POSTGRES_USER=username \
-e POSTGRES_DB=postgres \
-e POSTGRES_PASSWORD=password \
-d postgres

조금 어려우니 네트워크 관련된 지식과 도커 네트워크에 대한 이론을 조금 더 찾아보고
해당 글에 보충글을 작성해야겠다.

profile
Minthug'life

0개의 댓글