알아가기/Docker

[Docker] 내부망 MySQL 접속 주소. 2003, "Can't connect to MySQL server on 'localhost' ([Errno 99] Cannot assign requested address)"

XEV 2023. 12. 20. 20:54

 

오류 메시지

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 99] Cannot assign requested address)")
(Background on this error at: https://sqlalche.me/e/20/e3q8)

 

 

이 오류를 해결하면서..

Docker의 내부와 외부 환경을 어느 정도 이해하고 있었지만 데이터 베이스를 가져오는 과정에서 왜 내부 연결을 이용하는지 의아한 부분이다.

로컬 환경에서 Docker container를 개별 생성하면 경험상 지정한 외부 포트로 데이터가 전달된다. 만약 내부망을 이용하고자 한다면 docker network를 만들어 사용했다. 하지만, 개별 Docker container 환경일지라도 sqlalchemy, pymysql을 사용하게 되면 내부망을 이용하는 것으로 생각된다. 해결 방법이 그러했기 때문이다.

이 부분은 Docker를 더욱 공부해 보면서 알아 나가야 할 것이다.

 

 

 

해결 방법

오류를 해결하기 위해서 "localhost" 또는 "127.0.0.1"로 설정한 위치를 "host.docker.internal"로 지정한다.

Raspberry Pi 서버로 만들어 놓은 "192.168.1.123:3306" 접속은 원할하게 되었지만, 어째서 "localhost"에서는 되지 않는지 많이 생각하고 헤매었다. Docker 내부망으로 연결된다는 조금의 생각도 없이..

 

DATABASE = "mysql+pymysql://root:mypassword@192.168.1.123:3306/mydatabase"
DATABASE = "mysql+pymysql://root:mypassword@localhost:3306/mydatabase"
DATABASE = "mysql+pymysql://root:mypassword@host.docker.internal:3306/mydatabase"

    "192.168.1.123": 라즈베리파이 서버 MySQL(Docker) 접속 Success.

    "localhost": 컴퓨터 MySQL(Docker) 접속 Fail.

    "host.docker.internal": Docker 내부 MySQL(Docker) 접속 Success.

 

 

"host.docker.internal" 기억해 두자.