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

1. Docker란 무엇인가?
Docker는 애플리케이션을 컨테이너라는 표준화된 유닛으로 패키징하는 플랫폼입니다. 컨테이너는 애플리케이션 코드와 그 실행에 필요한 모든 종속성(라이브러리, 시스템 도구, 설정 등)을 포함하고 있어, 어떤 환경에서든 동일하게 실행될 수 있습니다.
MySQL과 같은 데이터베이스를 Docker로 실행하면 다음과 같은 장점이 있습니다:
- 설치 과정이 간단하고 빠름
- 여러 버전의 MySQL을 동시에 사용 가능
- 운영체제에 상관없이 동일한 환경 구성
- 개발 환경을 쉽게 공유하고 재현 가능
- 사용이 끝나면 쉽게 제거 가능
2. Docker 설치하기
먼저 Docker를 설치해 보겠습니다. 운영체제에 따른 설치 방법은 다음과 같습니다.
Windows에 Docker 설치
- Docker Desktop for Windows에서 설치 파일을 다운로드합니다.
- 다운로드한 파일을 실행하고 설치 과정을 따릅니다.
- 설치가 완료되면 Docker Desktop을 실행합니다.
- WSL 2(Windows Subsystem for Linux 2)를 사용하는 것이 권장됩니다.
macOS에 Docker 설치
- Docker Desktop for Mac에서 설치 파일을 다운로드합니다.
- 다운로드한 .dmg 파일을 열고, Docker.app을 Applications 폴더로 드래그합니다.
- 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 |