서버 운영 환경에서 Database는 가장 중요한 구성 요소 중 하나입니다.
일반적인 서비스 구조는 다음과 같습니다.
사용자
↓
Web Server
↓
Application Server
↓
Database
↓
Storage
Docker Compose에서는 Database도 하나의 Container Service로 구성할 수 있습니다.
기존 Database 설치 방식:
서버 접속
↓
MySQL 설치
↓
설정 변경
↓
사용자 생성
↓
권한 설정
문제:
- 서버마다 설정 차이 발생
- 환경 이전 어려움
- 복구 과정 복잡
Docker Compose 방식:
docker-compose.yml
↓
MySQL Image
↓
Database Container 생성
↓
Volume 연결
↓
서비스 실행
장점:
- 동일한 환경 재현 가능
- 서버 이전 편리
- 설정 관리 쉬움
- Backup 구조 구성 가능
이번 글에서는 Docker Compose를 이용한 MySQL Container 구성부터 환경 변수 설정, Volume 연결, Application 연결, 운영 서버 관리 방법까지 알아보겠습니다.
Docker Compose MySQL 구조 이해하기
Docker Compose에서 MySQL은 하나의 Service로 정의합니다.
기본 구조:
services:
database:
image: mysql:8
구조:
MySQL Image
↓
MySQL Container
↓
Database 실행
하지만 Production 환경에서는 추가 설정이 필요합니다.
필수 구성:
- Root Password
- Database 이름
- User 설정
- Volume
- Network
- Port 관리
Docker Compose MySQL 기본 설정
docker-compose.yml:
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: app
MYSQL_USER: user
MYSQL_PASSWORD: userpassword
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
구조:
MySQL Container
↓
mysql-data Volume
↓
Database 데이터 저장
실행:
docker compose up -d
확인:
docker compose ps
결과:
mysql
running
3306 port
Docker Compose MySQL 환경 변수 설정
MySQL은 초기 실행 시 Environment 값을 사용합니다.
주요 변수:
MYSQL_ROOT_PASSWORD
Root 계정 비밀번호
예:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE
자동 생성 Database
예:
MYSQL_DATABASE: app
MYSQL_USER
일반 사용자 생성
예:
MYSQL_USER: appuser
MYSQL_PASSWORD
사용자 비밀번호
예:
MYSQL_PASSWORD: password
Docker Compose MySQL .env 파일 사용
운영 환경에서는 비밀번호를 직접 작성하지 않는 것이 좋습니다.
.env:
MYSQL_ROOT_PASSWORD=rootpassword
MYSQL_DATABASE=production
MYSQL_USER=admin
MYSQL_PASSWORD=securepassword
docker-compose.yml:
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
구조:
.env
↓
Docker Compose
↓
MySQL Container
Docker Compose MySQL Volume 연결
Database는 반드시 Volume 사용을 권장합니다.
설정:
volumes:
- mysql-data:/var/lib/mysql
의미:
MySQL 데이터
↓
Volume 저장
↓
Container 삭제 후 유지
확인:
docker volume ls
결과:
mysql-data
Docker Compose MySQL Container 접속
Container 내부 접속:
docker compose exec mysql bash
MySQL 접속:
mysql -u root -p
Database 확인:
SHOW DATABASES;
사용자 확인:
SELECT user FROM mysql.user;
Docker Compose Application과 MySQL 연결
실제 서비스에서는 Application Container가 MySQL에 연결합니다.
구조:
Application Container
↓
Docker Network
↓
MySQL Container
설정:
DB_HOST=mysql
DB_PORT=3306
DB_NAME=app
DB_USER=user
DB_PASSWORD=password
중요:
DB_HOST는:
잘못된 방식:
localhost
올바른 방식:
mysql
이유:
Container 내부 localhost는 자기 자신을 의미하기 때문입니다.
Docker Compose MySQL Network 구성
예:
services:
app:
image: my-app
networks:
- backend
mysql:
image: mysql:8
networks:
- backend
networks:
backend:
구조:
Application
↓
backend Network
↓
MySQL
Docker Compose MySQL Port 관리
Database Port는 외부 공개를 신중하게 해야 합니다.
개발 환경:
ports:
- "3306:3306"
외부 접속 가능:
Server:3306
Production 권장:
expose:
- "3306"
구조:
Application
↓
MySQL
(외부 비공개)
Docker Compose MySQL 백업 방법
Database 백업:
docker compose exec mysql \
mysqldump -u root -p database_name \
> backup.sql
결과:
MySQL Database
↓
backup.sql 생성
복원:
docker compose exec -T mysql \
mysql -u root -p database_name \
< backup.sql
Docker Compose MySQL 데이터 확인
Volume 확인:
docker volume inspect mysql-data
Container 확인:
docker inspect mysql-container
로그 확인:
docker compose logs mysql
Docker Compose MySQL 업데이트 방법
Image 업데이트:
docker compose pull mysql
재실행:
docker compose up -d
주의:
Database 업데이트 전 반드시 Backup 필요
업데이트 과정:
Backup
↓
Image Update
↓
Container 재생성
↓
데이터 확인
Docker Compose MySQL 운영 Best Practice
Production 추천:
Database:
- Volume 사용
- 정기 Backup
- Password 분리
- Port 외부 공개 최소화
- Version 고정
예:
mysql:8.0
권장
비추천:
mysql:latest
Docker Compose MySQL 장애 대응
MySQL Container 실행 실패
확인:
docker compose logs mysql
확인:
- Password 설정
- Volume 권한
- Port 충돌
Database 연결 실패
확인:
DB_HOST
DB_PORT
User
Password
데이터 손실 위험
확인:
docker volume ls
Volume 존재 여부 확인
자주 묻는 질문
Docker Compose에서 MySQL을 운영할 수 있나요?
가능합니다.
개발 환경부터 소규모 Production 서버까지 많이 사용됩니다.
MySQL 데이터는 Container에 저장되나요?
권장하지 않습니다.
Volume을 연결하여 관리해야 합니다.
Application에서 MySQL 주소는 무엇으로 설정하나요?
Compose Service 이름을 사용합니다.
예:
mysql
MySQL Port를 외부에 공개해야 하나요?
Production에서는 일반적으로 공개하지 않고 내부 Network로 연결합니다.
마무리
Docker Compose MySQL 구성은 Container 기반 서버 운영에서 가장 많이 사용하는 Database 구성 방식입니다.
중요한 부분은 다음과 같습니다.
MySQL Container
↓
Volume 데이터 저장
↓
Network 연결
↓
Application 연동
↓
Backup 관리
이 구조를 이해하면 Docker Compose 기반 서비스 운영의 기본 Database 환경을 구축할 수 있습니다.
다음 글에서는 다른 대표적인 관계형 Database인 Docker Compose PostgreSQL 구성 방법을 알아보겠습니다.