본문 바로가기
개발자 전향 프로젝트

로컬에 설치한 DB와 도커에 띄워진 APP 연결하기 (Postgres)

by 샘오리 2024. 6. 24.

 

DB Tool: PgAdmin4

https://www.pgadmin.org/download/pgadmin-4-windows/

 

Download

pgAdmin 4 (Windows) Download Maintainer: pgAdmin Development Team pgAdmin is available for 64 bit Windows™ 7 SP1 (desktop) or 2008R2 (server) and above, up to v4.30. v5.0 and later are supported on Windows 8 (desktop) or 2012 (server) and above. v7.0 and

www.pgadmin.org

 

DB: Postgres

https://www.postgresql.org/download/

 

PostgreSQL: Downloads

 

www.postgresql.org

 


이번 포스팅의 이유는 기존 도커에 띄워놨던 디비가 계속해서 로그 관련해서 망가지는 일이 발생했고

마땅한 해결책을 찾을 수 없어서 결국 호스트 PC에 그냥 깔기로 했다. 

 

호스트 PC에 로컬 DB 설치를 마치고 

도커에 띄워진 APP에서 호스트 PC의 DB와 연결하려고 하던 찰나 처음보던 에러가 떴다.

 

문제

db 연결 에러

 

원인 추측

로컬에서 db툴로 연결테스트를 했을 때는 잘만되던게 왜 안되는걸까 하고 생각해보다가 늘상 하던 대로 도커에 띄워진 db와 도커에 띄워진 app간의 연결이 아닌 호스트에 설치된 db와 도커에 띄워진 app간의 연결이어서 그런 것 같았다.

시도해본 것

방화벽 해제

어라라? 방화벽 문제인가?

열심히 방화벽을 풀어보았지만 이 문제도 아니었다.

 

Telnet, Ping 테스트

맨 처음엔 무작정 cmd에 ipconfig를 쳐서 ip를 확인하고 ip를 넣어주면 해결이 될 것 같았다.

왜냐, 도커 내부에서도 telnet을 쳐보거나 ping을 쳐봐도 해당 ip로 접속이 되고 ping이 잘갔기 때문이다.

이 문제도 아니었다.

 

Postgres 내부 설정

하지만 복병은 Postgres 내부에 있었다.

Postgres는 Default 설정이 내부 접속만 가능하게 되어있다. 기본적으로 외부 ip를 막아놓았다.

그리고 이를 두개의 conf파일을 수정해야 접속되도록 되어있었다.

호스트에 띄워져 있다 한들 도커 또한 외부로 보는 것이다.

 

두가지 conf파일을 수정해야하는데 기본 경로는 아래와 같다

C:\Program Files\PostgreSQL\16\data\

 

여기서 찾아야할 두가지 설정파일은 다음과 같다.

 

1.postgresql.conf

2.pg_hba.conf

 

각각의 파일에서 설정해줘야하는데

 

1.postgresql.conf 에서는 

 

listen_addresses = '*'

가 주석처리 되어 있지 않은지 체크만 하면 된다.

 

2.pg_hba.conf 설정법은 아래 설정 맨 아래에 본인이 추가하고자 하는/ 허용하고자 하는 ip를 적는 것이다.

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     scram-sha-256
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     scram-sha-256
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256

 

참고할만한 블로그는 아래에 있다.

https://pamyferret.tistory.com/26

 

[ PostgreSql ] 외부 접속 IP White List 설정하기

GIS 회사에 다니다보니 기본 DB는 PostgreSql을 많이 사용한다. (PostGis 함수 사용과 geometry 컬럼 타입 사용을 위해서) 그러다보니 PostgreSql의 이런저런 설정들도 하게 되는데 서버에 설치되어 있는 Postg

pamyferret.tistory.com

 

다시 말하지만 Postgres에서 열어주는 것은 IP 리스트로

본인에게 접근할 수 있는 IP를 열어주는 것이다.

한마디로 

 

호스트 PC를 가리키는 IP 주소를 열어놓는 것

 

여기서 도커의 ip를 적고

도커에서는 host의 ip를 적고 하는 개념이 아닌

도커가 HOST PC를 접근할 수 있는 ip를 적는 것이다. 당연하게도 Host PC의 ip가 되는 것이다.

 

만약 아래와 같이 추가한다고 가정하면

host	all	all	123.456.789.10/32	md5

 

저 ip는 외부로부터, 이 경우에는 도커, 접근이 가능하도록 열어준 것이다.

 

필자의 경우는 virtual box ip로 기존에 쓰고 있었던 Host-only Ethernet Adapter ip를

외부 접속 가능 ip로 열어주고 도커에서 저 ip로 접근하도록 설정했다.

 

wifi 주소랑 Host-only Ethernet Adapter ip 중에 후자를 택한 이유는 불변성 때문이다.

wifi 주소는 바뀔 수 있다. 특히나 사옥 이전을 앞두고 있는 지금 시점에는 더더욱 그렇다.

Virtual Box의 Host-only Ethernet Adapter ip 경우 DHCP 서버를 체크해제했고

수동으로 고정 IP를 지정해줬기 때문에 바뀔 확률이 현저히 적다. 

 

그래서  Host-only Ethernet Adapter ip로 지정해두면 호스트 pc를 가리키면서도

바뀌지 않을 ip로 정해놨기 때문에 또 추가로 ip를 변경해야할 귀찮음을 줄일 수 있다.