Docker Postgres를 사용하여 데이터베이스 사용자 생성
- 새 프로젝트 만들기
- 사용자 및 데이터베이스에 대한 DDL 정의
- 이미지에 대한 Dockerfile 정의
- 이미지 구축
- 컨테이너 실행
- 컨테이너에 연결
- PostgreSQL에 로그인
- 스크립트 파일 없이 사용자 데이터베이스 만들기
- 결론
애플리케이션을 개발할 때 일반적으로 PostgreSQL, MySQL, MongoDB 등과 같은 데이터베이스 관리 시스템을 사용하여 애플리케이션의 데이터를 기록합니다.
Docker는 이러한 응용 프로그램 데이터베이스 관리 시스템의 인스턴스를 실행하는 데 도움이 됩니다. 이렇게 하면 컴퓨터에 DBMS가 필요하지 않기 때문에 시간과 컴퓨터 저장 공간을 절약할 수 있습니다.
이러한 DBMS에서 생성된 모든 데이터베이스에는 데이터베이스에 대해 서로 다른 권한을 가진 사용자가 있습니다. 이 자습서에서는 Docker Postgres를 사용하여 데이터베이스 사용자를 생성하는 다양한 접근 방식을 배웁니다.
새 프로젝트 만들기
이 자습서에서는 WebStorm IDE를 사용하지만 모든 개발 환경을 자유롭게 사용할 수 있습니다. WebStorm IDE를 열고 파일
> 새로 만들기
> 프로젝트
를 선택하여 새 프로젝트를 만듭니다.
빈 프로젝트
옵션을 선택하고 열리는 창에서 프로젝트 이름을 무제
에서 initdb.d
로 변경하거나 원하는 이름을 사용하십시오.
사용자 및 데이터베이스에 대한 DDL 정의
PostgreSQL 기본 이미지를 사용하여 사용자 지정 이미지에 추가 초기화를 추가하려면 /docker-entrypoint-initdb.d 폴더 아래
.sql,
.sql.gz또는
*.sh를 추가해야 합니다.
.
SQL 쿼리를 생성하려고 하므로 확장명이 .sql
인 파일을 사용하여 쿼리를 정의합니다. 프로젝트의 현재 폴더 아래에 db-config.sql
이라는 파일을 만들고 다음 SQL 명령을 복사하여 파일에 붙여넣습니다.
CREATE USER doe;
CREATE DATABASE employee_database;
GRANT ALL PRIVILEGES ON DATABASE employee_database TO doe;
db-config.sql
은 기본 Postgres
사용자 및 데이터베이스를 생성하기 위해 진입점이 initdb
를 호출한 후에 실행됩니다.
/docker-entrypoint-initdb.d
의 스크립트는 데이터 디렉토리가 비어 있는 경우에만 실행됩니다. 이는 시작하는 동안 이 이전에 실행된 모든 데이터베이스가 변경되지 않음을 의미합니다.
이미지에 대한 Dockerfile 정의
현재 폴더 아래에 Dockerfile
이라는 파일을 만들고 다음 지침을 복사하여 파일에 붙여넣습니다.
FROM postgres:15.1-alpine
COPY db-config.sql /docker-entrypoint-initdb.d/
FROM
- 후속 지침을 사용하여 사용자 정의 이미지를 생성할 기본 이미지를 정의합니다. 이 경우 경량 버전의 PostgreSQL이므로 스토리지를 최적화하는 데 도움이 되는 ‘alpine’을 사용했습니다.
COPY
- 호스트에서 이미지 파일 시스템으로 파일과 폴더를 복사합니다. 이 경우에는 db-config.sql
파일을 /docker-entrypoint-initdb.d/
폴더에 복사했습니다.
이미지 구축
키보드 단축키 ALTF12를 사용하여 새 터미널 창을 열고 다음 명령을 사용하여 postgres-image
태그가 있는 이미지를 빌드합니다.
~/WebstormProjects/initdb.d$ docker build --tag postgres-image:latest .
출력:
=> [1/2] FROM docker.io/library/postgres:15.1-alpine@sha256:cc663286e63810373bdfc91a5ed24b772447fb5282d 0.0s
=> CACHED [2/2] COPY db-config.sql /docker-entrypoint-initdb.d/ 0.0s
=> exporting to image 0.4s
=> => exporting layers 0.0s
=> => writing image sha256:fd33d80c880452dcb25de1d8f7d6415eeb874039bdab176cc3d3fe1c910ebcbc 0.1s
=> => naming to docker.io/library/postgres-image:latest
컨테이너 실행
동일한 터미널 창에서 다음 명령을 사용하여 postgres-container
라는 이름으로 PostgreSQL 컨테이너를 실행합니다.
~/WebstormProjects/initdb.d$ docker run --name postgres-container -e POSTGRES_PASSWORD=postgres -d postgres-image
출력:
3b8e0f85c2b4ef4b1aa28e2bad169ae796751331580af6fbba251a1c05aa4fca
run
명령에서 POSTGRES_PASSWORD
라는 환경 변수를 사용했습니다. PostgreSQL을 실행할 때 데이터베이스 및 사용자 이름을 포함한 수퍼유저 세부 정보를 제공하기 위해 여러 환경 변수를 전달할 수 있습니다.
POSTGRES_PASSWORD
환경 변수는 수퍼유저 암호를 제공하는 필수
변수입니다. PostgreSQL의 기본 암호는 postgres
입니다.
전달할 수 있는 다른 환경 변수는 선택 사항
이며 POSTGRES_USER
, POSTGRES_DB
및 POSTGRES_INITDB_ARGS
를 포함합니다.
분리 모드에서 컨테이너를 실행 중이므로 db-config.sql
파일의 실행을 볼 수 없습니다. 그러나 이 파일은 수퍼유저에 의해 뒤에서 실행됩니다.
컨테이너에 연결
새 사용자와 데이터베이스를 사용하여 PostgreSQL에 로그인할 수 있도록 대화형 셸을 사용하여 컨테이너에 연결해야 합니다. 이렇게 하려면 다음 명령을 사용하여 컨테이너에 연결합니다.
~/WebstormProjects/initdb.d$ docker exec -it postgres-container bash
출력:
bash-5.1#
PostgreSQL에 로그인
컨테이너의 셸에 액세스한 후 다음 명령을 사용하여 employee_database
에 사용자 doe
로 로그인합니다.
bash-5.1# psql -d employee_database -U doe
출력:
psql (15.1)
Type "help" for help.
employee_database=>
스크립트 파일 없이 사용자 데이터베이스 만들기
이전 섹션에서는 /docker-entrypoint-initdb.d/
에 DDL이 포함된 SQL을 추가하여 Docker Postgres에서 데이터베이스 사용자를 생성하는 방법을 배웠습니다.
스크립트 파일을 작성하지 않고 이 작업을 수행하는 더 쉬운 방법이 있습니다. 이 접근 방식은 이전 섹션에서 언급한 환경 변수를 사용하여 새 사용자의 세부 정보를 정의합니다.
이러한 환경 변수는 ENV
명령을 사용하여 Dockerfile
에 추가되며 컨테이너에서 사용할 수 있습니다. 이를 확인하려면 Dockerfile
의 지침을 아래 제공된 지침으로 바꾸십시오.
FROM postgres:15.1-alpine
ENV POSTGRES_USER=doe
ENV POSTGRES_DB=employee_database
환경 변수를 추가한 후 이미지 빌드, 컨테이너 실행, 컨테이너 연결, PostgreSQL 로그인 등 이전 섹션에서 다룬 모든 단계를 반복합니다.
모든 단계에 동일한 명령을 사용하십시오. 그러나 기존 컨테이너를 중지하고 제거해야 합니다.
새 이미지와 컨테이너를 만들도록 선택할 수도 있습니다.
결론
이 자습서에서는 Docker Postgres로 데이터베이스 사용자를 생성하는 데 사용할 수 있는 두 가지 접근 방식을 배웠습니다. 첫 번째 접근 방식은 /docker-entrypoint-initdb.d/
에 SQL 스크립트를 추가하여 사용자를 생성했으며 이 파일은 initdb
초기화 중에 실행되었습니다.
두 번째 접근 방식에서는 Docker Postgres 환경 변수를 활용하여 Dockerfile
에서 사용자 세부 정보를 정의했습니다.
David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.
LinkedIn GitHub