db 연결이 안 되는데요? (Docker 컨테이너에서 호스트 MySQL 연결하기)

elive7·2025년 8월 5일

개발노트

목록 보기
3/11
post-thumbnail

배경

db 백업 및 복원만 하면 문제가 없을 것이라고 생각한 어리석은 나... 하지만 이번에는 서버에 설치한 mysql과 컨테이너가 연결이 안 되는 문제가 발생했다. 여러 삽질 끝에 이 문제를 해결하였는데 그 과정을 기록해보고자 한다.

1. 컨테이너에서 호스트는 localhost가 아닙니다.

처음에 yml에 datasource url을 다음과 같이 작성했다.

url: jdbc:mysql://localhost:3306/<db명>?serverTimezone=UTC&useSSL=false&characterEncoding=UTF-8

나는 컨테이너 안 spring boot에서 호스트에 설치된 mysql과 연결을 하고 싶었다. 하지만,
Docker 컨테이너는 자체적으로 네트워크가 격리된 가상 환경으로 동작하기 때문에, 컨테이너 내부에서 localhost(또는 127.0.0.1)는 컨테이너 자신을 가리킨다.

따라서 컨테이너가 아닌 호스트와 연결하고 싶다면 localhost가 아닌 172.17.0.1을 사용해야 한다. 172.17.0.1은 Docker의 기본 브릿지 네트워크에서 호스트가 가진 IP 주소로, 컨테이너가 호스트에 네트워크 요청할 때 쓰는 표준 경로이다.

따라서 yml 파일을 다음과 같이 수정했다.

url: jdbc:mysql://172.17.0.1:3306/<db명>?serverTimezone=UTC&useSSL=false&characterEncoding=UTF-8

2. mysql bind-address 수정

host의 mysql에서도 컨테이너에서의 요청을 받아들일 수 있도록 설정을 해주어야 한다. MySQL의 설정 파일인 /etc/mysql/mysql.conf.d/mysqld.cnf 에서 bind-address 항목은 MySQL 서버가 어떤 네트워크 인터페이스(IP 주소)에서 들어오는 접속을 받아들일지 지정하는 역할을 한다.

Docker 컨테이너처럼 호스트와 네트워크가 분리된 환경에서 컨테이너 내부에서 호스트의 MySQL에 접근하려고 해도, MySQL이 기본 설정(127.0.0.1)이라면 호스트 자신에게서만 받은 요청만 수락하기 때문에, 컨테이너(외부)의 요청은 모두 차단되는 것이다. 따라서 컨테이너에서 호스트로 접속하려면, bind-address 값을 0.0.0.0로 설정해 모든 네트워크 인터페이스로 오는 접속을 허용해 주어야 한다.

따라서 /etc/mysql/mysql.conf.d/mysqld.cnf 를 다음과 같이 수정해주었다. 이 파일을 수정한 다음에는 sudo service mysql restart로 mysql을 재시작해주어야 한다.

bind-address = 0.0.0.0

3. mysql 사용자 추가

ALTER USER '<아이디>'@'%' IDENTIFIED BY '<비밀번호>';
GRANT ALL PRIVILEGES ON *.* TO '<아이디>'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

모든 IP 주소에서 접속 가능한(즉, 모든 호스트에서 접속 허용) 사용자 계정을 만들어 주어야 한다. 이 설정은 Docker 컨테이너나 외부 네트워크 등, 특정 IP가 아닌 어떤 곳에서도 MySQL 서버에 접속 가능하도록 계정을 열어주는 역할을 한다.

4. 컨테이너 띄워서 접속 확인

docker run -it --rm mysql:8.0 bash
mysql -h 172.17.0.1 -u <아이디> -p


3번까지 진행한 후, 컨테이너를 띄워서 실제로 호스트에 깔린 mysql에 접속이 되는지 확인해보았다. 다행히 연결이 잘 되는 모습을 확인해볼 수 있었다.

참고

profile
펠리컨적 사고 "일단 시도함"

0개의 댓글