본문 바로가기

Docker

[Docker] Docker PostgreSQL 설치 및 실행

스프링 부트를 사용한 예제 애플리케이션을 AWS를 통해 모노리식에서 MSA로 MSA에서 다시 컨테이너 오케스트레이션으로 개선해나가는 과정을 모두 담은 강의를 출시하게 되었습니다.
강의 과정에서 15개 이상의 서비스를 사용하게 됩니다.
그래서 클라우드 개발자가 아닌 개발자, 학생 분들도 AWS의 폭넓은 지식 쉽고 빠르게 습득할 수 있는 기회가 될 수 있다고 생각합니다!
배너를 누르면 강의로 이동됩니다.

블로그를 통해 구매하시는 분들에게만 10%할인 쿠폰을 증정중입니다.
꼭 아래 쿠폰번호를 입력해 주세요!

16861-259843d6c2d7


 

환경

mac - monterey 12.0.1

postgres - 14.1

spring boot - 2.5.2

docker - 20.10.10

 

PostgreSQL Image 설치 및 실행

먼저 DockerHub 에서 Postgres 버전을 확인해 주고 아래 명령어를 실행해 주면 Postgres Container 를 실행 (없다면 설치까지) 할 수 있다.

docker run -it --rm --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres
  • 명령어 설명 (Docker 명령어)
    • -it : 컨테이너가 실행 후 터미널 명령어를 입력하기 위해 사용 (-i 와 -t 옵션을 같이 사용하는 것)
    • --rm : postgres 프로세스가 종료되면 container도 같이 종료
    • --name postgres-test : postgres container 의 이름을 postgres-test 로 지정하여 실행
    • -e POSTGRES_PASSWORD=password : postgres의 환경변수로 외부에서 접속할 때 필요한 비밀번호를 설정해줘야함
    • -p 5432:5432 : 호스트와 container 의 5432번 포트를 포트포워딩
    • -d : container를 백그라운드에서 실행
    • postgres : postgres image 를 실행, [:tag] 를 입력하지 않으면 :latest 버전으로 실행된다.

 

docker: Error response from daemon: driver failed programming external connectivity on endpoint angry_lamport (fc753990860795dc21dc196c2cc2f144c1189198a4c337bfeb5f8a2736556f2e): Bind for 0.0.0.0:5432 failed: port is already allocated.

* 만약 기존에 5432포트(또는 본인이 지정한 host포트)가 사용중이라면 위와 같은 에러 메세지가 나게되니 다른 포트를 사용하거나 해당 포트를 사용하는 프로세스를 종료하고 다시 실행해주면 된다.

 

docker container ls

설치가 되면 위 명령어를 통해 container 가 실행된 것을 확인할 수 있다.

postgres container가 실행되고 있다

또는 실행된 로그를 확인하고 싶다면 아래의 명령어를 통해 확인할 수 있다.

docker logs [container id or name]

postgres Container의 실행에 있어 필요로 했던 로그들

 

Postgres Container 터미널에 접속

$docker exec -it postgres-test bash

마지막에 bash 명령어의 입력으로  container shell에 접속이 된다.

계정은 'root' 호스트이름은 container의 id로 설정되어있다.

container의 shell 에서 postgres 접속

그리고 psql 명령어로 postgres에 접속 및 데이터베이스 생성 등 작업이 가능하다.

inteliJ Ide를 통해 database 연결 확인

IntelliJ IDE를 통해 테스트 연결까지 확인이 되었다.

 

* Container 를 삭제하게되면 Container 내부에 있는 데이터(postgres 계정, 테이블, 디비 등)도 모두 삭제되므로 유지되어야 할 데이터는 Container 내부가 아닌 외부에 저장하도록 해야한다.