데이터베이스 연구실.log

Docker 기반 PostgreSQL

Windows Docker Desktop에서 postgres:16 이미지를 받아 컨테이너를 띄우고, 컨테이너 안 psql로 접속해 dept, emp 실습 테이블을 만드는 과정

docker pulldocker rundocker execpostgres:16POSTGRES_PASSWORD-p 5432:5432

#핵심 요약

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

#이미지 받기와 컨테이너 실행

Windows 명령 프롬프트객체 또는 설정을 변경함
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 접속과 실습 테이블

Windows 명령 프롬프트현재 세션 설정만 변경함
docker exec -it pg16 psql -U scott -d orcl
psql (scott@orcl, 컨테이너 안)데이터 또는 파일을 삭제함, 되돌릴 수 없음
DROP 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 파일에 넣어 두고 실행하는 방법도 안내함

#멈추고 다시 쓰기

Windows 명령 프롬프트객체 또는 설정을 변경함
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처럼 세부 태그를 씀

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기