본문 바로가기
Docker

Docker에 MySQL 테스트를 위한 컨테이너 생성 방법

by 대박플머 2025. 3. 17.

안녕하세요! 이번 글에서는 Docker를 사용하여 MySQL 테스트 환경을 구축하는 방법에 대해 알아보겠습니다. 개발 환경을 쉽고 빠르게 설정할 수 있는 Docker의 장점을 최대한 활용하여, 데이터베이스 테스트 환경을 손쉽게 구축해 보는 실습을 진행하겠습니다.

1. Docker란 무엇인가?

Docker는 애플리케이션을 컨테이너라는 표준화된 유닛으로 패키징하는 플랫폼입니다. 컨테이너는 애플리케이션 코드와 그 실행에 필요한 모든 종속성(라이브러리, 시스템 도구, 설정 등)을 포함하고 있어, 어떤 환경에서든 동일하게 실행될 수 있습니다.

MySQL과 같은 데이터베이스를 Docker로 실행하면 다음과 같은 장점이 있습니다:

  • 설치 과정이 간단하고 빠름
  • 여러 버전의 MySQL을 동시에 사용 가능
  • 운영체제에 상관없이 동일한 환경 구성
  • 개발 환경을 쉽게 공유하고 재현 가능
  • 사용이 끝나면 쉽게 제거 가능

2. Docker 설치하기

먼저 Docker를 설치해 보겠습니다. 운영체제에 따른 설치 방법은 다음과 같습니다.

Windows에 Docker 설치

  1. Docker Desktop for Windows에서 설치 파일을 다운로드합니다.
  2. 다운로드한 파일을 실행하고 설치 과정을 따릅니다.
  3. 설치가 완료되면 Docker Desktop을 실행합니다.
  4. WSL 2(Windows Subsystem for Linux 2)를 사용하는 것이 권장됩니다.

macOS에 Docker 설치

  1. Docker Desktop for Mac에서 설치 파일을 다운로드합니다.
  2. 다운로드한 .dmg 파일을 열고, Docker.app을 Applications 폴더로 드래그합니다.
  3. Applications 폴더에서 Docker를 실행합니다.

Linux에 Docker 설치

Ubuntu를 예로 들어보겠습니다:

# 이전 버전의 Docker 제거
sudo apt-get remove docker docker-engine docker.io containerd runc

# 필요한 패키지 설치
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# Docker 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Docker 저장소 추가
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Docker 설치
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# Docker 서비스 시작
sudo systemctl start docker
sudo systemctl enable docker

# 현재 사용자를 docker 그룹에 추가 (sudo 없이 Docker 사용 가능)
sudo usermod -aG docker $USER

설치가 완료되었는지 확인하기 위해 터미널이나 명령 프롬프트에서 다음 명령어를 실행해 봅니다:

docker --version

다음과 유사한 출력이 표시되면 설치가 성공적으로 완료된 것입니다:

Docker version 20.10.12, build e91ed57

3. MySQL Docker 컨테이너 생성하기

이제 Docker가 설치되었으니, MySQL 컨테이너를 생성해 보겠습니다.

MySQL 이미지 가져오기

먼저 Docker Hub에서 MySQL 이미지를 가져옵니다:

docker pull mysql:8.0

위 명령어는 MySQL 버전 8.0 이미지를 다운로드합니다. 다른 버전을 사용하고 싶다면 태그(예: 5.7)를 변경하면 됩니다.

MySQL 컨테이너 실행하기

다음 명령어로 MySQL 컨테이너를 생성하고 실행합니다:

docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=mypassword -e MYSQL_DATABASE=testdb -p 3306:3306 -d mysql:8.0

이 명령어는 다음과 같은 의미를 가집니다:

  • --name mysql-test: 컨테이너의 이름을 'mysql-test'로 지정합니다.
  • -e MYSQL_ROOT_PASSWORD=mypassword: MySQL root 사용자의 비밀번호를 'mypassword'로 설정합니다.
  • -e MYSQL_DATABASE=testdb: 'testdb'라는 데이터베이스를 자동으로 생성합니다.
  • -p 3306:3306: 호스트의 3306 포트를 컨테이너의 3306 포트에 매핑합니다.
  • -d: 컨테이너를 백그라운드에서 실행합니다.
  • mysql:8.0: 사용할 MySQL 이미지와 버전을 지정합니다.

컨테이너가 잘 실행되었는지 확인해 봅시다:

docker ps

다음과 같은 출력이 표시되어야 합니다:

CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                               NAMES
a1b2c3d4e5f6   mysql:8.0   "docker-entrypoint.s…"   5 seconds ago   Up 4 seconds   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql-test

데이터 볼륨 추가하기 (선택사항)

MySQL 데이터를 컨테이너 외부에 저장하고 싶다면, 볼륨을 추가하여 실행할 수 있습니다:

docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=mypassword -e MYSQL_DATABASE=testdb -p 3306:3306 -v mysql-data:/var/lib/mysql -d mysql:8.0

여기서 -v mysql-data:/var/lib/mysql는 'mysql-data'라는 Docker 볼륨을 생성하고 컨테이너의 /var/lib/mysql 디렉토리에 마운트합니다. 이렇게 하면 컨테이너를 삭제해도 데이터는 보존됩니다.

4. MySQL 컨테이너에 접속하기

이제 생성한 MySQL 컨테이너에 접속해 보겠습니다. 여러 가지 방법으로 접속할 수 있습니다.

컨테이너 내부의 MySQL 클라이언트 사용하기

컨테이너 내부의 MySQL 클라이언트를 사용하여 직접 접속할 수 있습니다:

docker exec -it mysql-test mysql -uroot -pmypassword

명령어 실행 후 MySQL 프롬프트가 표시되면 성공적으로 접속한 것입니다:

mysql>

보안 주의사항: 실제 환경에서는 비밀번호를 명령줄에 직접 입력하는 것은 보안상 좋지 않습니다. -p 플래그만 사용하고 비밀번호는 프롬프트에 입력하는 것이 좋습니다.

호스트 시스템에서 접속하기

호스트 시스템에 MySQL 클라이언트가 설치되어 있다면, 다음과 같이 접속할 수 있습니다:

mysql -h127.0.0.1 -P3306 -uroot -pmypassword

GUI 도구로 접속하기

MySQL Workbench, DBeaver, DataGrip 등의 GUI 도구를 사용하여 접속할 수도 있습니다. 접속 정보는 다음과 같습니다:

  • 호스트: localhost 또는 127.0.0.1
  • 포트: 3306
  • 사용자: root
  • 비밀번호: mypassword (또는 설정한 비밀번호)
  • 데이터베이스: testdb

5. 데이터베이스 및 테이블 생성하기

MySQL에 접속했다면, 간단한 테이블을 생성하고 데이터를 추가해 보겠습니다.

데이터베이스 생성

이미 testdb 데이터베이스가 생성되어 있지만, 새로운 데이터베이스를 만들어 봅시다:

CREATE DATABASE sampledb;
USE sampledb;

테이블 생성

간단한 사용자 테이블을 생성해 보겠습니다:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

데이터 추가

몇 가지 샘플 데이터를 추가해 봅시다:

INSERT INTO users (username, email) VALUES 
('user1', 'user1@example.com'),
('user2', 'user2@example.com'),
('user3', 'user3@example.com');

데이터 조회

추가한 데이터를 조회해 봅시다:

SELECT * FROM users;

다음과 같은 결과가 표시될 것입니다:

+----+----------+-------------------+---------------------+
| id | username | email             | created_at          |
+----+----------+-------------------+---------------------+
|  1 | user1    | user1@example.com | 2023-01-20 12:34:56 |
|  2 | user2    | user2@example.com | 2023-01-20 12:34:56 |
|  3 | user3    | user3@example.com | 2023-01-20 12:34:56 |
+----+----------+-------------------+---------------------+

6. 간단한 MySQL 쿼리 실습

이제 몇 가지 기본적인 MySQL 쿼리를 실습해 보겠습니다.

1. WHERE 절을 사용한 필터링

특정 사용자 정보 조회:

SELECT * FROM users WHERE username = 'user2';

2. 데이터 업데이트

사용자 이메일 변경:

UPDATE users SET email = 'newemail@example.com' WHERE id = 1;
SELECT * FROM users WHERE id = 1;

3. 데이터 삭제

사용자 삭제:

DELETE FROM users WHERE id = 3;
SELECT * FROM users;

4. 새로운 테이블 생성 및 관계 설정

게시물 테이블을 추가해 봅시다:

CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    title VARCHAR(100) NOT NULL,
    content TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

게시물 데이터 추가:

INSERT INTO posts (user_id, title, content) VALUES
(1, '첫 번째 게시물', '안녕하세요, 첫 번째 게시물입니다.'),
(1, '두 번째 게시물', '두 번째 게시물 내용입니다.'),
(2, '안녕하세요', '반갑습니다!');

5. JOIN을 사용한 데이터 조회

사용자와 게시물 데이터를 함께 조회:

SELECT u.username, p.title, p.content
FROM users u
JOIN posts p ON u.id = p.user_id
ORDER BY p.created_at DESC;

7. MySQL 컨테이너 관리

컨테이너 중지 및 시작

컨테이너를 중지하려면:

docker stop mysql-test

나중에 다시 시작하려면:

docker start mysql-test

컨테이너 로그 확인

컨테이너의 로그를 확인하려면:

docker logs mysql-test

컨테이너 삭제

컨테이너를 영구적으로 삭제하려면:

docker rm -f mysql-test

참고: 볼륨을 사용하지 않았다면 컨테이너 삭제 시 모든 데이터가 함께 삭제됩니다.

데이터 백업

컨테이너의 데이터를 백업하는 방법:

docker exec mysql-test sh -c 'exec mysqldump -uroot -p"mypassword" testdb' > backup.sql

백업 데이터 복원

백업 데이터를 새 컨테이너에 복원:

cat backup.sql | docker exec -i mysql-test mysql -uroot -pmypassword testdb

8. 개발 시나리오: 다중 환경 설정

테스트와 개발 환경을 별도로 구성하고 싶을 때는 각각 다른 포트를 사용하여 여러 MySQL 컨테이너를 실행할 수 있습니다:

# 개발 환경
docker run --name mysql-dev -e MYSQL_ROOT_PASSWORD=devpass -e MYSQL_DATABASE=devdb -p 3307:3306 -d mysql:8.0

# 테스트 환경
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=testpass -e MYSQL_DATABASE=testdb -p 3308:3306 -d mysql:8.0

이제 각 환경에 다른 포트로 접속할 수 있습니다:

  • 개발 환경: mysql -h127.0.0.1 -P3307 -uroot -pdevpass
  • 테스트 환경: mysql -h127.0.0.1 -P3308 -uroot -ptestpass

9. Docker Compose로 관리하기

여러 컨테이너를 더 쉽게 관리하려면 Docker Compose를 사용할 수 있습니다. 다음 내용으로 docker-compose.yml 파일을 생성해 봅시다:

version: '3'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql-test
    environment:
      - MYSQL_ROOT_PASSWORD=mypassword
      - MYSQL_DATABASE=testdb
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

이 파일이 있는 디렉토리에서 다음 명령어로 컨테이너를 시작할 수 있습니다:

docker-compose up -d

그리고 다음 명령어로 중지할 수 있습니다:

docker-compose down

10. 결론

지금까지 Docker를 사용하여 MySQL 테스트 환경을 구축하는 방법에 대해 알아보았습니다. Docker를 사용하면 데이터베이스 환경을 쉽고 빠르게 설정하고, 필요에 따라 여러 버전과 환경을 동시에 운영할 수 있습니다.

이 글에서 다룬 내용은 다음과 같습니다:

  • Docker 설치 방법
  • MySQL 컨테이너 생성 및 실행
  • MySQL 데이터베이스 접속 방법
  • 기본적인 데이터베이스 작업 (테이블 생성, 데이터 조작)
  • 컨테이너 관리 (중지, 시작, 삭제, 백업)
  • 다중 환경 설정
  • Docker Compose를 사용한 관리

Docker를 사용하면 "내 컴퓨터에서는 잘 되는데..."라는 문제를 피할 수 있으며, 개발 팀 전체가 동일한 환경에서 작업할 수 있습니다. 또한 실제 운영 환경과 최대한 유사한 테스트 환경을 구축할 수 있어, 개발 과정에서 발생할 수 있는 환경 차이로 인한 문제를 줄일 수 있습니다.

어떤 프로젝트든 테스트와 개발에 Docker를 활용해 보세요. 개발 생산성 향상에 큰 도움이 될 것입니다!

'Docker' 카테고리의 다른 글

Dockerfile 기본 명령어 정리  (1) 2024.12.18
Docker의 원리와 동작 방식  (2) 2024.11.04
Docker 데몬(Docker Daemon)에 대해  (0) 2024.10.21
Docker 컨테이너 명령어 정리  (0) 2024.10.07