로컬 컨테이너화된 데이터베이스를 사용하면 유연성이 제공되고 설정이 간단해집니다. 전통적인 데이터베이스 설치의 복잡성 없이 프로덕션 환경을 가깝게 복제할 수 있습니다. 도커는 이 프로세스를 간소화하여 몇 가지 명령으로 격리된 컨테이너에서 데이터베이스를 배포, 관리 및 확장하기 쉽게 만듭니다.
이 안내서에서는 다음을 배울 수 있습니다:
- 로컬 컨테이너화된 데이터베이스 실행
- 컨테이너화된 데이터베이스의 셸에 액세스
- 호스트에서 컨테이너화된 데이터베이스에 연결
- 볼륨에 데이터베이스 데이터 유지
- 실험실 정리
준비사항
이 가이드를 따라가려면 도커를 설치해야 합니다. 설치 지침은 도커 웹사이트를 참조하십시오.
컨테이너화된 데이터베이스 설정을 위한 단계별 안내
1. 로컬 컨테이너화된 데이터베이스 실행
가장 인기 있는 데이터베이스 시스템인MySQL,PostgreSQL,MongoDB는 Docker Hub에서 공식 Docker 이미지를 제공하고 있습니다. 이러한(curated) 이미지는 최상의 관행을 따르며, 최신 기능과 보안 업데이트에 접근할 수 있도록 보장합니다.
시작하려면 Docker Hub를 방문하여 관심 있는 데이터베이스를 검색하세요. 각 이미지의 페이지에는 컨테이너를 실행하고 설정을 사용자 정의하며 데이터베이스를 필요에 따라 구성하는 자세한 지침을 제공합니다. 이 가이드에서 제공하는 MySQL 이미지에 대한 자세한 내용은 Docker Hub의 MySQL 이미지 페이지를 참조하세요.
데이터베이스 컨테이너를 실행하려면 Docker Desktop GUI 또는 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
는 컨테이너를 분리 모드로 실행합니다. 즉, 배경에서 실행됩니다.mysql:latest
는 가장 최신 버전의 MySQL 이미지를 사용하려는 것을 지정합니다.
컨테이너가 실행 중인지 확인하려면 터미널에서 docker ps
명령을 실행하세요:
run docker ps
Docker Desktop 콘솔에서도 동일한 내용을 확인할 수 있습니다:
2. 컨테이너화된 데이터베이스의 셸 접근
데이터베이스가 Docker 컨테이너 내에서 실행 중이면, 데이터베이스를 관리하거나 명령을 실행하거나 관리 작업을 수행하기 위해 셸에 접근해야 할 수 있습니다. Docker는 docker exec
명령을 사용하여 이를 간편하게 제공합니다. 그리고 그래픽 인터페이스를 선호하는 경우 Docker Desktop의 GUI를 사용할 수도 있습니다.
아직 데이터베이스 컨테이너가 실행 중이지 않다면 로컬 컨테이너화된 데이터베이스 실행을 참조하세요. CLI를 사용하여 MySQL 컨테이너의 터미널에 접근하려면 다음 docker exec
명령을 사용할 수 있습니다.
docker exec -it my-mysql bash
이 명령에서:
docker exec
는 Docker에게 실행 중인 컨테이너에서 명령을 실행하려는 것을 알립니다.-it
는 접근하는 터미널이 인터랙티브하도록 하여 명령을 입력할 수 있게 합니다.my-mysql
는 당신의 MySQL 컨테이너의 이름입니다. 실행할 때 컨테이너를 다른 이름으로 지정했다면 그 이름을 사용하세요.- 컨테이너 내에서 실행하고자 하는 명령은 bash입니다. 이 명령은 Bash 셸을 엽니다. 이를 통해 컨테이너의 파일 시스템과 설치된 애플리케이션과 상호작용할 수 있습니다.
- 이 명령을 실행한 후, MySQL 컨테이너 내의 bash 셸에 접근할 수 있게 되며, 여기서 직접 MySQL 서버를 관리할 수 있습니다. 터미널로 돌아가기 위해 Exit를 실행하세요.
Docker 컨테이너가 실행 중인지 확인하세요.
run docker ps
컨테이너의 터미널에 접근한 후, 해당 컨테이너에서 사용 가능한 모든 도구를 실행할 수 있습니다. 다음 (이미지) 예시는 컨테이너 내에서 MySQL를 사용하여 데이터베이스를 목록에 보이는 것입니다.
Mysql -u root -p
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> create database testdb;
Query OK, 1 row affected (0.11 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
| testdb |
+--------------------+
6 rows in set (0.00 sec)
mysql> connect testdb;
Connection id: 12
Current database: testdb
mysql> SHOW TABLES;
Empty set (0.02 sec)
mysql> create table test (id numeric,fname varchar(20));
Query OK, 0 rows affected (0.10 sec)
mysql> SHOW TABLES;
+------------------+
| Tables_in_testdb |
+------------------+
| test |
+------------------+
1 row in set (0.00 sec)
mysql> insert into test values (1,'arvind');
Query OK, 1 row affected (0.08 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test;
+------+--------+
| id | fname |
+------+--------+
| 1 | arvind |
+------+--------+
1 row in set (0.00 sec)
테스트 테이블에 생성한 테이블과 저장한 데이터는 동일한 컨테이너를 사용하는 동안만 지속됩니다; 새로운 컨테이너를 재생성하거나 빌드할 때 모든 데이터가 손실됩니다.
컨테이너를 종료하고 다시 컨테이너 데이터베이스에 로그인하여 데이터가 존재하는지 확인하여 검증할 수 있습니다. 컨테이너가 실행 중이면 데이터가 여전히 데이터베이스에 존재할 것입니다.
3. 호스트에서 컨테이너화된 데이터베이스에 연결하기
호스트机器에서 컨테이너화된 데이터베이스에 연결하려면 컨테이너 내의 포트를 호스트机器의 포트로 매핑해야 합니다. 이 과정은 컨테이너 내의 데이터베이스가 호스트机器의 네트워크를 통해 액세스 가능하도록 보장합니다. MySQL의 기본 포트는 3306
입니다. 이 포트를 노출하면 호스트机器에서 다양한 데이터베이스 관리 도구나 애플리케이션을 사용하여 MySQL 데이터베이스와 상호작용할 수 있습니다.
시작하기 전에, 이 가이드를 위한 기존에 실행한 컨테이너를 제거해야 합니다. 컨테이너를 중지하고 제거하려면:
- 터미널에서
docker remove --force my-mysql
명령어를 실행하여my-mysql
라는 이름의 컨테이너를 제거할 수 있습니다; - 또는 Docker 대시보드에서 컨테이너 보기에서 컨테이너 옆의 삭제 아이콘을 선택할 수 있습니다.
다음으로, Docker 데스크톱 GUI 또는 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
으로 매핑합니다.
4. 볼륨에 데이터베이스 데이터를 지속
데이터베이스 데이터를 Docker 볼륨에 지속하는 것은 컨테이너 재시작 및 제거 후에도 데이터를 유지하기 위한 것입니다. Docker 볼륨을 사용하면 데이터베이스 파일을 컨테이너의 쓰기 가능 레이어 외부에 저장할 수 있어 컨테이너를 업그레이드하거나 바꾸고 데이터를 공유할 때 데이터를 잃지 않도록 할 수 있습니다. 데이터베이스 컨테이너에 볼륨을 연결하려면 Docker CLI 또는 Docker 데스크톱 GUI를 사용할 수 있습니다.
참고: 이전에 ‘Containerized Database에 연결’ 절에서 했던 것처럼, 시작하기 전에 이 가이드를 위해 실행한 모든 컨테이너를 제거해야 합니다.
다음으로, Docker Desktop GUI 또는 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 도구를 사용하여 mytable
이라는 이름의 테이블을 생성하고, column_name
이라는 칼럼을 추가한 후, 값(value)을 삽입합니다.
컨테이너를 중지하고 제거하세요. 볼륨이 없다면, 생성한 테이블은 컨테이너를 제거할 때 함께 사라집니다.
docker remove --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 도구를 사용하여 테이블에서 모든 레코드를 선택합니다. 다음과 같은 출력을 볼 수 있어야 합니다.
column_name
value
5. MySQL 컨테이너 이미지 정리
컨테이너를 제거하려면, 컨테이너 이름이나 ID를 공백으로 구분하여 docker remove
명령을 사용합니다. 예를 들어:
docker remove --force 90b8831a4b8
docker remove --force 36252896d6ff
docker remove --force d86dff3809e8
결론
결국, Docker를 사용하여 MySQL을 실행하는 것은 이동성이 뛰어나고 확장 가능하며 효율적인 데이터베이스 관리 솔루션을 제공합니다. Docker의 격리된 컨테이너는 배포를 간소화하고, 호환성 문제를 줄이며, 자원 사용을 최적화합니다. 버전 관리와 환경 재설정이 쉬워 개발과 테스트를 빠르게 지원합니다. 마이크로서비스에서 MySQL 데이터베이스를 관리하는 데 적합하며, 배포와 확장을 쉽게 하면서도 강력한 성능을 유지합니다.
Source:
https://dzone.com/articles/guide-for-running-mysql-database-in-docker-container