Docker로 Spring Boot와 MySQL을 함께 실행할 때,
**“DB 연결이 되지 않는다”**는 오류를 한 번쯤 경험해보셨을 겁니다.
이번 포스팅에서는 그 원인과 해결 방법을 간단하게 정리해보겠습니다 ⚙️
컨테이너에서 실행 시 연결이 안 되는 이유

Spring Boot 애플리케이션을 컨테이너로 실행하면,
호스트 환경의 localhost와는 완전히 분리된 네트워크 공간에서 동작하게 됩니다.
즉,
- 호스트 컴퓨터의 localhost:3306은
Spring Boot 컨테이너 입장에서는 존재하지 않는 주소입니다. - 각 컨테이너는 자신만의 IP 주소와 네트워크를 가짐으로써,
서로 직접 접근할 수 없습니다.
결국 아래 구조처럼
Spring Boot → MySQL로의 연결이 localhost를 기준으로는 불가능한 것이죠.
잘못된 DB 설정 예시
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: pwd1234
driver-class-name: com.mysql.cj.jdbc.Driver
위 설정은 호스트 기준의 주소를 사용하고 있기 때문에,
컨테이너 내부의 Spring Boot 애플리케이션이
자신 내부에서 localhost:3306을 찾으려다 실패하게 됩니다.
그럼 어떻게 해결할까?
정답은 바로 —
Compose에서 정의한 service 이름을 사용하면 된다!
Docker Compose에서는 컨테이너 간 통신 시
서비스 이름이 곧 컨테이너의 “호스트 이름(hostname)” 역할을 합니다.
올바른 DB 설정으로 수정하기
spring:
datasource:
url: jdbc:mysql://my-db:3306/mydb
username: root
password: pwd1234
driver-class-name: com.mysql.cj.jdbc.Driver
여기서 my-db는 compose.yml에 정의된 MySQL 서비스 이름입니다.
compose.yml 예시
services:
my-server:
build: .
ports:
- 8080:8080
depends_on:
my-db:
condition: service_healthy
my-db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: pwd1234
MYSQL_DATABASE: mydb
volumes:
- ./mysql_data:/var/lib/mysql
ports:
- 3306:3306
healthcheck:
test: ["CMD", "mysqladmin", "ping"]
interval: 5s
retries: 10
포인트
- my-server가 실행되기 전,
my-db가 정상적으로 실행(healthy)되었는지를 확인 - my-db → service 이름이며, 컨테이너 간 통신 시 호스트명 역할
정리하면
Docker Compose의 네트워크 구조를 이해하면
컨테이너 간 통신 문제는 훨씬 쉽게 해결됩니다.
Spring Boot와 MySQL을 함께 띄울 때는
“localhost” 대신 서비스 이름으로 접근한다는 점만 기억하세요! 🐳
'컨테이너·워크플로우 자동화 > DocKer 기본 및 활용' 카테고리의 다른 글
| Docker 컨테이너에서 exit와 Ctrl + P + Q 차이 정리 (0) | 2026.02.16 |
|---|---|
| Docker restart 정책에서 unless-stopped의 의미와 동작 방식 (0) | 2026.02.07 |
| Spring Boot와 MySQL 컨테이너를 함께 실행하기 (0) | 2025.10.12 |
| Docker Compose로 MySQL, Redis 컨테이너 동시에 띄워보기 (0) | 2025.10.12 |
| Docker Compose에서 build와 --build의 차이 이해하기 (0) | 2025.10.12 |