왜 Docker 기반 MySQL을 사용하는가?
기존에 Ubuntu에 MySQL을 직접 설치해서 사용하는 방식도 있지만, Docker를 활용하면 훨씬 더 유연하고 효율적인 환경을 만들 수 있습니다.
먼저, 환경 격리가 가장 큰 장점입니다.
Docker 컨테이너를 사용하면 MySQL이 호스트 시스템과 분리된 상태로 실행되기 때문에, 다른 애플리케이션이나 DB와의 충돌을 걱정할 필요가 없습니다.
또한, 설치와 삭제가 매우 간편합니다.
패키지 설치나 설정 파일을 직접 관리할 필요 없이, 컨테이너 하나로 MySQL을 실행하고 필요 없으면 바로 삭제할 수 있습니다.
그리고 버전 관리가 쉬운 점도 큰 장점입니다.
특정 MySQL 버전을 이미지로 명확하게 지정할 수 있기 때문에, 개발/운영 환경 간의 차이를 줄일 수 있습니다.
마지막으로, 이식성과 재현성이 뛰어납니다.
동일한 Docker 이미지를 사용하면 어떤 환경(Ubuntu, Mac, Windows 등)에서도 같은 MySQL 환경을 쉽게 재현할 수 있습니다.
기본 개념 정리
Docker 기반 MySQL을 이해하려면 몇 가지 핵심 개념을 알고 있어야 합니다.
1. Docker 이미지 (Image)
Docker 이미지는 애플리케이션 실행에 필요한 모든 요소를 포함한 일종의 “설계도”입니다.
MySQL의 경우, 공식 MySQL 이미지가 제공되며 이를 기반으로 컨테이너를 생성합니다.
2. Docker 컨테이너 (Container)
컨테이너는 이미지를 실행한 실제 인스턴스입니다.
MySQL 컨테이너를 실행하면, 하나의 독립된 MySQL 서버가 실행된다고 보면 됩니다.
3. 볼륨 (Volume)
컨테이너는 기본적으로 휘발성이기 때문에, 데이터를 영구적으로 저장하려면 볼륨을 사용해야 합니다.
MySQL 데이터 디렉토리를 볼륨에 연결하면, 컨테이너를 삭제해도 데이터는 유지됩니다.
4. 포트 매핑 (Port Mapping)
컨테이너 내부의 MySQL 포트(기본 3306)를 호스트와 연결하는 개념입니다.
예를 들어, -p 3306:3306 옵션을 사용하면 로컬에서 MySQL에 접근할 수 있습니다.
이러한 개념들을 이해하면, Docker 기반 MySQL 환경을 훨씬 수월하게 구성하고 운영할 수 있습니다.
예시 상황: 팀별로 독립적인 MySQL 환경이 필요한 경우
하나의 서버(Ubuntu)를 사용하면서, 두 개의 팀이 각각 MySQL 데이터베이스를 사용해야 하는 상황을 가정해봅니다.
예를 들어,
- team001팀은 사용자 서비스 개발을 위해 MySQL을 사용하고 있고
- team002팀은 데이터 분석 및 내부 관리 시스템을 위해 별도의 MySQL을 사용합니다.
이때 단순히 하나의 MySQL 서버를 설치해서 DB만 나누어 사용하는 방법도 있지만, 다음과 같은 문제가 발생할 수 있습니다.
- MySQL 설정 충돌 (버전, 설정값 등)
- 한쪽 팀의 작업이 다른 팀에 영향을 줄 가능성
- 장애 발생 시 전체 서비스에 영향
- 테스트/운영 환경 분리가 어려움
기존 방식의 한계
Ubuntu에 MySQL을 직접 설치해서 사용하는 경우, 보통 하나의 MySQL 인스턴스를 여러 팀이 공유하게 됩니다.
이 방식은 다음과 같은 한계를 가지게 됩니다.
- 팀별로 완전히 독립된 환경 구성 불가
- 특정 팀이 MySQL 설정을 변경하면 다른 팀에도 영향
- MySQL 버전을 다르게 사용하는 것이 사실상 어려움
- 문제 발생 시 원인 추적이 복잡
Docker + MySQL로 해결하기
이러한 문제를 해결하기 위해 Docker 기반 MySQL 환경을 구성할 수 있습니다.
각 팀은 다음과 같이 독립적인 MySQL 컨테이너를 사용합니다.
- team001팀 → MySQL 컨테이너 (포트 3307)
- team002팀 → MySQL 컨테이너 (포트 3308)
이렇게 구성하면 다음과 같은 장점이 있습니다.
- 각 팀은 완전히 분리된 DB 환경을 사용 가능
- 서로 다른 MySQL 버전 사용 가능
- 장애가 발생해도 다른 팀에 영향 없음
- 필요 시 컨테이너 단위로 빠른 재시작 및 복구 가능
핵심 포인트
Docker를 활용하면 하나의 Ubuntu 서버에서도 다음이 가능합니다.
- 여러 개의 MySQL 인스턴스를 충돌 없이 실행
- 팀/프로젝트 단위로 환경 분리
- 개발, 테스트, 운영 환경을 유연하게 구성
이제 설치를 시작합니다.
MySQL Docker 컨테이너 실행 (team001 / team002)
이제 Docker를 활용하여 팀별로 독립적인 MySQL 컨테이너를 실행해보겠습니다.
1. team001 MySQL 컨테이너 실행
$ sudo docker run -d \
--name mysql-team001 \
-e MYSQL_ROOT_PASSWORD=1234 \
-e MYSQL_DATABASE=team001_db \
-p 3307:3306 \
-v ~/docker/mysql/team001:/var/lib/mysql \
mysql:8.0
- --name mysql-team001 → 컨테이너 이름
- MYSQL_ROOT_PASSWORD → root 비밀번호 설정
- MYSQL_DATABASE → 초기 생성 DB
- -p 3307:3306 → 호스트 3307 포트로 접근
- -v ~/docker/mysql/team001 → 데이터 영속 저장
2. team002 MySQL 컨테이너 실행
$ sudo docker run -d \
--name mysql-team002 \
-e MYSQL_ROOT_PASSWORD=1234 \
-e MYSQL_DATABASE=team002_db \
-p 3308:3306 \
-v ~/docker/mysql/team002:/var/lib/mysql \
mysql:8.0
실행 결과 확인
컨테이너가 정상 실행되었는지 확인합니다.
$ sudo docker ps
예상 결과:
- mysql-team001 → 3307 포트 사용
- mysql-team002 → 3308 포트 사용
MySQL 접속 확인
각 팀의 DB에 접속해봅니다.
team001 접속
$ mysql -h 127.0.0.1 -P 3307 -u root -p
비밀번호: 1234
team002 접속
$ mysql -h 127.0.0.1 -P 3308 -u root -p
비밀번호: 1234
핵심 포인트 정리
- 동일한 서버에서 MySQL 2개를 동시에 실행
- 포트를 다르게 설정하여 충돌 방지 (3307 / 3308)
- 볼륨을 통해 데이터 영속성 확보
- 컨테이너 단위로 완전한 환경 분리
참고 (중요)
- ~/docker/mysql/... 경로는 미리 생성하지 않아도 자동 생성됨
- 비밀번호는 운영 환경에서는 더 안전하게 설정 필요
- MySQL 버전(mysql:8.0)은 필요에 따라 변경 가능
Database Client Tool(DBeaver)을 이용한 MySQL 접속 확인
DBeaver를 실행합니다.

team001 데이터베이스테 접속하기 위해서 새로운 데이터베이스 커넥션을 생성합니다.





SQL Editor를 open 합니다.


DBeaver를 통해 team001 DB에 정상적으로 접속되는 것을 확인했습니다.
team002 또한 동일한 방식으로 접속을 확인할 수 있습니다.
Spring Boot에서 MySQL 접속 설정
Docker로 실행한 MySQL 컨테이너에 Spring Boot 애플리케이션이 접속하려면
application.properties에 다음과 같이 설정합니다.
1. team001 DB 연결 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.0.30:3307/team001_db?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=1234
2. team002 DB 연결 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.0.30:3308/team002_db?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=1234
이번 글에서는 Ubuntu 환경에서 Docker를 활용하여 팀별로 독립적인 MySQL 환경을 구성하고, 실제로 접속까지 확인해보았습니다.
다음 글에서는 데이터 백업/복구 방법과 Spring Boot에서 다중 DB(team001, team002)를 동시에 사용하는 방법에 대해 다뤄보겠습니다.
MySQL 접속 오류 및 해결 : Docker MySQL Public Key Retrieval 오류
Docker에서 MySQL 컨테이너를 stop 했다가 다시 start 한 후, DBeaver로 접속할 때 다음과 같은 오류가 발생할 수 있습니다.
Public Key Retrieval is not allowed

이 오류는 MySQL 8 이상에서 기본 인증 방식(caching_sha2_password)과 관련이 있습니다.
Docker를 재시작하면서 세션 정보가 초기화되거나, DBeaver가 암호화된 비밀번호 키를 가져오는 설정이 되어 있지 않을 때 발생합니다.
해결 방법
1. JDBC URL 옵션 추가
DBeaver에서 접속 시 JDBC URL 끝에 다음 옵션을 추가합니다.
?allowPublicKeyRetrieval=true&useSSL=false
예시:
jdbc:mysql://localhost:3308/dbname?allowPublicKeyRetrieval=true&useSSL=false
이렇게 하면 DBeaver가 기본 인증 방식으로 접속할 수 있습니다.
2. MySQL 사용자 암호 방식 변경
MySQL 컨테이너 내부에서 다음 명령어를 실행합니다.
> ALTER USER 'youruser'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpassword';
> FLUSH PRIVILEGES;
이렇게 하면 DBeaver가 기본 인증 방식으로 접속할 수 있습니다.
3. DBeaver 설정 확인




이렇게 하면 DBeaver가 기본 인증 방식으로 접속할 수 있습니다.
Tip: Docker MySQL을 자주 재시작하거나 여러 환경에서 접속할 경우, JDBC URL 옵션을 추가하거나 사용자 인증 방식을 mysql_native_password로 통일하는 것이 편리합니다.
'spring boot' 카테고리의 다른 글
| Ubuntu(20.04)에서 Docker Spring Boot 앱 앞단에 Nginx 붙이기 (0) | 2026.03.27 |
|---|---|
| Docker 환경 MySQL 데이터 백업/복구 방법 (0) | 2026.03.25 |
| Docker로 배포한 Spring 앱에서 첨부파일을 Ubuntu 디렉터리에 저장하는 방법 (0) | 2026.03.24 |
| react에서 구글로그인 구현-III(feat. spring) (1) | 2024.12.30 |
| react에서 구글로그인 구현-II(feat. @react-oauth/google) (2) | 2024.12.30 |