Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FIX]도커 이미지 DB연결 오류 해결 #1

Open
vcho1958 opened this issue Dec 18, 2021 · 4 comments
Open

[FIX]도커 이미지 DB연결 오류 해결 #1

vcho1958 opened this issue Dec 18, 2021 · 4 comments
Assignees

Comments

@vcho1958
Copy link

vcho1958 commented Dec 18, 2021

조나한은 잘 됐다고 하셨었으니 윈도우에만 해당되는 오류일 수 있습니다. 모두 해결하고 생각해보니
아무래도 start.sh에서 docker-compose로 이미지들을 묶는 과정에서 이미지별로 compose파일을 올리다보니
에러가 발생한 것 같기도하네용.. 이미지 명도 도메인으로 사용 해도 된다고 알고있긴한데
작업하다보니 헷갈려서 cmi prefix달려있는 컨테이너 명으로 작업했습니다.

MySQL : Host '컨테이너 private 주소' is not allowed to connect to this MySQL Server
image
원인:

  • 도커 컨테이너는 private ip가 무작위로 배정됩니다.
  • DB컨테이너가 api서버 컨테이너와 같은 네트워크에서 동작하는 게 아니었습니다.
  • 컴포즈 파일 하나에 모든 컨테이너가 있는 게 아니라 여러개의 컴포즈를 로드하기 때문에 default네트워크가 생성되지 않았습니다.
    참고자료
    image

중간 사고과정:

  • 테이블에 접근권한이 없어서 그런 것인가? ->init 쿼리 파일에
    GRANT ALL PRIVILEGES ON *.* TO root@'ip주소' IDENTIFIED BY '비밀번호'' WITH GRANT OPTION;을 추가한다.
    api에서만 접근하므로 컨테이너만 한정할 수 있는 방법이 없을까?
    -> 도커 연습 레포 에서 links로 비슷한 오류를 해결했으나 개념이 잘 기억나지 않아 블로그 추가 자료에서 정보를 얻은 후 위 grant절 ip주소에 적용.
    -> root 계정 생성 시 와일드 카드로 모든 접근을 허용하고 root로 접속하는데 테이블 권한 문제일리가 없었다
    -> 해당 상태에서 grant절을 제거해도 정상 접속확인됨.
    -> 확인해보니 도커 연습 레포와 달리 쉘스크립트에서 이미지를 따로 따로 묶는 형태여서 그런지 run시 default네트워크가 생성되지 않았음.
    -> 같은 네트워크가 아니어서 인/아웃바운드 설정이 필요했던 것으로 원인이 판명됨
    -> 인/아웃바운드를 수동으로 설정하는 것보다 그냥 links 추가로 같은 네트워크로 묶는 게 효율적 + links 사용 시 설정된 컨테이너에서만 링크된 컨테이너 이름을 도메인처럼 사용가능하므로 network로 설정했을 때보다 접속 범위를 좁혀 보안적인 측면에서 이점이 있을 것 같음.

image
image
image
image

단점은 기타 설정 시 컨테이너에만 접근 설정을 하게되면 보안측면에선 좋지만 외부에서 HeidiSQL같은 프론트 소프트웨어로 접속하기가 힘들다.

@vcho1958
Copy link
Author

vcho1958 commented Dec 18, 2021

Mongo역시 connection refused 에러가 발생했고 이는 env파일의 host가 localhost로 돼있고 api컨테이너와 mongo 컨테이너가 분리돼있기 때문에 localhost로 접근이 불가능해서 발생하는 문제였다.

env의 mongo-host를 cmi-mongo로 변경 후 해결됐으나 아래와 같은 오류가 발생.
image

빌드과정과 init 파일을 보니
image

image
env에 등록된 db네임인 mongo와 일치하지않아 env의 DATABASE를 test로 변경함

그러나 똑같음. 검색해보니 커넥션의 아이디 비밀번호가 틀려서 그렇다는데 콘솔로그로 확인해봤으나
image
image
주소의 아이디 비밀번호는 잘 적용되며 이상 없었음.

root 및 root비밀번호로 시도해도 현상유지.

아예 아이디 비밀번호를 주소에서 빼버리니 정상동작. <- 인증과정 적용된 게 아니기에 기각, conf.d에 security설정 필요해보임

image
image
빌드과정 중에서는 db에 계정 추가 됐다고 하는데 해당 오류메세지에서는 계정이 없다고 함.

추가조치:

  • init도중 insertMany가 콜렉션이 아니라 db에서 실행돼 에러발생 -> mongo도 트랜잭션 롤백이 되나? -> 오류 해결해봤으나 아니었음
  • init 종료 시점에 따로 커밋과 유사한 역할을 하는 명령이 필요한가? -> 찾아보니 없었음

@vcho1958
Copy link
Author

vcho1958 commented Dec 18, 2021

docker CLI로 접속해서 db조회해봤더니
db는 admin과 cbnu-alrami 및 기타 기본 db가 있었고
db.auth()로 root계정 전환후 admin에서 조회해보니 init때 만들어졌어야하는 계정이 없었습니다.
이후 use cbnu-alrami로 전환한 후
collectionNames로 조회해보니 test가 있었고
이 때 왜 계정 생성할 때 db에 콜렉션 이름을 넣고 있었는지 의문이 들었습니다.
env파일과 init 스크립트 수정 후 잘 되는 것을 확인했습니다.
image
image

계정만들 때 오류는 나지 않았던 것을 보아 db목록에 해당 db가 없으면 댕글링상태가 되나봅니다.
또 config파일에서 아래와 같이 객체프로퍼티로 아이디 비밀번호를 설정할 수도 있다는 사실을 알았습니다.
비밀번호 틀릴 때 authentication failed 오류 발생하는 거 확인했습니다.
image

추가 : Dbname은 적용이 안되네요. uri에 포함해야하나봐요.

@JeongHyeongKim
Copy link
Contributor

나머지는 집가서 자세히 보겠습니다.

첫번째 댓글에서 제가 따로 link 또는 depend_on을 하지 않은것은 의도되었습니다.
docker만으로 실행할 수 있는 환경과, 디비만 띄워놓고 yarn을 이용하여 로컬 프로세스 형식으로 실행할 수 있는 환경 2가지를 모두 이용 가능하게 하고싶었어요!

몇몇개는 제가 집에서 조금 더 보고 코멘트 달게용

@vcho1958
Copy link
Author

vcho1958 commented Dec 19, 2021

@JeongHyeongKim 넵넵 알겠습니다! 혹시 도커용 환경변수와 로컬 yarn용 환경변수 파일을 두개로 분리하고 NODE_ENV로 모드 지정하여 실행할 수 있게 하면 어떨까요?
실행 커맨드에 NODE_ENV=dock_dev 하면 .env.dock파일을 환경변수로 로드하고 NODE_ENV=dev로 하면 .env로 로드하게 한 후 package.json에서 스크립트로 지정해주는 방식,
아니면 환경변수는 .env로 통일하나 NODE_ENV가 dev일 때는 환경변수 불러올 때 삼항연산자로 호스트관련 변수에만 localhost를 불러오게 하는 방식도 제안해보고 싶습니다.
MYSQL_HOST가 이미지 명으로 돼있던 것을 보아 도커에 이미지를 올려 사용하는 것 같아서 mysql쪽 도커만 올리고 로컬에서 yarn으로 api서버를 실행 하면 mysql측은 무난히 실행됐지만(start.sh로 하면 cmi-api컨테이너에서 저 맨 위 오류발생하면서 안됐어요. 바로 발생하진않고 컴파일 완료 후 nest어플리케이샨 실행되고 한 1분정도 기다려야 떠서 오류를 확인하기 힘들긴했습니다. 런타임 에러여서 그런가봐요.) 저는 몽고쪽은 두 환경(로컬 몽고 포함) 모두 다 정상동작하지 않았습니다. test라는 db를 초기화하는 과정은 어디에도 없었는데 아마 몽고에 test라는 db가 미리 생성되어있으셔서 되지 않으셨나 감히 추측해봅니다...
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants