Docker 기반 Postgresql 설치하기
- Development/Database
- 2021. 3. 11.
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).
에러 발생시, 다음의 글을 참고한다.
정상적으로 설치가 완료되었다면, 실행시 다음과 같은 유형의 로그를 확인할 수 있다.
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.
참고
'Development > Database' 카테고리의 다른 글
PostgreSQL 트랜잭션 격리수준 확인/변경 (0) | 2021.04.10 |
---|---|
MySQL - 트랜잭션 격리 수준 (transaction isolation level) 테스트 (0) | 2021.04.04 |
MySQL 트랜잭션 격리수준 확인/변경 (0) | 2021.03.27 |
psql (postgresql client) command (0) | 2021.03.17 |
DB 트랜잭션 - 격리수준(Transaction Isolation Level) (0) | 2021.03.07 |
맥북에 psql 설치하기 (postgresql client) (0) | 2021.03.06 |
MySQL 쿼리 타임아웃 설정 - MAX_EXECUTION_TIME (0) | 2021.02.28 |
MySQL information_schema로 세부 정보 확인하기 (0) | 2021.02.13 |