Docker Compose MySQL 구성 완벽 가이드! Database Container 연결과 데이터 관리 방법 알아보기

서버 운영 환경에서 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 구성 방법을 알아보겠습니다.

댓글 남기기