본문 바로가기
컨테이너/도커

MySQL 컨테이너 생성 시 데이터베이스 스키마와 초기 데이터 생성

by ^..^v 2023. 3. 16.
728x90
반응형

MySQL 컨테이너를 생성할 때 애플리케이션에서 필요로 하는 데이터베이스 스키마와 초기 데이터를 생성하도록 Dockerfile을 정의하고 이미지를 생성하는 방법입니다. 

 

초기 데이터 생성

데이터베이스 초기화에 사용할 데이터를 MySQL Workbench의 Data Export 기능을 이용해서 생성합니다. 

 

지정한 디렉터리에 테이블 생성 및 데이터 추가 쿼리를 포함한 sql 파일이 생성된 것을 확인할 수 있습니다. 

 

Dockerfile 생성

작업디렉터리에 Dockerfile을 생성합니다.

FROM mysql:5.7
ENV  MYSQL_ROOT_PASSWORD=root
ENV  MYSQL_DATABASE=springbootdb
ADD  ./init_db/* /docker-entrypoint-initdb.d

/docker-entrypoint-initdb.d에 있는 확장명이 .sh, .sql, .sql.gz인 파일을 추가하면 컨테이너가 처음 시작될 때 해당 파일을 알파벳 순으로 실행합니다. 해당 디렉토리에 Export한 파일을 추가하면 초기 데이터를 포함한 사용자 정의 이미지를 쉽게 만들 수 있습니다. (참고: https://hub.docker.com/_/mysql)

 

이미지 생성

docker image build 명령으로 이미지를 생성합니다. 

## 이미지 생성
C:\docker> docker image build -t mysql-with-data .
[+] Building 0.1s (7/7) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                           0.0s
 => => transferring dockerfile: 31B                                                                                                                                            0.0s
 => [internal] load .dockerignore                                                                                                                                              0.0s
 => => transferring context: 2B                                                                                                                                                0.0s
 => [internal] load metadata for docker.io/library/mysql:5.7                                                                                                                   0.0s
 => [internal] load build context                                                                                                                                              0.0s
 => => transferring context: 626B                                                                                                                                              0.0s
 => [1/2] FROM docker.io/library/mysql:5.7                                                                                                                                     0.0s
 => CACHED [2/2] ADD  ./init_db/* /docker-entrypoint-initdb.d                                                                                                                  0.0s
 => exporting to image                                                                                                                                                         0.0s
 => => exporting layers                                                                                                                                                        0.0s
 => => writing image sha256:b9085aba9d99399878472a4007c5af385fc33f00a0ea72b4ec73981864a12b19                                                                                   0.0s
 => => naming to docker.io/library/mysql-with-data
 
 
## 이미지 확인
C:\docker> docker image ls
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
mysql-with-data   latest    b9085aba9d99   13 minutes ago   455MB
mysql             5.7       0018a8d83892   7 days ago       455MB

 

컨테이너 실행

생성한 이미지로 컨테이너를 실행합니다. 이때 볼륨 맵핑을 통해 추가 생성, 갱신된 데이터가 유지될 수 있도록 합니다.

## 컨테이너 실행
C:\docker> docker container run -d -p 33060:3306 --rm -v c:\docker\mysql_data:/var/lib/mysql mysql-with-data
73c38d472ffaa5b6b70502e08e8201f13be1100671fb1f6274f9be91bf8efc2a


## 컨테이너 확인
C:\docker> docker container ls
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                                NAMES
73c38d472ffa   mysql-with-data   "docker-entrypoint.s…"   7 seconds ago   Up 6 seconds   33060/tcp, 0.0.0.0:33060->3306/tcp   upbeat_ride

 

초기 데이터 설정 확인

테이블이 생성되고 데이터가 추가된 것을 확인할 수 있습니다.

 

업데이트 내용 유지

볼륨 맵핑 결과, 데이터 변경 후 컨테이너를 재시작했을 때 업데이트 내용이 유지되는 것을 확인할 수 있습니다.

내용 업데이트

 

## 컨테이너 종료
C:\docker> docker container stop 73c3
73c3


## 컨테이너 재실행
C:\docker> docker container run -d -p 33060:3306 --rm -v c:\docker\mysql_data:/var/lib/mysql mysql-with-data
beab8d310fc07abc03f1486d78422b0ad3e75faf9149778dd6c2962f991d62a9

 

업데이트 내용 유지

 

이미지 등록

## 이미지 확인
C:\docker> docker image ls
REPOSITORY                   TAG       IMAGE ID       CREATED             SIZE
mysql-with-data              latest    b9085aba9d99   5 hours ago         455MB
mysql                        5.7       0018a8d83892   7 days ago          455MB


## 이미지 태그명 변경
C:\docker> docker image tag mysql-with-data myanjini/mysql-with-data:lab


## 이미지 확인
C:\docker> docker image ls
mysql-with-data              latest    b9085aba9d99   5 hours ago         455MB
myanjini/mysql-with-data     lab       b9085aba9d99   5 hours ago         455MB
mysql                        5.7       0018a8d83892   7 days ago          455MB


## 이미지 등록
C:\docker> docker image push myanjini/mysql-with-data:lab
The push refers to repository [docker.io/myanjini/mysql-with-data]
26573019562d: Layer already exists
	... (생략) ...
6b4c150e3167: Layer already exists
lab: digest: sha256:2da3766d37de54bdadd924bf01178b9b6349d6ff468091177ba30a05366a808a size: 2826
728x90
반응형

댓글