Computer Science

[Docker] 도커로 Postgresql 실행하기

마볼링 2024. 5. 11. 16:53

 

1. 도커 설치

도커 공식 문서 사이트를 통해서 도커를 설치할 수 있다.

https://docs.docker.com/get-docker/

 

Get Docker

Download and install Docker on the platform of your choice, including Mac, Linux, or Windows.

docs.docker.com

 

설치 후 회원가입까지 진행하면 아래와 같이 Docker Desktop이 실행된다.

 

 

2. Postgres Image Pull

도커 이미지란 도커 컨테이너를 실행하는 데 필요한 모든 것을 포함하는 환경을 말한다.

 

이러한 도커 이미지는 Docker hub라는 이미지 레지스토리에 저장되어 필요할 때 다운로드하여 사용할 수 있다.

 

그러한 다운로드를 "pull" 이라고 한다.

 

 

도커 pull의 기본 명령어

docker pull 이미지이름:태그

 

태그는 이미지의 특정 버전을 가리키며, 생락하면 기본적으로 latest 태그가 사용된다.

 

 

https://hub.docker.com/_/postgres

 

postgres - Official Image | Docker Hub

Note: the description for this image is longer than the Hub length limit of 25000, so has been trimmed. The full description can be found at https://github.com/docker-library/docs/tree/master/postgres/README.md. See also docker/hub-feedback#238 and docker/

hub.docker.com

 

docker pull postgres

 

 

pull한 이미지는 docker images 라는 명령어로 확인 할 수 있다.

 

docker images

 

 

3. Postgres Container run

도커 컨테이너는 이미지로부터 생성된 독립적으로 격리된 환경에서 애플리케이션을 실행하는 가상화된 프로세스다.

컨테이너는 호스트 시스템의 리소스를 공유하지만 다른 컨테이너와는 격리되어 있다.

 

이러한 컨테이너는 run이라는 명령어를 통해 생성하고 실행할 수 있다.

 

도커 run의 기본 명령어

docker run [옵션] 이미지이름 [명령어]
  • 옵션 : 컨테이너 실행 시의 이름, 포트 매핑 등의 컨테이너 설정
  • 명령어 : 컨테이너 내에서 실행할 명령어

 

postgres 명령어

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres

 

 

실행 후 생성된 컨테이너는 docker ps를 통해 확인 할 수 있다.

docker ps

 

 

 

4. Postgres 설정

postgres 컨테이너를 위의 기본 명령어로만 생성시 여러가지 문제가 존재한다.

  • 접속 포트
  • 컨테이너 생성 후 스키마, 테이블, 데이터 등 직접 생성
  • 컨테이너 삭제 시 저장된 데이터 삭제
  • 시간대 불일치(기본값 : Etc/UTC)

이러한 문제를 해결하기 위해 run [옵션]을 설정해줘야한다.

 

docker run -d \
    --name some-postgres \
    -e POSTGRES_PASSWORD=mysecretpassword \
    -e TZ=Asia/Seoul \
    -v ./data:/var/lib/postgresql/data \
    -v ./init.sql:/docker-entrypoint-initdb.d/init.sql \
    -p 5432:5432 \
    postgres
  • docker run -d : Docker 컨테이너를 백그라운드에서 실행
  • --name some-postgres : 컨테이너 이름 지정
  • -e POSTGRES_PASSWORD=mysecretpassword : 컨테이너 내의 환경 변수 설정 (데이터 베이스 관리자 패스워드)
  • -e TZ=Asiz/Seoul : 컨테이너 시간대 설정
  • -v ./data:/var/lib/postgresql/data : 호스트의 디렉토리와 컨테이너 디렉토리 공유. 데이터 영속적으로 저장
  • -v ./init.sql:/docker-entrypoint-initdb.d/init.sql : 컨테이너 생성시 sql 실행
  • -p 5432:5432 : 로컬 호스트 포트와 컨테이너 포트 연결 (포트포워딩)

포트포워딩 참고 (생활코딩)

 

 

5. Postgres 접속

생성된 컨테이너는 docker exec 라는 명령어를 통해 접속할 수 있다.

 

docker exec -it some-postgres bash
  • docker exec : Docker 컨테이너 내에서 특정한 명령어 사용
  • -i : interactive / 표준입출력을 통해 상호작용(키보드)
  • -t : 가상 tty를 통해 접속. 컨테이너 내에서 명령어를 실행하는 동안 터미널과 유사한 환경
  • bash : 명령어 실행. 컨테이너 내에서 bash 셀 실행
    • 아래는 바로 psql -U postgres 를 실행해서 psql 접속

 

5. Docker compose

위의 run [옵션]으로 대부분의 문제는 해결했지만,

 

컨테이너가 여러개일 경우 각각의 컨테이너를 관리하기 불편하다.

 

이러한 문제는 도커 컴포즈를 통해 하나로 묶어서 해결할 수 있다.

 

 

Mac 사용자라면 brew를 이용해 간편하게 docker-compose를 설치할 수 있다.

brew install docker-compose

 

 

docker-compose.yml 작성

version: '3'

services:
  some-postgres:
    image: postgres
    container_name: some-postgres
    environment:
      POSTGRES_PASSWORD: mysecretpassword
      TZ: Asia/Seoul
    volumes:
      - ./data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "5432:5432"

 

 

작성된 yml을 up 명령어를 이용하여 실행할 수 있다.

docker-compose up -d

 

 

WARN 'version' is obsolete  -> docker-compose 버전 2.25부터는 yml 파일에 version을 적을 필요가 없어서 생기는 경고.

 

 

도커 컴포즈로 실행중인 컨테이너를 종료하는 명령어는 stop과 down이 있다.

  • stop : 실행중인 컨테이너 종료 
  • down : 실행중인 컨테이너 종료 후 삭제