Docker 기반 Postgresql 설치하기

Docker를 사용하여 Postgresql을 설치하는 방법을 정리한다.

     

    docker-compose.yml

    YAML 파일의 기본 골격을 다음과 같이 작성한다.

    version: "3"
    services:
        db:
            image: postgres:latest
            container_name: postgres
            restart: always
            ports:
                - "5432:5432"
            environment:
                POSTGRES_USER: "${DB_USER_ID}"
                POSTGRES_PASSWORD: "${DB_USER_PASSWORD}"
            volumes:
                - ${POSTGRES_HOME_DIR}/data/:/var/lib/postgresql/data

    파일내 변수로 선언한 내용은 .env에 작성한다.

     

    변수선언

    docker-compose.yml과 같은 디렉토리 내에.env 파일을 만들고, 아래와 같이 DB 접속에 사용할 사용자 ID와 Password를 작성한다. volume mount 디렉토리도 함께 지정한다.

    DB_USER_ID=사용자계정
    DB_USER_PASSWORD=사용자계정비밀번호
    POSTGRES_HOME_DIR=Postgresql 설치 디렉토리

    작성한 환경변수가 템플릿 yml 파일에 정상 반영이 되는지 확인하자.

    $ docker-compse config

    변수가 .env에 선언한 내용들로 치환이 잘 되었는지 검토하면 된다. 빈 칸으로 출력된다면 오타 여부를 확인한다.

     

    실행

    daemon으로 실행하기에 앞서, 정상적으로 실행되는지 확인하자.

    $ docker-compose up

    처음에 실행하면 docker image도 복사하면서 다음과 같은 로그가 출력된다.

    Creating network "postgres_docker_default" with the default driver
    Pulling db (postgres:latest)...
    latest: Pulling from library/postgres
    45b42c59be33: Pull complete
    40adec129f1a: Pull complete
    b4c431d00c78: Pull complete
    2696974e2815: Pull complete
    564b77596399: Pull complete
    5044045cf6f2: Pull complete
    d736e67e6ac3: Pull complete
    390c1c9a5ae4: Pull complete
    c0e62f172284: Pull complete
    ebcdc659c5bf: Pull complete
    29be22cb3acc: Pull complete
    f63c47038e66: Pull complete
    77a0c198cde5: Pull complete
    c8752d5b785c: Pull complete
    Digest: sha256:5cfcfb0516ddd317109e2746a462b1dc398d152936640a2b69284629f48dc288
    Status: Downloaded newer image for postgres:latest
    Creating postgres ..

    설치 중, 다음과 같은 에러가 발생할 수도 있다. (실제 발생했음)

    ERROR: for postgres  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)
    
    ERROR: for db  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)
    ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.
    If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).

    에러 발생시, 다음의 글을 참고한다.

     

    docker-compose 실행 시 - An http request took too long to complete 에러가 발생한다면?

    docker-compose를 실행했는데, 실행 도중 아무 반응이 없다가 툭하니 An http request took too long to complete. 에러가 발생한다면? ERROR: An HTTP request took too long to complete. Retry with --verbose..

    luran.me

    정상적으로 설치가 완료되었다면, 실행시 다음과 같은 유형의 로그를 확인할 수 있다.

    Recreating postgres ... done
    Attaching to postgres
    postgres | The files belonging to this database system will be owned by user "postgres".
    postgres | This user must also own the server process.
    postgres |
    postgres | The database cluster will be initialized with locale "en_US.utf8".
    postgres | The default database encoding has accordingly been set to "UTF8".
    postgres | The default text search configuration will be set to "english".
    postgres |
    postgres | Data page checksums are disabled.
    postgres |
    postgres | fixing permissions on existing directory /var/lib/postgresql/data ... ok
    postgres | creating subdirectories ... ok
    postgres | selecting dynamic shared memory implementation ... posix
    postgres | selecting default max_connections ... 100
    postgres | selecting default shared_buffers ... 128MB
    postgres | selecting default time zone ... Etc/UTC
    postgres | creating configuration files ... ok
    postgres | running bootstrap script ... ok
    postgres | performing post-bootstrap initialization ... ok
    postgres | syncing data to disk ... ok
    postgres |
    postgres |
    postgres | Success. You can now start the database server using:
    postgres |
    postgres |     pg_ctl -D /var/lib/postgresql/data -l logfile start
    postgres |
    postgres | initdb: warning: enabling "trust" authentication for local connections
    postgres | You can change this by editing pg_hba.conf or using the option -A, or
    postgres | --auth-local and --auth-host, the next time you run initdb.
    postgres | waiting for server to start....2021-03-04 11:30:11.417 UTC [50] LOG:  starting PostgreSQL 13.2 (Debian 13.2-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
    postgres | 2021-03-04 11:30:11.419 UTC [50] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
    postgres | 2021-03-04 11:30:11.439 UTC [51] LOG:  database system was shut down at 2021-03-04 11:30:09 UTC
    postgres | 2021-03-04 11:30:11.455 UTC [50] LOG:  database system is ready to accept connections
    postgres |  done
    postgres | server started

    이후 정상적으로 확인이 가능하다면 -d 옵션을 넣고 daemon 형태로 띄우자.

    $ docker-compose up -d 

     

    접속 확인

    다른 터미널로부터 정상 접속 가능 여부를 확인한다.

    telnet 127.0.0.1 5432
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.

    DataGrip 등과 같은 GUI client나 혹은 psql를 활용하여 정상 접속 여부를 확인한다. 기본적으로 내가 사용할 계정과 DB가 생성되어 있지 않기 때문에 디폴트 계정으로 접속하여 기본 설정을 마무리한다.

     

    psql 사용하여 접속 확인

    $ psql -h 127.0.0.1 -U postgres

    다음과 같이 \du 명령어로 사용자를 조회해 본다.

    psql (13.2, server 12.3)
    Type "help" for help.
    
    postgres=# \du
                                       List of roles
     Role name |                         Attributes                         | Member of
    -----------+------------------------------------------------------------+-----------
     postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

    이 명령어는 psql에서 지원하는 고유 명령어로, 쿼리로 치면 다음의 쿼리와 동일하다.

    SELECT * FROM pg_user;

    .env에 선언한 계정과 DB를 만들자.

    CREATE USER 계정 PASSWORD '비밀번호' SUPERUSER;
    CREATE DATABASE mydb OWNER 계정;

    위 예제에서는 편의상 superuser로 권한을 부여했다.

     

    사용자 추가 여부 확인

    \du 명령으로 사용자 계정을 확인해 본다.

    postgres=# \du
                                       List of roles
     Role name |                         Attributes                         | Member of
    -----------+------------------------------------------------------------+-----------
     dev       | Superuser                                                  | {}
     postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

    정상적으로 사용자가 추가된 것도 확인할 수 있다. 물론, SQL로도 확인할 수 있다.

     

    새 계정으로 접속해 보기

    \q 명령어를 사용하여 psql을 종료하고, 위에서 생성한 계정으로 잘 접속이 되는지 확인해 보자.

    psql -h 127.0.0.1 -d mydb -U dev -W
    Password:
    psql (13.2, server 12.3)
    Type "help" for help.
    
    mydb=#

    dev라는 계정으로, mydb라는 DB에 접속한 예제이다. 접속에 사용한 파라미터는 아래와 같다.

    • -h: 호스트이름
    • -d: DB 이름
    • -U: 사용자계정
    • -W: 패스워드 묻기

     

    기타 - psql 실행 옵션

    위와 같이 접속시 사용할 수 있는 옵션의 전체 리스트는 --help를 치면 모두 나열된다.

    $ psql --help
    
    psql is the PostgreSQL interactive terminal.
    
    Usage:
      psql [OPTION]... [DBNAME [USERNAME]]
    
    General options:
      -c, --command=COMMAND    run only single command (SQL or internal) and exit
      -d, --dbname=DBNAME      database name to connect to (default: "luran")
      -f, --file=FILENAME      execute commands from file, then exit
      -l, --list               list available databases, then exit
      -v, --set=, --variable=NAME=VALUE
                               set psql variable NAME to VALUE
                               (e.g., -v ON_ERROR_STOP=1)
      -V, --version            output version information, then exit
      -X, --no-psqlrc          do not read startup file (~/.psqlrc)
      -1 ("one"), --single-transaction
                               execute as a single transaction (if non-interactive)
      -?, --help[=options]     show this help, then exit
          --help=commands      list backslash commands, then exit
          --help=variables     list special variables, then exit
    
    Input and output options:
      -a, --echo-all           echo all input from script
      -b, --echo-errors        echo failed commands
      -e, --echo-queries       echo commands sent to server
      -E, --echo-hidden        display queries that internal commands generate
      -L, --log-file=FILENAME  send session log to file
      -n, --no-readline        disable enhanced command line editing (readline)
      -o, --output=FILENAME    send query results to file (or |pipe)
      -q, --quiet              run quietly (no messages, only query output)
      -s, --single-step        single-step mode (confirm each query)
      -S, --single-line        single-line mode (end of line terminates SQL command)
    
    Output format options:
      -A, --no-align           unaligned table output mode
          --csv                CSV (Comma-Separated Values) table output mode
      -F, --field-separator=STRING
                               field separator for unaligned output (default: "|")
      -H, --html               HTML table output mode
      -P, --pset=VAR[=ARG]     set printing option VAR to ARG (see \pset command)
      -R, --record-separator=STRING
                               record separator for unaligned output (default: newline)
      -t, --tuples-only        print rows only
      -T, --table-attr=TEXT    set HTML table tag attributes (e.g., width, border)
      -x, --expanded           turn on expanded table output
      -z, --field-separator-zero
                               set field separator for unaligned output to zero byte
      -0, --record-separator-zero
                               set record separator for unaligned output to zero byte
    
    Connection options:
      -h, --host=HOSTNAME      database server host or socket directory (default: "local socket")
      -p, --port=PORT          database server port (default: "5432")
      -U, --username=USERNAME  database user name (default: "luran")
      -w, --no-password        never prompt for password
      -W, --password           force password prompt (should happen automatically)
    
    For more information, type "\?" (for internal commands) or "\help" (for SQL
    commands) from within psql, or consult the psql section in the PostgreSQL
    documentation.

     

    참고

     

    docker-compose 환경변수 사용 및 치환

    docker-compose를 실행할 때, 반복되는 값 혹은 변경 가능한 값을 변수화 해놓으면 재사용성을 높일 수 있다. docker-compose 사용시 어떻게 변수화를 할 수 있는지 정리한다. 샘플 yml 파일 version: '3' servic

    luran.me

     

    댓글(0)

    Designed by JB FACTORY