데이터베이스를 컨테이너로 실행하는 이유
전통적인 방식에서는 운영체제에 PostgreSQL을 직접 설치하고 설정해야 한다.
이 방식은 환경 차이로 인한 문제를 만들기 쉽고, 삭제나 재설치도 번거롭다.
반면 Docker를 사용하면 다음과 같은 장점이 있다.
- 로컬 환경을 더럽히지 않고 DB 실행 가능
- 동일한 설정을 가진 DB 환경을 즉시 재현 가능
- 필요 시 컨테이너 단위로 삭제 및 재생성 가능
DB를 직접 Dockerfile로 빌드할 수도 있지만,
별도의 커스터마이징이 필요 없다면 공식 이미지를 그대로 사용하는 것이 가장 효율적이다.
PostgreSQL 공식 이미지 선택하기
Docker Hub에서 postgres를 검색하면 PostgreSQL 공식 이미지가 제공된다.
이 중 Alpine 기반 이미지는 용량이 작아 테스트 및 개발 환경에서 자주 사용된다.
이미지는 다음 두 가지 방식 중 하나로 사용할 수 있다.
- docker pull 명령어로 미리 다운로드
- docker run 실행 시 로컬에 이미지가 없으면 자동 다운로드

여기에서는 postgres:18-alpine 이미지를 사용한다.
PostgreSQL 컨테이너 실행하기
PostgreSQL 컨테이너를 실행할 때는 반드시 환경 변수를 설정해야 한다.
최소한 다음 두 가지는 필수이다.
- POSTGRES_USER: DB 접속용 사용자 이름
- POSTGRES_PASSWORD: DB 접속용 비밀번호
컨테이너 이름은 자유롭게 지정할 수 있으며, 여기서는 db-container로 설정한다.
또한 PostgreSQL 기본 포트인 5432를 호스트와 바인딩한다.

만약 터미널로 이미지를 띄우기 위해서는 아래의 command를 입력하면 된다.
docker run -d \
--name db-container \
-p 5432:5432 \
-e POSTGRES_USER=admin \
-e POSTGRES_PASSWORD=password \
postgres:18-alpine
이후 container를 띄운다.

PostgreSQL 컨테이너에 접속하기
GUI 도구를 사용하고 싶다면 DBeaver, DataGrip 같은 DB 클라이언트를 사용할 수 있다.
그러나 별도 프로그램 설치 없이도 Docker 명령어만으로 DB에 접속할 수 있다.
먼저 컨테이너 내부로 진입한다.
아래와 같이 docker exec 명령어를 사용하거나 docker desktop에서 Exec으로 컨테이너 안으로 들어간다.
docker exec -it db-container bash
이후 컨테이너 내부에서 psql 명령어를 사용해 DB에 접속한다.
psql -U admin -W
비밀번호 입력을 요구하면, 컨테이너 실행 시 설정한 POSTGRES_PASSWORD 값을 입력하면 된다.

그럼 DB에 접속할 수 있다.
PostgreSQL 기본 명령어 살펴보기
DB에 접속한 뒤에는 다음과 같은 기본 명령어를 사용할 수 있다.
- \l : 데이터베이스 목록 조회
- \c postgres : postgres 데이터베이스로 이동
- \d : 현재 데이터베이스의 테이블 목록 조회
PostgreSQL에서 데이터베이스는 일종의 논리적 폴더 개념이며, 그 안에 테이블이 존재한다.
테이블은 엑셀 파일 하나에 해당한다고 이해하면 된다.

테이블 생성 및 데이터 삽입
간단한 예제로 product 테이블을 하나 생성해본다.
create table product (title varchar(100));
데이터를 삽입한다.
insert into product values ('shirt');
insert into product values ('pants');
데이터를 조회한다.
select * from product;

이제 DB에 데이터가 정상적으로 저장된 상태이다.
컨테이너 기반 DB의 치명적인 문제: 데이터 유실
여기서 중요한 문제가 하나 있다.
PostgreSQL을 컨테이너로 실행하면, 컨테이너를 삭제하는 순간 내부 데이터는 모두 사라진다.
컨테이너는 언제든지 껐다 켜고 다시 생성하는 것이 전제이기 때문에,
DB 데이터를 컨테이너 내부에만 저장하는 것은 매우 위험하다.
이 문제를 해결하는 방법이 바로 Docker Volume이다.
Docker Volume 개념 이해하기
Docker Volume은 Docker가 관리하는 디렉토리이다. 컨테이너 외부에 존재하며, 컨테이너를 삭제해도 데이터가 유지된다.
Volume의 특징은 다음과 같다.
- 컨테이너와 생명주기가 분리됨
- 여러 컨테이너에 재사용 가능
- 로컬 디스크에 실제 데이터 저장
Volume은 하드에 폴더를 하나 만드는 것이라고 생각하면 된다.

Docker Desktop에서 Volume 탭으로 들어가서 자유롭게 만들 수 있다.
여기에 Container 안에 있는 데이터를 복사해 저장하거나 불러올 수 있다.
PostgreSQL 데이터 디렉토리와 Volume 연결하기
PostgreSQL은 내부적으로 다음 경로에 실제 데이터를 저장한다.
/var/lib/postgresql/data
이 경로를 Volume에 마운트해야 데이터가 안전하게 유지된다.
컨테이너 실행 시 다음과 같이 Volume을 지정한다.

터미널 command는 다음과 같다.
docker run -d \
--name db-container \
-p 5432:5432 \
-e POSTGRES_USER=admin \
-e POSTGRES_PASSWORD=qwer1234 \
-v postgres_vol:/var/lib/postgresql/data \
postgres:18-alpine
만약 postgres_vol이라는 Volume이 없다면 Docker가 자동으로 생성한다.
데이터 영속성 확인하기
이제 다시 DB에 접속해 테이블을 생성하고 데이터를 저장한 뒤, 컨테이너를 삭제하고 다시 실행해본다.

docker rm -f db-container
그 다음 동일한 Volume을 붙여 컨테이너를 다시 실행한다.
docker run -d \
--name db-container \
-p 5432:5432 \
-e POSTGRES_USER=admin \
-e POSTGRES_PASSWORD=password \
-v postgres_vol:/var/lib/postgresql/data \
다시 DB에 접속해 select 쿼리를 실행하면, 이전에 저장한 데이터가 그대로 남아 있는 것을 확인할 수 있다.
+ Bind Mount 방식
Volume 대신 Bind Mount 방식을 사용할 수도 있다.
이 방식은 Docker가 관리하는 디렉토리 대신, 사용자가 직접 지정한 로컬 폴더를 컨테이너에 연결한다.
docker run -v /내컴퓨터/폴더경로:/컨테이너/경로 이미지명
Bind Mount는 다음과 같은 경우에 유용하다.
- 데이터 위치를 직접 관리하고 싶은 경우
- 수동 백업이나 파일 확인이 필요한 경우
다만 운영 환경에서는 Docker Volume이 더 안전하고 일반적으로 권장된다.
개발 환경과 운영 환경의 차이점
개발 환경에서는 DB를 컨테이너로 실행하는 것이 매우 편리하다. 그러나 운영 환경에서는 이야기가 다르다.
데이터베이스는 장기 안정 실행, 백업 및 복구 전략, 장애 대응과 특성이 중요하다.

이러한 요구사항을 고려하면, 실제 서비스 환경에서는,
Amazon RDS, Aurora, DynamoDB, DocumentDB와 같은 관리형 DB 서비스를 사용하는 것이 훨씬 안전하고 효율적이다.
컨테이너 기반 DB는 주로 로컬 개발 환경, 테스트 및 실험, CI 파이프라인과 같은 용도에 적합하다.
'Tool 활용법 > Docker 활용법' 카테고리의 다른 글
| Docker 네트워크로 nginx와 웹서버 연결하기 (0) | 2026.02.06 |
|---|---|
| Docker 컨테이너 간 통신이 필요한 이유와 Nginx Reverse Proxy (0) | 2026.02.06 |
| [Docker 기초 5] Docker Hub로 이미지 업로드하고 공유하기 (0) | 2026.02.06 |
| [Docker 기초 4] Dockerfile 성능 최적화 방법 (Cache, Multi-Stage build) (0) | 2026.02.06 |
| [Docker 기초 3] Docker Container 필수 명령어 정리 (0) | 2026.02.06 |