행위

Docker Postgresql 설치 환경설정

DB CAFE

thumb_up 추천메뉴 바로가기


1 Docker로 Postgresql 설치 및 환경설정[편집]

1.1 개요[편집]

  1. Postgresql 설치
    1. 설치후 Postgresql 유저/db/테이블 생성
  2. Docker로 컨테이너 삭제
    1. 생성된 유저/db/테이블 도 같이 삭제됨을 확인
  3. 다시 컨테이너를 생성
    1. 이전 설치된 유저/db/테이블이 있는지 확인
  4. 데이터 외부저장 볼륨 생성
    1. 데이터를 저장할 볼륨을 별도로 생성하여 컨테이너가 삭제 되어도 이전 설치된 유저/db/테이블 정보 저장하는 방법



  1. docker는 프로세스 형태로 자원을 격리하여 사용하기 때문에 컨테이너가 삭제되면 기존에 저장되었던 데이터는 사라지는 문제점.
  2. docker volume을 사용하거나 로컬 컴퓨터 파일에 마운트하여 docker 내부에 생성되는 데이터를 docker 외부에 저장하여 영구적으로 데이터를 저장하는 방법



1.2 Docker로 Postgresql 다운로드 및 실행[편집]

1.2.1 Docker 이미지 다운 로드[편집]

# Docker 이미지 다운로드
$docker pull postgres
# Docker 이미지 확인
$docker images

1.2.2 postgresql Docker 실행[편집]

$ docker run -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=cafe1234 -d postgres


  • docker run : docker image에서 container 생성
  • -p 5432:5432  : 해당 container의 port forwarding에 대해 inbound/outbound port 모두 5432으로 설정한다.
  • -name postgres  : container의 이름은 postgres로 한다.
  • -e  : container 내부의 환경변수 설정
  • POSTGRES_PASSWORD="암호"" : ROOT 암호를 설정 따옴표 내의 내용은 암호이다.
  • -d postgres : postgres이라는 이미지에서 분리하여 container를 생성한다.



1.2.3 Docker 프로세스 확인[편집]

$ docker ps -a 

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                    NAMES
2093fec3b2ac        postgres            "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes                0.0.0.0:5432->5432/tcp   postgres


1.3 Docker 컨테이너 내부 접속 및 사용자 , 데이터베이스 생성, 테이블 생성[편집]

1.3.1 Docker 컨네이너(postgresql 이미지 내부) 쉘로 내부 접속[편집]

  • Docker 내부 쉘실행
$ docker exec -it postgres /bin/bash

1.3.2 컨테이너 내부 접속[편집]

  • postgresql 접속
root@ac61c662ee4c:/# psql -U postgres

psql (13.0 (Debian 13.0-1.pgdg100+1))
Type "help" for help.

1.3.3 사용자 생성 (dbcafe)[편집]

postgres=# CREATE USER dbcafe PASSWORD 'cafe1234' SUPERUSER;
....
CREATE ROLE

1.3.4 DB 생성(test_db)[편집]

postgres=# CREATE DATABASE test_db OWNER dbcafe;
....
CREATE DATABASE

1.3.5 디비(test_db) 접속[편집]

postgres=# \c test_db dbcafe

You are now connected to database "test_db" as user "dbcafe".

1.3.6 테이블 생성[편집]

test_db=# CREATE TABLE tb_emp (
emp_no integer NOT NULL,
emp_name character varying(255),
age integer,
dept_no integer,
CONSTRAINT pk_emp PRIMARY KEY (emp_no)
);

CREATE TABLE

1.3.7 테이블 정보 조회[편집]

test_db=# \dt
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+----------
 public | tb_emp | table | dbcafe
(1 row)
# postgresql 접속 종료 
postgres=# \q
  • 기본적인 데이터베이스 생성과정 완료
  • 아래는 컨테이너를 종료하고 다시 시작했을 때, 생성된 정보가 있는지 확인

1.4 컨테이너 재접속 후 생성된 정보 확인[편집]

1.4.1 기존 docker 종료 후 재접속[편집]

$ docker exec -it postgres /bin/bash
  • postgresql 접속
root@ac61c662ee4c:/#  psql -U postgres
psql (13.0 (Debian 13.0-1.pgdg100+1))
Type "help" for help.
  • 사용자 정보 조회
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 dbcafe    | Superuser                                                  | {}
  • dbcafe 유저로 test_db 디비접속
postgres=# \c test_db dbcafe
You are now connected to database "test_db" as user "dbcafe".
  • 테이블 정보 조회
test_db=# \dt
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+----------
 public | tb_emp | table | dbcafe
(1 row)
  • 컨테이너만 종료되고 다시 시작했을 때는 기존에 저장되어 있던 데이터가 잘 살아 있는 것을 확인할 수 있다.

1.5 Docker 컨테이너 삭제[편집]

  • postgres 도커 중지
$ docker stop postgres 
postgres
  • postgres 도커 삭제
$ docker rm postgres
postgres
  • postgres 컨테이너 없음
$ docker exec -it postgres /bin/bash
Error: No such container: postgres
  • 컨테이너가 삭제되었기 때문에 다시 접속할 수가 없음.
  • 다시 컨테이너를 생성 하려면 docker run 실행
$ docker run -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=cafe1234 -d postgres
$ docker exec -it postgres /bin/bash
root@fd7f90041ffa:/# psql -U postgres
psql (13.0 (Debian 13.0-1.pgdg100+1))
Type "help" for help.
postgres=# SELECT * FROM PG_USER;
 usename  | usesysid | usecreatedb | usesuper | userepl | usebypassrls |  passwd  | valuntil | useconfig
----------+----------+-------------+----------+---------+--------------+----------+----------+-----------
 postgres |       10 | t           | t        | t       | t            | ******** |          |
(1 row)
postgres=# \q
  • 생성했던 계정 존재하지 않음.
  • 컨테이너 자체를 삭제하는 경우 해당 베이스 이미지만 그대로 사용하기 때문에 더이상 데이터가 남아 있지 않음.
  • 데이터를 종속시키기 위해서는 컨테이너 볼륨이나 로컬 컴퓨터에 데이터를 저장할 수 있는 공간을 따로 생성하여 외부에 저장할 수 있는 상태로 만들어야 함

1.6 볼륨과 마운트로 데이터 저장하는 방법[편집]

  • 데이터를 영구적으로 보관하는 방법

1.6.1 모든 컨테이너를 종료하고 삭제[편집]

$ docker stop $(docker ps -a -q)
$ docker rm $(docker ps -a -q)
  • 데이터를 저장할 볼륨 생성
$ docker volume create pgdata 
pgdata
  • -v 옵션으로 생성된 볼륨 지정


$ docker run -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=cafe1234 -d -v pgdata:/var/lib/postgresql/data postgres
  • 다시 컨테이너에 접속하여 계정을 생성해 보고, 컨테이너 삭제후에 계정 정보가 남아 있는지 확인


docker exec -it postgres /bin/bash
root@608f0aa10061:/# psql -U postgres
psql (13.0 (Debian 13.0-1.pgdg100+1))
Type "help" for help.
postgres=# CREATE USER dbcafe PASSWORD 'cafe1234' SUPERUSER;
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 dbcafe  | Superuser                                                  | {}
$ docker stop postgres
$ docker rm postgres
$ docker run -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=cafe1234 -d -v pgdata:/var/lib/postgresql/data postgres
791984a503b91542aaadd48703c6b694e745b3004c3a7c2f00d0eedf91cf27ea
$ docker exec -it postgres /bin/bash
root@791984a503b9:/# psql -U postgres
psql (13.0 (Debian 13.0-1.pgdg100+1))
Type "help" for help.
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 dbcafe    | Superuser                                                  | {}

postgres=# \q
  • 컨테이너를 삭제했음에도 불구하고 계정정보가 저장 되어 있는것을 확인
  • 그렇다면 볼륨 정보는 어디에 저장되어 있을까?

1.6.2 저장된 볼륨정보 조회[편집]

  • Docker 볼륨 조회
$  docker volume list
local               pgdata
$ docker volume inspect pgdata
[
    {
        "CreatedAt": "2020-10-09T07:13:50Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
        "Name": "pgdata",
        "Options": {},
        "Scope": "local"
    }
]
  • 각 운영체제별로 상의할 수 있음
  • 위 명령으로 볼륨 리스트와 해당 볼륨의 위치 및 상세 정보 확인

1.6.3 해당 볼륨 삭제 후 로컬 컴퓨터에 디렉토리에 데이터 저장하는 방법[편집]

$ docker volume remove pgdata
Error response from daemon: remove pgdata: volume is in use - [791984a503b91542aaadd48703c6b694e745b3004c3a7c2f00d0eedf91cf27ea]
  • docker 컨테이너가 실행되고 있는 상태에서 볼륨을 삭제하는 경우에는 에러가 발생하기 때문에 컨테이너를 종료하고 볼륨을 삭제한다.
$ docker stop postgres
postgres
$ docker rm postgres
postgres
$ docker volume remove pgdata
pgdata
  • docker에서 모든 볼륨을 삭제하고 싶다면 "docker volume prune" 명령을 입력한다.
$  docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y 
Total reclaimed space: 7.402GB
$ mkdir pgdata
$ docker run -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=cafe1234 -d -v ~/pgdata:/var/lib/postgresql/data postgres
06006c5d1160b471eaeb73b429e6a08329f9087a7f32b86aab811fe7e4246a65
  1. 상대경로에 pgdata라는 디렉토리 생성
  2. -v 옵션으로 해당 디렉토리를 마운트
  3. 해당 디렉터리로 이동하여 postgresql 데이터가 저장되어 있는지 확인.
$ cd pgdata
$ ls -l
total 112
-rw-------   1 dbcafe  staff      3 10  9 16:35 PG_VERSION
drwx------   5 dbcafe  staff    160 10  9 16:35 base
drwx------  59 dbcafe  staff   1888 10  9 16:35 global
drwx------   2 dbcafe  staff     64 10  9 16:35 pg_commit_ts
drwx------   2 dbcafe  staff     64 10  9 16:35 pg_dynshmem
-rw-------   1 dbcafe  staff   4782 10  9 16:35 pg_hba.conf
-rw-------   1 dbcafe  staff   1636 10  9 16:35 pg_ident.conf
drwx------   5 dbcafe  staff    160 10  9 16:35 pg_logical
drwx------   4 dbcafe  staff    128 10  9 16:35 pg_multixac
...
  • 실제 로컬 컴퓨터에 postgresql를 사용하기 위한 데이터가 저장되어 있는 것을 확인할 수 있다.
  • 이 상태에서 위와 동일한 방법으로 진행하면 컨테이너 내부에서 변경된 모든 데이터는 해당 디렉토리가 삭제되지 않는 이상 사라지지 않으며, 설정파일을 직접 수정하여 적용할 수도 있다.
  • CIFS나 NFS를 통한 외부 스토리지에 저장하여 데이터를 저장하는 방식도 가능하다.
  • 리눅스의 경우 해당 디렉토리에 권한문제(퍼미션)로 인해 접속이 되지 않을 수도 있다. 이 경우 root 권한으로 접속해서 볼 수 있으며, 만약 디렉토리를 만들었음에도 불구하고 데이터가 저장되지 않거나 컨테이너가 재대로 실행되지 않은 경우, 소유자 권한 오류로 인해서 docker 컨테이너가 해당 디렉토리에 접근하지 못할 가능성이 크다. 따라서 이런 에러가 발생하는 경우에는 소유자 권한을 변경하면 정상적으로 사용할 수 있다.
$ sudo chown -R 200:200 some_dir
  • 컨테이너를 실행할 때, 디렉토리를 마운트 하는 경우에 절대경로를 사용하는 것을 추천한다.