컨테이너화된 데이터베이스 사용하기

컨테이너화된 데이터베이스 사용하기 (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로 컨테이너를 실행하려면:

  1. Docker Desktop 대시보드에서 창 상단의 전역 검색을 선택하세요.
  2. 검색 상자에 mysql을 지정하고, 선택되어 있지 않다면 Images 탭을 선택하세요.
  3. mysql 이미지에 마우스를 올리고 Run을 선택하세요.
  4. Run a new container 모달이 나타나요.
  5. Optional settings를 펼치세요.
  6. 선택적 설정에서 다음을 지정하세요:
    • Container name: my-mysql
    • Environment variables:
      • MYSQL_ROOT_PASSWORD:my-secret-pw
      • MYSQL_DATABASE:mydb
  7. Run을 선택하세요.
  8. 컨테이너가 실행 중인지 확인하려면 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

  1. Docker Desktop 대시보드를 열고 Containers 뷰를 선택하세요.
  2. 컨테이너의 Actions 열에서 Show container actions를 선택한 다음 Open in terminal을 선택하세요.
  3. 이 터미널에서 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

  1. Docker Desktop 대시보드에서 창 상단의 전역 검색을 선택하세요.
  2. 검색 상자에 mysql을 지정하고, 선택되어 있지 않다면 Images 탭을 선택하세요.
  3. mysql 이미지에 마우스를 올리고 Run을 선택하세요.
  4. Run a new container 모달이 나타나요.
  5. Optional settings를 펼치세요.
  6. 선택적 설정에서 다음을 지정하세요:
    • Container name: my-mysql
    • Host port for the 3306/tcp port: 3307
    • Environment variables:
      • MYSQL_ROOT_PASSWORD:my-secret-pw
      • MYSQL_DATABASE:mydb
  7. Run을 선택하세요.
  8. 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 아이콘을 선택하세요.

네트워크를 만들고 그 위에서 컨테이너를 실행하려면:

  1. 다음 명령을 실행해 my-network라는 Docker 네트워크를 만드세요.
$ docker network create my-network
  1. --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
  1. --network 옵션으로 네트워크를 지정해 다른 컨테이너를 실행하세요. 이 예시에서는 데이터베이스에 연결할 수 있는 phpMyAdmin 컨테이너를 실행할 거예요.
  2. phpMyAdmin 컨테이너를 실행하세요. --network 옵션으로 네트워크를 지정하고, -p 옵션으로 호스트 머신에서 컨테이너에 접근할 수 있게 하며, -e 옵션으로 이미지에 필요한 환경 변수를 지정하세요.
$ docker run --name my-phpmyadmin -d --network my-network -p 8080:80 -e PMA_HOST=my-mysql phpmyadmin
  1. 컨테이너들이 통신할 수 있는지 확인하세요. 이 예시에서는 phpMyAdmin에 접근해 데이터베이스에 연결되는지 확인할 거예요.
  2. http://localhost:8080 을 열어 phpMyAdmin 컨테이너에 접근하세요.
  3. 사용자 이름은 root, 비밀번호는 my-secret-pw로 로그인하세요.
  4. 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가 자동으로 만들어줘요.

볼륨이 연결된 데이터베이스 컨테이너를 실행한 뒤 데이터가 유지되는지 확인하려면:

  1. 컨테이너를 실행하고 볼륨을 연결하세요.
$ 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 디렉터리에 마운트해요.

  1. 데이터베이스에 데이터를 만드세요. 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라는 값을 삽입해요.

  1. 컨테이너를 중지하고 제거하세요. 볼륨이 없다면 컨테이너를 제거할 때 만든 테이블이 손실될 거예요.
$ docker rm --force my-mysql
  1. 볼륨이 연결된 새 컨테이너를 시작하세요. 이번에는 설정이 볼륨에 저장되어 있으므로 환경 변수를 지정할 필요가 없어요.
$ docker run --name my-mysql -v my-db-volume:/var/lib/mysql -d mysql:latest
  1. 만든 테이블이 여전히 존재하는지 확인하세요. docker exec 명령을 다시 사용해 컨테이너 안에서 mysql을 실행해요.
$ docker exec my-mysql mysql -u root -pmy-secret-pw -e "SELECT * FROM mydb.mytable;"

이 명령은 컨테이너 안의 mysql 도구를 사용해 mytable 테이블의 모든 레코드를 선택해요.

다음과 같은 출력이 보일 거예요.

column_name
value

GUI

볼륨이 연결된 데이터베이스 컨테이너를 실행한 뒤 데이터가 유지되는지 확인하려면:

  1. 볼륨이 연결된 컨테이너를 실행하세요.

  2. Docker Desktop 대시보드에서 창 상단의 전역 검색을 선택하세요.

  3. 검색 상자에 mysql을 지정하고, 선택되어 있지 않다면 Images 탭을 선택하세요.

  4. mysql 이미지에 마우스를 올리고 Run을 선택하세요.

  5. Run a new container 모달이 나타나요.

  6. Optional settings를 펼치세요.

  7. 선택적 설정에서 다음을 지정하세요:

    • Container name: my-mysql
    • Environment variables:
      • MYSQL_ROOT_PASSWORD:my-secret-pw
      • MYSQL_DATABASE:mydb
    • Volumes: my-db-volume:/var/lib/mysql
    • 여기서 볼륨의 이름은 my-db-volume이고 컨테이너의 /var/lib/mysql에 마운트돼요.
  8. Run을 선택하세요.

  9. 데이터베이스에 데이터를 만드세요.

  10. Containers 뷰에서 컨테이너 옆에 있는 Show container actions 아이콘을 선택한 다음 Open in terminal을 선택하세요.

  11. 컨테이너의 터미널에서 다음 명령을 실행해 테이블을 추가하세요.

# 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라는 값을 삽입해요.

  1. Containers 뷰에서 컨테이너 옆에 있는 Delete 아이콘을 선택한 다음 Delete forever를 선택하세요. 볼륨이 없다면 컨테이너를 삭제할 때 만든 테이블이 손실될 거예요.

  2. 볼륨이 연결된 컨테이너를 실행하세요.

  3. Docker Desktop 대시보드에서 창 상단의 전역 검색을 선택하세요.

  4. 검색 상자에 mysql을 지정하고, 선택되어 있지 않다면 Images 탭을 선택하세요.

  5. mysql 이미지에 마우스를 올리고 Run을 선택하세요.

  6. Run a new container 모달이 나타나요.

  7. Optional settings를 펼치세요.

  8. 선택적 설정에서 다음을 지정하세요:

    • Container name: my-mysql
    • Environment variables:
      • MYSQL_ROOT_PASSWORD:my-secret-pw
      • MYSQL_DATABASE:mydb
    • Volumes: my-db-volume:/var/lib/mysql
  9. Run을 선택하세요.

  10. 만든 테이블이 여전히 존재하는지 확인하세요.

  11. Containers 뷰에서 컨테이너 옆에 있는 Show container actions 아이콘을 선택한 다음 Open in terminal을 선택하세요.

  12. 컨테이너의 터미널에서 다음 명령을 실행해 만든 테이블이 여전히 존재하는지 확인하세요.

# 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 아이콘을 선택하세요.

맞춤형 이미지를 빌드하고 실행하려면:

  1. Dockerfile을 만드세요. 프로젝트 디렉터리에 Dockerfile이라는 파일을 만드세요. 이 예시에서는 원하는 빈 디렉터리에 Dockerfile을 만들 수 있어요. 이 파일은 맞춤형 MySQL 이미지를 어떻게 빌드할지 정의해요.
  2. 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를 참고하세요.

  1. 데이터베이스에 테이블을 초기화하는 스크립트 파일을 만드세요. 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
  1. 이미지를 빌드하세요. 터미널에서 Dockerfile이 있는 디렉터리로 이동하세요.
  2. 다음 명령을 실행해 이미지를 빌드하세요.
$ docker build -t my-custom-mysql .

이 명령에서 -t my-custom-mysql은 새 이미지에 my-custom-mysql이라는 이름(태그)을 붙여요. 명령 끝의 마침표(.)는 빌드의 컨텍스트로 현재 디렉터리를 지정하는데, Docker는 여기서 Dockerfile과 빌드에 필요한 다른 파일들을 찾아요.

  1. 로컬 컨테이너화된 데이터베이스 실행하기에서 했던 것처럼 이미지를 실행하세요. 이번에는 mysql:latest 대신 이미지의 이름을 지정하세요. 또한 MYSQL_DATABASE 환경 변수는 이제 Dockerfile에서 정의되므로 더 이상 지정할 필요가 없어요.
$ docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d my-custom-mysql
  1. 다음 명령으로 컨테이너가 실행 중인지 확인하세요.
$ 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
  1. 초기화 스크립트가 실행됐는지 확인하세요. 터미널에서 다음 명령을 실행해 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로 컨테이너를 실행하려면:

  1. Docker Compose 파일을 만드세요. 프로젝트 디렉터리에 compose.yaml이라는 파일을 만드세요. 이 파일은 서비스, 네트워크, 볼륨을 정의해요.
  2. 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를 참고하세요.

  1. Docker Compose를 실행하세요. 터미널을 열고 compose.yaml 파일이 있는 디렉터리로 이동하세요.
  2. 다음 명령으로 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