1. 도커 설치
도커 공식 문서 사이트를 통해서 도커를 설치할 수 있다.
https://docs.docker.com/get-docker/
설치 후 회원가입까지 진행하면 아래와 같이 Docker Desktop이 실행된다.
2. Postgres Image Pull
도커 이미지란 도커 컨테이너를 실행하는 데 필요한 모든 것을 포함하는 환경을 말한다.
이러한 도커 이미지는 Docker hub라는 이미지 레지스토리에 저장되어 필요할 때 다운로드하여 사용할 수 있다.
그러한 다운로드를 "pull" 이라고 한다.
도커 pull의 기본 명령어
docker pull 이미지이름:태그
태그는 이미지의 특정 버전을 가리키며, 생락하면 기본적으로 latest 태그가 사용된다.
https://hub.docker.com/_/postgres
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 : 실행중인 컨테이너 종료 후 삭제