Docker Postgres를 사용하여 데이터베이스 사용자 생성

David Mbochi Njonge 2023년6월20일
  1. 새 프로젝트 만들기
  2. 사용자 및 데이터베이스에 대한 DDL 정의
  3. 이미지에 대한 Dockerfile 정의
  4. 이미지 구축
  5. 컨테이너 실행
  6. 컨테이너에 연결
  7. PostgreSQL에 로그인
  8. 스크립트 파일 없이 사용자 데이터베이스 만들기
  9. 결론
Docker Postgres를 사용하여 데이터베이스 사용자 생성

애플리케이션을 개발할 때 일반적으로 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_DBPOSTGRES_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 Mbochi Njonge avatar David Mbochi Njonge avatar

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