컨테이너화된 데이터베이스 사용하기
컨테이너화된 데이터베이스 사용하기 (Use containerized databases)
데이터베이스를 컨테이너로 효과적으로 실행하고 관리하는 방법을 배우는 가이드예요.
출처: 문서
본문
로컬 컨테이너화된 데이터베이스를 사용하면 유연성과 쉬운 구성이라는 장점을 얻을 수 있어요. 전통적인 데이터베이스 설치의 오버헤드 없이도 프로덕션 환경을 밀접하게 미러링할 수 있죠. Docker는 이 과정을 단순화해서, 몇 가지 명령만으로 격리된 컨테이너에서 데이터베이스를 배포·관리·확장할 수 있게 해줘요.
이 가이드에서 배울 내용은 다음과 같아요:
- 로컬 컨테이너화된 데이터베이스 실행하기
- 컨테이너화된 데이터베이스의 셸에 접근하기
- 호스트에서 컨테이너화된 데이터베이스에 연결하기
- 다른 컨테이너에서 컨테이너화된 데이터베이스에 연결하기
- 볼륨에 데이터베이스 데이터 유지(persist)하기
- 맞춤형 데이터베이스 이미지 빌드하기
- Docker Compose로 데이터베이스 실행하기
이 가이드는 예시로 MySQL 이미지를 사용하지만, 이 개념은 다른 데이터베이스 이미지에도 적용할 수 있어요.
사전 요구사항 (Prerequisites)
이 가이드를 따라 하려면 Docker가 설치되어 있어야 해요. Docker를 설치하려면 Get Docker를 참고하세요.
로컬 컨테이너화된 데이터베이스 실행하기 (Run a local containerized database)
MySQL, PostgreSQL, MongoDB를 포함한 대부분의 인기 데이터베이스 시스템은 Docker Hub에 Docker 공식 이미지(Official Image)가 있어요. 이 이미지들은 모범 사례를 따르는 선별된 이미지 모음으로, 최신 기능과 보안 업데이트에 접근할 수 있게 해줘요. 시작하려면 Docker Hub를 방문해 관심 있는 데이터베이스를 검색하세요. 각 이미지의 페이지에는 컨테이너 실행 방법, 설정 커스터마이징 방법, 필요에 맞게 데이터베이스를 구성하는 방법에 대한 자세한 지침이 제공돼요. 이 가이드에서 사용하는 MySQL 이미지에 대한 자세한 내용은 Docker Hub MySQL 이미지 페이지를 참고하세요.
데이터베이스 컨테이너를 실행하려면 Docker Desktop GUI나 CLI를 사용할 수 있어요.
CLI
CLI로 컨테이너를 실행하려면 터미널에서 다음 명령을 실행하세요:
$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -d mysql:latest
이 명령에서:
--name my-mysql은 참조하기 쉽게 컨테이너에my-mysql이라는 이름을 지정해요.-e MYSQL_ROOT_PASSWORD=my-secret-pw는 MySQL의 루트 비밀번호를my-secret-pw로 설정해요.my-secret-pw를 원하는 보안 비밀번호로 바꾸세요.-e MYSQL_DATABASE=mydb는 선택적으로mydb라는 데이터베이스를 생성해요.mydb를 원하는 데이터베이스 이름으로 바꿀 수 있어요.-d는 컨테이너를 분리(detached) 모드, 즉 백그라운드에서 실행해요.mysql:latest는 MySQL 이미지의 최신 버전을 사용하겠다는 뜻이에요.
컨테이너가 실행 중인지 확인하려면 터미널에서 docker ps를 실행하세요.
GUI
GUI로 컨테이너를 실행하려면:
- Docker Desktop 대시보드에서 창 상단의 전역 검색을 선택하세요.
- 검색 상자에
mysql을 지정하고, 선택되어 있지 않다면 Images 탭을 선택하세요. - mysql 이미지에 마우스를 올리고 Run을 선택하세요.
- Run a new container 모달이 나타나요.
- Optional settings를 펼치세요.
- 선택적 설정에서 다음을 지정하세요:
- Container name:
my-mysql - Environment variables:
MYSQL_ROOT_PASSWORD:my-secret-pwMYSQL_DATABASE:mydb
- Container name:
- Run을 선택하세요.
- 컨테이너가 실행 중인지 확인하려면 Docker Desktop 대시보드에서 Container 뷰를 여세요.
컨테이너화된 데이터베이스의 셸에 접근하기 (Access the shell of a containerized database)
Docker 컨테이너 안에서 실행 중인 데이터베이스가 있다면 데이터베이스를 관리하거나 명령을 실행하거나 관리 작업을 수행하기 위해 그 셸에 접근해야 할 때가 있어요. Docker는 docker exec 명령으로 이를 쉽게 해주는 방법을 제공해요. 그래픽 인터페이스를 선호한다면 Docker Desktop의 GUI도 사용할 수 있어요.
아직 데이터베이스 컨테이너가 실행 중이 아니라면 로컬 컨테이너화된 데이터베이스 실행하기를 참고하세요.
CLI
CLI로 MySQL 컨테이너의 터미널에 접근하려면 다음 docker exec 명령을 사용할 수 있어요.
$ docker exec -it my-mysql bash
이 명령에서:
docker exec는 실행 중인 컨테이너에서 명령을 실행하고 싶다고 Docker에 알려줘요.-it는 접근하는 터미널이 대화형(interactive)으로 동작하게 해서 명령을 입력할 수 있게 해줘요.my-mysql은 MySQL 컨테이너의 이름이에요. 실행할 때 다른 이름으로 지정했다면 그 이름을 사용하세요.bash는 컨테이너 안에서 실행하고 싶은 명령이에요. 컨테이너의 파일 시스템과 설치된 애플리케이션과 상호작용할 수 있는 bash 셸을 열어줘요.
이 명령을 실행하면 MySQL 컨테이너 안의 bash 셸에 접근할 수 있게 되고, 여기서 MySQL 서버를 직접 관리할 수 있어요. exit를 실행하면 터미널로 돌아갈 수 있어요.
GUI
- Docker Desktop 대시보드를 열고 Containers 뷰를 선택하세요.
- 컨테이너의 Actions 열에서 Show container actions를 선택한 다음 Open in terminal을 선택하세요.
- 이 터미널에서 MySQL 컨테이너 안의 셸에 접근할 수 있고, 여기서 MySQL 서버를 직접 관리할 수 있어요.
컨테이너의 터미널에 접근한 후에는 그 컨테이너에서 사용 가능한 모든 도구를 실행할 수 있어요. 다음 예시는 컨테이너 안에서 mysql을 사용해 데이터베이스 목록을 보여주는 방법이에요.
# mysql -u root -p
Enter password: my-secret-pw
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
호스트에서 컨테이너화된 데이터베이스에 연결하기 (Connect to a containerized database from your host)
호스트 머신에서 컨테이너화된 데이터베이스에 연결하려면 컨테이너 안의 포트를 호스트 머신의 포트에 매핑해야 해요. 이 과정은 호스트 머신의 네트워크를 통해 컨테이너 안의 데이터베이스에 접근할 수 있게 보장해요. MySQL의 기본 포트는 3306이에요. 이 포트를 노출하면 호스트 머신의 다양한 데이터베이스 관리 도구나 애플리케이션으로 MySQL 데이터베이스와 상호작용할 수 있어요.
시작하기 전에 이 가이드에서 이전에 실행했던 컨테이너를 모두 제거해야 해요. 컨테이너를 중지하고 제거하려면 다음 중 하나를 하세요:
- 터미널에서
docker rm --force my-mysql을 실행해my-mysql이라는 컨테이너를 제거하세요. - 또는 Docker Desktop 대시보드에서 Containers 뷰의 컨테이너 옆에 있는 Delete 아이콘을 선택하세요.
다음으로 Docker Desktop GUI 또는 CLI를 사용해 포트가 매핑된 컨테이너를 실행할 수 있어요.
CLI
터미널에서 다음 명령을 실행하세요.
$ docker run -p 3307:3306 --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -d mysql:latest
이 명령에서 -p 3307:3306은 호스트의 3307 포트를 컨테이너의 3306 포트에 매핑해요.
포트가 매핑됐는지 확인하려면 다음 명령을 실행하세요.
$ docker ps
다음과 같은 출력이 보일 거예요.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6eb776cfd73c mysql:latest "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp my-mysql
GUI
- Docker Desktop 대시보드에서 창 상단의 전역 검색을 선택하세요.
- 검색 상자에
mysql을 지정하고, 선택되어 있지 않다면 Images 탭을 선택하세요. - mysql 이미지에 마우스를 올리고 Run을 선택하세요.
- Run a new container 모달이 나타나요.
- Optional settings를 펼치세요.
- 선택적 설정에서 다음을 지정하세요:
- Container name:
my-mysql - Host port for the 3306/tcp port:
3307 - Environment variables:
MYSQL_ROOT_PASSWORD:my-secret-pwMYSQL_DATABASE:mydb
- Container name:
- Run을 선택하세요.
- Containers 뷰에서 Port(s) 열 아래에 포트가 매핑됐는지 확인하세요.
my-mysql컨테이너에3307:3306이 보일 거예요.
이 시점부터 호스트에서 실행 중인 모든 애플리케이션은 localhost:3307에서 컨테이너의 MySQL 서비스에 접근할 수 있어요.
다른 컨테이너에서 컨테이너화된 데이터베이스에 연결하기 (Connect to a containerized database from another container)
다른 컨테이너에서 컨테이너화된 데이터베이스에 연결하는 것은 마이크로서비스 아키텍처와 개발 과정에서 흔한 시나리오예요. Docker의 네트워킹 기능은 데이터베이스를 호스트 네트워크에 노출하지 않고도 이 연결을 쉽게 만들어줘요. 데이터베이스 컨테이너와 접근이 필요한 컨테이너를 같은 Docker 네트워크에 두면 되죠.
시작하기 전에 이 가이드에서 이전에 실행했던 컨테이너를 모두 제거해야 해요. 컨테이너를 중지하고 제거하려면 다음 중 하나를 하세요:
- 터미널에서
docker rm --force my-mysql을 실행해my-mysql이라는 컨테이너를 제거하세요. - 또는 Docker Desktop 대시보드에서 Containers 뷰의 컨테이너 옆에 있는 Delete 아이콘을 선택하세요.
네트워크를 만들고 그 위에서 컨테이너를 실행하려면:
- 다음 명령을 실행해
my-network라는 Docker 네트워크를 만드세요.
$ docker network create my-network
--network옵션으로 네트워크를 지정해 데이터베이스 컨테이너를 실행하세요. 이렇게 하면my-network네트워크에서 컨테이너가 실행돼요.
$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb --network my-network -d mysql:latest
--network옵션으로 네트워크를 지정해 다른 컨테이너를 실행하세요. 이 예시에서는 데이터베이스에 연결할 수 있는 phpMyAdmin 컨테이너를 실행할 거예요.- phpMyAdmin 컨테이너를 실행하세요.
--network옵션으로 네트워크를 지정하고,-p옵션으로 호스트 머신에서 컨테이너에 접근할 수 있게 하며,-e옵션으로 이미지에 필요한 환경 변수를 지정하세요.
$ docker run --name my-phpmyadmin -d --network my-network -p 8080:80 -e PMA_HOST=my-mysql phpmyadmin
- 컨테이너들이 통신할 수 있는지 확인하세요. 이 예시에서는 phpMyAdmin에 접근해 데이터베이스에 연결되는지 확인할 거예요.
- http://localhost:8080 을 열어 phpMyAdmin 컨테이너에 접근하세요.
- 사용자 이름은
root, 비밀번호는my-secret-pw로 로그인하세요. - MySQL 서버에 연결되어 데이터베이스가 목록에 표시되는 걸 확인할 수 있을 거예요.
이 시점부터 my-network 컨테이너 네트워크에서 실행되는 모든 애플리케이션은 my-mysql:3306에서 컨테이너의 MySQL 서비스에 접근할 수 있어요.
볼륨에 데이터베이스 데이터 유지하기 (Persist database data in a volume)
Docker 볼륨에 데이터베이스 데이터를 유지하는 것은 컨테이너 재시작과 제거에도 데이터가 살아남도록 보장하는 데 필요해요. Docker 볼륨을 사용하면 데이터베이스 파일을 컨테이너의 쓰기 가능한 계층(writable layer) 밖에 저장할 수 있어서, 데이터를 잃지 않고도 컨테이너를 업그레이드하고, 베이스를 바꾸고, 데이터를 공유할 수 있어요. Docker CLI 또는 Docker Desktop GUI를 사용해 데이터베이스 컨테이너에 볼륨을 연결하는 방법을 살펴볼게요.
시작하기 전에 이 가이드에서 이전에 실행했던 컨테이너를 모두 제거해야 해요. 컨테이너를 중지하고 제거하려면 다음 중 하나를 하세요:
- 터미널에서
docker rm --force my-mysql을 실행해my-mysql이라는 컨테이너를 제거하세요. - 또는 Docker Desktop 대시보드에서 Containers 뷰의 컨테이너 옆에 있는 Delete 아이콘을 선택하세요.
다음으로 Docker Desktop GUI 또는 CLI를 사용해 볼륨이 연결된 컨테이너를 실행할 수 있어요.
CLI
볼륨이 연결된 데이터베이스 컨테이너를 실행하려면 docker run 명령에 -v 옵션을 포함해서 볼륨 이름과 컨테이너 안에서 데이터베이스가 데이터를 저장하는 경로를 지정하세요. 볼륨이 존재하지 않으면 Docker가 자동으로 만들어줘요.
볼륨이 연결된 데이터베이스 컨테이너를 실행한 뒤 데이터가 유지되는지 확인하려면:
- 컨테이너를 실행하고 볼륨을 연결하세요.
$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -v my-db-volume:/var/lib/mysql -d mysql:latest
이 명령은 my-db-volume이라는 볼륨을 컨테이너의 /var/lib/mysql 디렉터리에 마운트해요.
- 데이터베이스에 데이터를 만드세요.
docker exec명령으로 컨테이너 안에서 mysql을 실행해 테이블을 만들어요.
$ docker exec my-mysql mysql -u root -pmy-secret-pw -e "CREATE TABLE IF NOT EXISTS mydb.mytable (column_name VARCHAR(255)); INSERT INTO mydb.mytable (column_name) VALUES ('value');"
이 명령은 컨테이너 안의 mysql 도구를 사용해 열이 column_name인 mytable이라는 테이블을 만들고, 마지막으로 value라는 값을 삽입해요.
- 컨테이너를 중지하고 제거하세요. 볼륨이 없다면 컨테이너를 제거할 때 만든 테이블이 손실될 거예요.
$ docker rm --force my-mysql
- 볼륨이 연결된 새 컨테이너를 시작하세요. 이번에는 설정이 볼륨에 저장되어 있으므로 환경 변수를 지정할 필요가 없어요.
$ docker run --name my-mysql -v my-db-volume:/var/lib/mysql -d mysql:latest
- 만든 테이블이 여전히 존재하는지 확인하세요.
docker exec명령을 다시 사용해 컨테이너 안에서 mysql을 실행해요.
$ docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.mytable;"
이 명령은 컨테이너 안의 mysql 도구를 사용해 mytable 테이블의 모든 레코드를 선택해요.
다음과 같은 출력이 보일 거예요.
column_name
value
GUI
볼륨이 연결된 데이터베이스 컨테이너를 실행한 뒤 데이터가 유지되는지 확인하려면:
-
볼륨이 연결된 컨테이너를 실행하세요.
-
Docker Desktop 대시보드에서 창 상단의 전역 검색을 선택하세요.
-
검색 상자에
mysql을 지정하고, 선택되어 있지 않다면 Images 탭을 선택하세요. -
mysql 이미지에 마우스를 올리고 Run을 선택하세요.
-
Run a new container 모달이 나타나요.
-
Optional settings를 펼치세요.
-
선택적 설정에서 다음을 지정하세요:
- Container name:
my-mysql - Environment variables:
MYSQL_ROOT_PASSWORD:my-secret-pwMYSQL_DATABASE:mydb
- Volumes:
my-db-volume:/var/lib/mysql - 여기서 볼륨의 이름은
my-db-volume이고 컨테이너의/var/lib/mysql에 마운트돼요.
- Container name:
-
Run을 선택하세요.
-
데이터베이스에 데이터를 만드세요.
-
Containers 뷰에서 컨테이너 옆에 있는 Show container actions 아이콘을 선택한 다음 Open in terminal을 선택하세요.
-
컨테이너의 터미널에서 다음 명령을 실행해 테이블을 추가하세요.
# mysql -u root -pmy-secret-pw -e "CREATE TABLE IF NOT EXISTS mydb.mytable (column_name VARCHAR(255)); INSERT INTO mydb.mytable (column_name) VALUES ('value');"
이 명령은 컨테이너 안의 mysql 도구를 사용해 열이 column_name인 mytable이라는 테이블을 만들고, 마지막으로 value라는 값을 삽입해요.
-
Containers 뷰에서 컨테이너 옆에 있는 Delete 아이콘을 선택한 다음 Delete forever를 선택하세요. 볼륨이 없다면 컨테이너를 삭제할 때 만든 테이블이 손실될 거예요.
-
볼륨이 연결된 컨테이너를 실행하세요.
-
Docker Desktop 대시보드에서 창 상단의 전역 검색을 선택하세요.
-
검색 상자에
mysql을 지정하고, 선택되어 있지 않다면 Images 탭을 선택하세요. -
mysql 이미지에 마우스를 올리고 Run을 선택하세요.
-
Run a new container 모달이 나타나요.
-
Optional settings를 펼치세요.
-
선택적 설정에서 다음을 지정하세요:
- Container name:
my-mysql - Environment variables:
MYSQL_ROOT_PASSWORD:my-secret-pwMYSQL_DATABASE:mydb
- Volumes:
my-db-volume:/var/lib/mysql
- Container name:
-
Run을 선택하세요.
-
만든 테이블이 여전히 존재하는지 확인하세요.
-
Containers 뷰에서 컨테이너 옆에 있는 Show container actions 아이콘을 선택한 다음 Open in terminal을 선택하세요.
-
컨테이너의 터미널에서 다음 명령을 실행해 만든 테이블이 여전히 존재하는지 확인하세요.
# mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.mytable;"
이 명령은 컨테이너 안의 mysql 도구를 사용해 mytable 테이블의 모든 레코드를 선택해요.
다음과 같은 출력이 보일 거예요.
column_name
value
이 시점부터 my-db-volume을 마운트하는 모든 MySQL 컨테이너는 유지된 데이터에 접근하고 저장할 수 있어요.
맞춤형 데이터베이스 이미지 빌드하기 (Build a customized database image)
데이터베이스 이미지를 커스터마이징하면 기본 데이터베이스 서버와 함께 추가 구성, 스크립트, 도구를 포함할 수 있어요. 이것은 특정 개발·프로덕션 환경 요구사항에 맞는 Docker 이미지를 만들 때 특히 유용해요. 다음 예시는 테이블 초기화 스크립트를 포함한 맞춤형 MySQL 이미지를 빌드하고 실행하는 방법을 보여줘요.
시작하기 전에 이 가이드에서 이전에 실행했던 컨테이너를 모두 제거해야 해요. 컨테이너를 중지하고 제거하려면 다음 중 하나를 하세요:
- 터미널에서
docker rm --force my-mysql을 실행해my-mysql이라는 컨테이너를 제거하세요. - 또는 Docker Desktop 대시보드에서 Containers 뷰의 컨테이너 옆에 있는 Delete 아이콘을 선택하세요.
맞춤형 이미지를 빌드하고 실행하려면:
- Dockerfile을 만드세요. 프로젝트 디렉터리에
Dockerfile이라는 파일을 만드세요. 이 예시에서는 원하는 빈 디렉터리에 Dockerfile을 만들 수 있어요. 이 파일은 맞춤형 MySQL 이미지를 어떻게 빌드할지 정의해요. - Dockerfile에 다음 내용을 추가하세요.
# syntax=docker/dockerfile:1
# Use the base image mysql:latest
FROM mysql:latest
# Set environment variables
ENV MYSQL_DATABASE mydb
# Copy custom scripts or configuration files from your host to the container
COPY ./scripts/ /docker-entrypoint-initdb.d/
이 Dockerfile에서는 MySQL 데이터베이스 이름에 대한 환경 변수를 설정했어요. COPY 지시문으로 맞춤 구성 파일이나 스크립트를 컨테이너에 추가할 수도 있어요. 이 예시에서는 호스트의 ./scripts/ 디렉터리 파일들이 컨테이너의 /docker-entrypoint-initdb.d/ 디렉터리로 복사돼요. 이 디렉터리에서는 컨테이너가 처음 시작될 때 .sh, .sql, .sql.gz 스크립트가 실행돼요. Dockerfile에 대한 자세한 내용은 Dockerfile reference를 참고하세요.
- 데이터베이스에 테이블을 초기화하는 스크립트 파일을 만드세요. Dockerfile이 있는 디렉터리에
scripts라는 하위 디렉터리를 만들고, 다음 내용으로create_table.sql파일을 만드세요.
CREATE TABLE IF NOT EXISTS mydb.myothertable (
column_name VARCHAR(255)
);
INSERT INTO mydb.myothertable (column_name) VALUES ('other_value');
이제 다음 디렉터리 구조가 있어야 해요.
├── your-project-directory/
│ ├── scripts/
│ │ └── create_table.sql
│ └── Dockerfile
- 이미지를 빌드하세요. 터미널에서 Dockerfile이 있는 디렉터리로 이동하세요.
- 다음 명령을 실행해 이미지를 빌드하세요.
$ docker build -t my-custom-mysql .
이 명령에서 -t my-custom-mysql은 새 이미지에 my-custom-mysql이라는 이름(태그)을 붙여요. 명령 끝의 마침표(.)는 빌드의 컨텍스트로 현재 디렉터리를 지정하는데, Docker는 여기서 Dockerfile과 빌드에 필요한 다른 파일들을 찾아요.
- 로컬 컨테이너화된 데이터베이스 실행하기에서 했던 것처럼 이미지를 실행하세요. 이번에는
mysql:latest대신 이미지의 이름을 지정하세요. 또한MYSQL_DATABASE환경 변수는 이제 Dockerfile에서 정의되므로 더 이상 지정할 필요가 없어요.
$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d my-custom-mysql
- 다음 명령으로 컨테이너가 실행 중인지 확인하세요.
$ docker ps
다음과 같은 출력이 보일 거예요.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f74dcfdb0e59 my-custom-mysql "docker-entrypoint.s…" 2 hours ago Up 51 minutes 3306/tcp, 33060/tcp my-mysql
- 초기화 스크립트가 실행됐는지 확인하세요. 터미널에서 다음 명령을 실행해
myothertable테이블의 내용을 보여주세요.
$ docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.myothertable;"
다음과 같은 출력이 보일 거예요.
column_name
other_value
my-custom-mysql 이미지를 사용해 실행되는 모든 컨테이너는 처음 시작될 때 테이블이 초기화돼요.
Docker Compose로 데이터베이스 실행하기 (Use Docker Compose to run a database)
Docker Compose는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구예요. 단일 명령으로 앱의 모든 서비스(데이터베이스, 웹 앱 등)를 구성하고 관리할 수 있죠. 이 예시에서는 Compose 파일을 만들고, 그것을 사용해 MySQL 데이터베이스 컨테이너와 phpMyAdmin 컨테이너를 실행할 거예요.
Docker Compose로 컨테이너를 실행하려면:
- Docker Compose 파일을 만드세요. 프로젝트 디렉터리에
compose.yaml이라는 파일을 만드세요. 이 파일은 서비스, 네트워크, 볼륨을 정의해요. - compose.yaml 파일에 다음 내용을 추가하세요.
services:
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: my-secret-pw
MYSQL_DATABASE: mydb
ports:
- 3307:3306
volumes:
- my-db-volume:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
environment:
PMA_HOST: db
PMA_PORT: 3306
MYSQL_ROOT_PASSWORD: my-secret-pw
ports:
- 8080:80
depends_on:
- db
volumes:
my-db-volume:
데이터베이스 서비스에 대해:
db는 서비스의 이름이에요.image: mysql:latest는 서비스가 Docker Hub의 최신 MySQL 이미지를 사용함을 지정해요.environment는 MySQL이 데이터베이스를 초기화할 때 사용하는 환경 변수(루트 비밀번호, 데이터베이스 이름 등)를 나열해요.ports는 호스트의 3307 포트를 컨테이너의 3306 포트에 매핑해서 호스트 머신에서 데이터베이스에 연결할 수 있게 해줘요.volumes는 데이터베이스 데이터를 유지하기 위해my-db-volume을 컨테이너 안의/var/lib/mysql에 마운트해요.
데이터베이스 서비스 외에도 phpMyAdmin 서비스가 있어요. 기본적으로 Compose는 앱을 위한 단일 네트워크를 구성해요. 각 서비스의 컨테이너는 기본 네트워크에 참여하며, 그 네트워크의 다른 컨테이너에서 도달할 수 있고 서비스 이름으로도 발견할 수 있어요. 따라서 PMA_HOST 환경 변수에 서비스 이름인 db를 지정해 데이터베이스 서비스에 연결할 수 있어요. Compose에 대한 자세한 내용은 Compose file reference를 참고하세요.
- Docker Compose를 실행하세요. 터미널을 열고 compose.yaml 파일이 있는 디렉터리로 이동하세요.
- 다음 명령으로 Docker Compose를 실행하세요.
$ docker compose up
이제 http://localhost:8080 에서 phpMyAdmin에 접근하고, 사용자 이름은 root, 비밀번호는 my-secret-pw로 데이터베이스에 연결할 수 있어요.
컨테이너를 중지하려면 터미널에서 ctrl+c를 누르세요.
이제 Docker Compose로 데이터베이스와 앱을 시작하고, 볼륨을 마운트하고, 네트워킹을 구성하는 등 모든 것을 단일 명령으로 할 수 있어요.
요약 (Summary)
이 가이드에서는 컨테이너화된 데이터베이스 사용의 핵심을 소개했어요. 특히 MySQL에 초점을 맞춰 개발 환경 전반에서 유연성, 설정 용이성, 일관성을 높이는 방법을 살펴봤어요. 이 가이드에서 다룬 사용 사례는 개발 작업 흐름을 간소화할 뿐만 아니라 더 고급 데이터베이스 관리와 배포 시나리오를 준비하게 해줘서, 데이터 기반 애플리케이션이 견고하고 확장 가능하게 유지되도록 해줘요.
관련 정보:
- Docker Hub database images
- Dockerfile reference
- Compose file reference
- CLI reference
- Database samples