Docker 기반 PostgreSQL
Windows Docker Desktop에서 postgres:16 이미지를 받아 컨테이너를 띄우고, 컨테이너 안 psql로 접속해 dept, emp 실습 테이블을 만드는 과정
#핵심 요약
SQL 수업의 PostgreSQL 실습은 Windows의 Docker Desktop에서 postgres:16 컨테이너를 띄워 씀
Docker Desktop 준비는 Docker 실행 환경에서 다룸
docker run의 환경변수로 처음 만들 사용자, 비밀번호, DB를 정하고, -p 5432:5432로 Windows의 5432를 컨테이너의 5432에 연결함
docker exec -it <컨테이너> psql로 컨테이너 안의 psql에 들어가 Oracle과 같은 모양의 dept, emp를 만들어 SQL 실습에 씀
#개념과 동작 원리
docker run 설정 |
의미 |
|---|---|
-d |
컨테이너를 백그라운드로 실행 |
--name pg16 |
컨테이너 이름, 이후 docker exec, stop, start에 씀 |
-e POSTGRES_USER=scott |
처음 만들 슈퍼유저 롤 이름 |
-e POSTGRES_PASSWORD=... |
그 롤의 비밀번호(이미지가 기동하려면 필수) |
-e POSTGRES_DB=orcl |
처음 만들 기본 DB 이름, 없으면 사용자 이름과 같은 DB |
-p 5432:5432 |
호스트포트:컨테이너포트, Windows 쪽 도구가 localhost:5432로 접속 |
postgres:16 |
공식 이미지의 16 태그, 받을 때마다 16.x의 최신 패치일 수 있음 |
환경변수로 사용자, DB를 만드는 것은 데이터 디렉터리가 비어 있는 첫 기동 때만 일어나며, 이미 초기화된 컨테이너를 다시 시작할 때는 값을 바꿔도 반영되지 않음
#필수 명령어 또는 SQL
#이미지 받기와 컨테이너 실행
docker version
docker pull postgres:16
docker run -d ^
--name pg16 ^
-e POSTGRES_USER=scott ^
-e POSTGRES_PASSWORD=<PASSWORD> ^
-e POSTGRES_DB=orcl ^
-p 5432:5432 ^
postgres:16
docker ps결과 해석:
docker version에 Client와 Server(엔진) 정보가 함께 나와야 Docker Desktop 엔진에 연결된 것임
수업 자료는 16을 현업에서 가장 안정적으로 쓰는 버전이라고 소개했으나 그 비교 근거는 확인 불가
Windows에 PostgreSQL이 이미 설치돼 5432를 쓰고 있으면 포트 충돌이 나므로 -p 5433:5432처럼 호스트 쪽 포트를 바꿈
#컨테이너 안 psql 접속과 실습 테이블
docker exec -it pg16 psql -U scott -d orclDROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
CREATE TABLE dept (
deptno NUMERIC(10),
dname VARCHAR(14),
loc VARCHAR(13)
);
INSERT INTO dept VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO dept VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO dept VALUES (40, 'OPERATIONS', 'BOSTON');
CREATE TABLE emp (
empno NUMERIC(4) NOT NULL,
ename VARCHAR(10),
job VARCHAR(9),
mgr NUMERIC(4),
hiredate DATE,
sal NUMERIC(7,2),
comm NUMERIC(7,2),
deptno NUMERIC(2)
);
INSERT INTO emp VALUES (7839, 'KING', 'PRESIDENT', NULL, DATE '1981-11-17', 5000, NULL, 10);
INSERT INTO emp VALUES (7698, 'BLAKE', 'MANAGER', 7839, DATE '1981-05-01', 2850, NULL, 30);
INSERT INTO emp VALUES (7782, 'CLARK', 'MANAGER', 7839, DATE '1981-05-09', 2450, NULL, 10);
INSERT INTO emp VALUES (7566, 'JONES', 'MANAGER', 7839, DATE '1981-04-01', 2975, NULL, 20);
-- 나머지 10행(MARTIN, ALLEN, TURNER, JAMES, WARD, FORD, SMITH, SCOTT, ADAMS, MILLER)도 같은 형식으로 넣음
COMMIT;
SELECT * FROM dept;
SELECT * FROM emp;결과 해석:
실습 기록: psql (16.14 (Debian 16.14-1.pgdg13+1))과 orcl=# 프롬프트가 나옴
Oracle의 NUMBER는 NUMERIC, VARCHAR2는 VARCHAR, 날짜 리터럴은 DATE '1981-11-17'처럼 바꿔 같은 SCOTT 예제 데이터를 만듦
psql은 기본 자동 커밋이라 COMMIT을 실행하면 WARNING: there is no transaction in progress가 나올 수 있으며 데이터는 이미 반영돼 있음
수업은 자주 쓰는 docker exec ... 접속 명령을 메모장으로 p.bat 파일에 넣어 두고 실행하는 방법도 안내함
#멈추고 다시 쓰기
docker stop pg16
docker start pg16
docker logs pg16결과 해석:
stop, start는 같은 컨테이너를 다시 쓰므로 만든 테이블이 남아 있음
docker rm pg16으로 컨테이너를 지우면 볼륨을 따로 지정하지 않은 실습 구성에서는 데이터도 함께 사라질 수 있으므로, 계속 쓸 데이터는 -v 볼륨이름:/var/lib/postgresql/data로 볼륨을 붙여 실행함
#사용 조건과 주의사항
위 SQL은 같은 이름의 emp, dept를 먼저 지우므로 이미 데이터가 있는 DB에서는 실행하지 않음
실습 비밀번호를 그대로 쓰는 컨테이너는 PC 밖에서 5432로 접속할 수 있는 네트워크에 열어 두지 않음
postgres:16 태그는 시간이 지나면 다른 16.x 패치를 가리키므로, 버전을 고정하려면 postgres:16.14처럼 세부 태그를 씀