$ docker pull postgres
호스트의 5432포트와 컨테이너의 5432포트를 연결해주고 postgres 라는 이름을 가진 컨테이너에 환경변수 POSTGRES_PASSWORD
의 값을 넣어주어 실행시켜주겠습니다.
postgres 이미지의 환경변수에 대한 더 자세한 내용은 아래 링크에서 확인 할 수 있습니다. Postgres - Official Image | DockerHub
$ docker run -d -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=12345678 postgres
도커 컨테이너 특성상 컨테이너가 중지되거나 삭제될 경우 해당 컨테이너에서 사용한 데이터 또한 전부 삭제됩니다.
만약, 데이터베이스를 도커로 실행시켜 사용하던 도중 컨테이너가 내려가는 현상이 발생한다면 그 전까지 사용해오던 데이터가 모두 삭제되어 없어질 것입니다.
그런 현상을 방지하기 위해서 데이터베이스와 같이 데이터의 지속성이 필요한 경우 도커 볼륨이나 바인드 마운트를 사용하여 컨테이너의 데이터가 사라지지 않도록 해줄 수 있습니다.
여기서는 도커 볼륨이나 바인드 마운트에 대한 언급은 따로 하지 않을 예정입니다.
[Docker] 데이터 관리(1) Volume 과 Bind mounts 를 참고해주세요.
postgres 컨테이너에 사용하기 위한 볼륨을 생성합니다.
$ docker volume create pgdata
위에서 생성한 볼륨을 postgres 컨테이너의 /var/lib/postgresql/data
에 연결해주어 컨테이너를 실행합니다.
$ docker run -d -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=12345678 -v pgdata:/var/lib/postgresql/data postgres
postgres 컨테이너에 연결해서 사용하기 위한 폴더를 호스트 파일시스템에서 생성합니다.
$ mkdir pgdata
위에서 생성한 디렉토리를 연결하여 컨테이너를 실행합니다.
$ docker run -d -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=12345678 -v ~/pgdata:/var/lib/postgresql/data postgres
실행되고 있는 postgres 컨테이너로 접속하여 postgres 에 접속하겠습니다.
$ docker exec -it postgres /bin/bash
root@caa78328d590:/# psql -U postgres
psql (13.3 (Debian 13.3-1.pgdg100+1))
Type "help" for help.
새로운 계정을 생성하고, 그 뒤 컨테이너를 삭제 후에 다시 같은 볼륨 또는 바인드마운트에 마운트하여 컨테이너를 실행시켜 계정정보가 지속되는지 확인하겠습니다.
postgres=# CREATE USER testuser PASSWORD '1234' SUPERUSER;
CREATE ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
testuser | Superuser
$ docker stop postgres
$ docker rm postgres
$ docker run -d -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=12345678 -v pgdata:/var/lib/postgresql/data postgres
$ docker exec -it postgres /bin/bash
root@caa78328d590:/# psql -U postgres
psql (13.3 (Debian 13.3-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 | {}
testuser | Superuser
DataGrip 를 실행시켜 DataSource 를 추가하여 도커에 올려놓은 PostgreSQL 에 연결하여 DataGrip에서 테이블을 생성 후 도커를 통해서 생성된 테이블이 있는지 확인해보겠습니다.
도커를 local환경에 설치하였다면, 아래 그림과 같이 Host정보를 입력해주고 생성해준 계정정보 또는 postgres 계정정보를 입력 후 좌측 하단의 Test Connection 버튼을 눌러 연결이 되는지 확인해주세요.
AWS EC2에 도커를 설치하였다면, Host에 인스턴스의 IP정보를 입력하면 됩니다.
postgres 계정으로 접속하여 새로 생성한 계정이 접근할 수 있는 데이터베이스를 생성합니다.
새로 생성한 데이터베이스에서 console을 새로 열어 테이블을 생성합니다.
도커에서 postgres 컨테이너로 접속한 후 위에서 생성한 데이터베이스로 연결하여 테이블 목록을 확인해보겠습니다.
postgres=# \c test haeny
You are now connected to database "test" as user "haeny".
test=# \dt
List of relations
Schema | Name | Type | Owner
--------+--------+-------+-------
public | people | table | haeny
(1 row)