TroubleShooting & Study/Infra

[Docker] ERROR 1045 (28000) : Access denied for user 'root'@'localhost' 해결 방법 총 정리

DH_0518 2024. 8. 16. 01:37

으아아아아아아아악

 

해커톤 당일 12시가 넘어서 기획이 끝이 나고, 부랴부랴 aws 계정 만들고(몰랐는데 기존에 사용하던 네이버, 구글 계정을 죄다 aws 계정으로 만들었다 삭제해 둔 상태였다. 분명 몇 달 지나면 다시 사용할 수 있다고 들었는데, 이미 사용하고 있는 이메일이라고 사용 거부당했다. 그래서 구글 계정부터 새로 만든다고 한 시간을 날려먹었다. 이런 부분을 미리 확인했어야 했는데.. 나란 놈 멍청한 놈) dockerhub 계정도 만들고, github actions workflows도 작성하고, 마지막으로 ec2에 접속해서 docker-compose.yml를 작성했다.

 

세팅은 끝이 났고 mysql workbench에 들어가서 db 연결한 후, 열심히 으쌰으쌰 코드 작성하고 push만 하면 끝~~~~인 줄 알았는데..

 

'Access denied for user 'root'@'localhost' 

에러가 발생했다..

 

여러 방법을 시도해보고 커뮤니티에 질문도 했지만 문제를 해결할 수 없었고, 일단 docker-compose가 아니라 docker run image를 사용해서 수동으로 실행시켜서 해커톤을 마무리 지었다

 

그리고 해커톤이 끝나고 13시간 풀수면을 마친 후, 다시 생각이 나서 이것저것 시도해 보다가 문제점을 발견했고, 해결 방법을 공유하고자 글을 써본다

 

 

 

 

 

 

(** Infra는 환경에 따라 해결 방법이 천차만별이기에 저와 환경이 너무 다르다면 도움이 되지 않을 수도 있습니다!!)

내 환경

- aws ec2 ubuntu

- docker v27.1.1

- docker-compose v2.29.1

- mariadb v10.6

 

시도해봐야 할 것

 

 

 

내 경우는 특수한 경우일 수도 있으니 내가 시도해 봤던 다른 방법들을 먼저 확인해 보길 바란다

  1. DB log 확인하기
    • docker logs 'DB 컨테이너 이름'을 통해서 DB 로그를 먼저 확인하자. 나의 경우도 DB 로그를 통해 힌트를 얻어서 문제를 해결할 수 있었다
  2. pw 환경변수 주입 확인하기
    • Access denied for user 'root'@'localhost' (using password: YES) -> using password: YES 로그가 떴다면
      mysql -u root -p를 사용해서 접속을 시도했을 것이다
    • 그런데 만약 db 컨테이너를 실행시킬 때, 환경변수로 root_password를 넣어주지 않았다면 pw가 없는 게 맞다.
      따라서 mysql -u root로 패스워드 없이 접속을 시도해 보거나, mysql -uroot -p 이후 비밀번호 입력 없이 enter만 쳐서 접속해 보자
  3. pw에 공백이 없나 확인하기
    • pw를 환경변수로 주입해 줄 때, 공백이 들어가는 경우가 간혹 있다. 특히 docker compose를 이용할 때 더욱 그렇다. 다시 한번 확인해 보자
  4. volume 삭제하기
    • 혹시나 이전에 실행했던 db 볼륨이 살아있다면 꼬일 수도 있으니 볼륨을 삭제해 주자
    • docker compose를 사용해서 실행하는 유저라면, docker-compose down -v 명령어를 사용하여 쉽게 제거할 수 있다
  5. 이미 동일한 DB가 실행되고 있는 건 아닌지 확인하기
 

MySQL ERROR 1045 (28000): Access denied for user 'root' @'localhost ' (using password: YES) 오류 해결

로컬 서버에서 MySQL을 접속하려고 하였는데 위와 같이 에러가 났다. ERROR 1045 (28000): Access denied for user 'root' @'localhost ' (using password: YES) 이 에러는 비밀번호가 틀렸을 때 발생하는 에러인데 나는 분

jun-codinghistory.tistory.com

 

 

 

 

 

 

 

 

오해할 수 있는 정보

 

 

 

다음은 커뮤니티에 질문하고 받은 답변들 중 오해할 수 있을만한 정보들을 모아봤다. 아마 다음 방법들은 시도해도 여전히 같은 에러를 뱉어낼 것이므로 다른 방법들을 시도해 보자

  • 권한이 없으니 권한을 설정해야 한다
    • Access denied for user 'root'@'localhost'라는 에러를 보면 알 수 있듯이, 우리는 이미 'root'로 접속을 하려 하고 있다.
      'root' 계정은 일반 계정과 다르게 관리자 권한이라 이미 db의 모든 권한을 가지고 있다.
    • 따라서 권한 문제는 아니다
  • db 접속할 때 mysql 대신 mariadb를 입력해야 한다 / 환경변수 설정할 때 MARIADB_ROOT_PASSWORD가 아니라 MYSQL_ROOT_PASSWORD라 해야한다
    • mysql -uroot -p가 아니라 mariadb -uroot -p로 해야 한다는 말이 있는데, 전혀 아니다. 둘 다 똑같이 작동한다
    • 마찬가지로 환경변수 설정할 때 MARIADB_ROOT_PASSWORD로 설정해도 된다
  • db 컨테이너에 접속할 때 docker exec -it db이름 mysql -uroot로 해야 한다
    • docker exec -it db이름 bash, 이후에 mysql -uroot로 해도 똑같다

 

 

 

 

 

 

 

내 해결 방법

 

 

 

먼저 결론적으로 나는 환경변수 주입이 제대로 이루어지지 않아서 발생한 문제였다. docker logs 'DB이름'을 통해서 DB 로그를 확인해 본 결과, 다음의 문구를 발견할 수 있었다

DB 로그

 

그렇다. root 계정의 비밀번호가 설정되어있지 않다는 것이다. 도대체 무슨 짓을 했길래 root 비밀번호가 제대로 들어가지 않았는지 확인해 보자

 

 

먼저, 내가 ec2에서 docker-compose를 사용해서 db를 띄우는 과정을 봐야 한다. 나는 다음 순서대로 db를 실행시킨다

  1. ec2에 접속해서 sudo -i를 통해 root 계정으로 전환한다
  2. docker 홈페이지 docs에 따라 docker를 install 한다 (https://docs.docker.com/engine/install/ubuntu/)
  3. apt-get update -> apt-get install docker-compose를 통해 docker-compose를 설치한다
  4. apt-get install vim으로 vim을 설치한다
  5. vi docker-compose.yml을 통해 docker-compose 파일을 생성하고, docker-compose up -d를 통해 DB 컨테이너를 실행한다
  6. mysql workbench와 DB를 연결한다

 

수정 전 docker-compose.yml 은 다음과 같다

수정 전 docker-compose.yml

 

 

 

 

Issue 발생

 

그런데 1번부터 5번까지 과정을 모두 거친 후, docker-compose up -d를 했는데 다음과 같은 에러가 발생했다.

docker-compose up 에러

 

열심히 구글링을 한 결과 ec2에 설치된 docker와 docker-compose의 버전 호환 문제라는 걸 알게 되었고, 다음 블로그를 참고하여 해결했다 (https://dcloud.tistory.com/237)

 

지금 당장 운영하고 있는 서비스에서도 사용하던 방법이 왜 갑자기 버전 호환 문제가 일어났냐?

 

당연히 버전은 계속 업데이트 되니까..ㅋㅋㅋㅋㅋㅋ;

 

지금 운영되고 있는 ec2에 접속해서 docker 버전을 확인해 보니 v24였다. 그러나 내가 해커톤을 진행하면서 docker 홈페이지 docs에 따라 설치한 docker 버전은 27이었다.

 

어쨌든 그렇게 docker를 다운그레이드 하기보다는, apt-get install을 통해서 설치한 docker-compose 버전이 1.27 버전인가? 엄청 옛날 버전이기에, docker-compose를 업그레이드했다. 그 결과 docker-compose는 v2.29 !!

 

그리고 workbench에서 db를 연결했는데 access가 denied 됐단다.

 

????

 

ec2에서 docker exec -it master-db bash, mysql -uroot -p를 통해 접속하려 하니 다음의 에러를 마주치게 된다

으아아아아아아아악2

 

이후에 여러 커뮤니티에 질문도 하고, 구글링도 하고, 채찍피티를 열심히 채찍질도 하였지만.. 해결을 하지 못하고 결국 db 컨테이너를 내린 후, docker run --name master-db -e MARIADB_ROOT_PASSWORD=**** mariadb:10.6를 통해 수동으로 실행해서 급한 불을 껐다..

 

 

 

해결방법

 

그래서 내가 안 됐던 이유가 뭐냐? 바로 버전 문제였다.

버전 문제는 아까 docker-compose를 upgrade 시키면서 해결한 것 아닌가? 싶을 수도 있지만, 결론적으로 내가 사용하던 docker-compose.yml 설정이 docker-compose 버전이 올라가면서 사용할 수 없게 된 부분이 있던 것이다.

 

그 부분은 환경 변수를 주입할 때 '-'를 꼭 넣어줘야 한다는 것이다

 

수정 후 docker-compose를 보면 알 수 있듯이, environment: 이후 root pw 설정과 tz 설정 부분에서 '-'를 추가해 주니 정상적으로 db 접속이 가능해졌다 

수정 후 docker-compose.yml

 

 

커뮤니티에서 한분이 '환경변수 설정할 때 -를 붙여보세요!'라고 귀한 조언을 해주셨지만, 새벽 2시에 지칠 대로 지친 상태에, 이미 말끔히 잘 돌아가고 있는 서버의 docker-compose를 긁어왔으니 별 다를 게 있겠나.. 싶어서 귀담아듣지 않았던 게 화근이었다 ㅠㅠ

 

충분히 수면을 취한 이후 갑자기 저 말이 떠올라서 DB log를 찍어보니 pw 설정이 제대로 되어있지 않다는 것을 확인했고, docker-compose.yml을 수정하여 해결할 수 있었다.

 

 

뭔가.. '-' 하나로 새벽에 두 시간 동안 난리를 피웠던 게 정말 억울하고 원통하기도 하지만, DB 로그 안 찍어본 내 잘못이고, 이런 사소한 에러 하나 빨리 처리 못한 내 실력을 탓해야지 누굴 탓하겠는가?

 

부디 이 글을 읽는 분들은 나와 같은 실수를 하지 않기를 바란다..!

그럼 20000!!