BACKEND/DOCKER

[Docker] phpmyadmin + mysql 생성 이후 테이블 및 데이터 생성이후 다른 버전의 mysql image 생성(dump하는 법)

nkm 2024. 11. 26. 21:51
728x90
반응형

안녕하세요!

 

'시퀀스' 라는 프로젝트를 진행하고 있는데, spring boot + mariadb를 image로 만들어서 docker hub로 매번 image를 올리고 있는데, db를 매번 안올려서... 이 친구들이 제대로 만들었는지 안만들었는지 알 길이 없었습니다. 그래서 실습 과정을 작성하고 하는 방법을 포스팅하려고 합니다.

 

그래서 시퀀스 친구들한테 시킨 과제는 아래와 같습니다.

 

1. 매번 spring boot + db를 이용하여 서비스를 구성하고 이미지로 만듭니다.

2. 이를 docker hub에 업로드합니다.

3. docker-compose.yml 양식을 받고 pull을 받아 확인합니다.

 

그런데 여기서 문제는 매번 프로젝트를 새로 열어서 서비스 별로 이미지가 새로 생성됩니다.

 

예를들어서 1차과제때 사용한 DB는 2차과제에서는 사용되지 않습니다. 그런데 친구들이 매번 덤프를 하지 않고 db이미지를 매번 같은걸 올리기 때문에 이 글을 포스팅합니다.

 

일단 로컬 컴퓨터에, Docker, Docker Desktop을 설치하고 Compose 까지 환경설정을 맞췄다는 가정하에 설명하고자 합니다.

1. phpmyadmin이란?

phpmyadmin이 뭔지 설명드려야 할 거 같은데, MySql, MariaDB와 같은 데이터베이스를 웹 브라우저를 통해 쉽게 관리할 수 있도록 도와주는 오픈 소스 웹 기반 관리 도구 입니다. 그래서 어떻게 사용하냐면

이렇게 생긴 친구가 phpmyadmin인데, 이렇게 테이블을 웹에서 만들수도 있고 콘솔도, 데이터도 쿼리문도 아주 그냥 docker exec -it 하면서 컨테이너 접속해서 확인안해도 편안하게 할 수 있습니다. 물론 DB 확인하는 툴이 많기도 한데, 저는 이게 편해서 많이 씁니다. 그래서 DB를 설치하면 이 친구도 같이 설치하는 편입니다.(cli 서버가 많아서 거의 반 강제긴 한데 쨋든)

2. 테스트를 위한 docker-compose.yml 작성

테스트를 위해 docker-compose.yml 양식을 하나 만듭니다.

컨테이너에 접속하여 mysql을 접속한다음 명령어로 들어가기 힘들기 때문에 docker-compose 양식에 phpmyadmin과 같은 네트워크로 엮어서 바로 접속할 수 있도록 했습니다. 

 

docker-compose가 뭔지 물어본다면

version: '3.8' # Docker Compose 파일 버전. 3.8은 다양한 기능을 제공하며 최신 Docker 엔진과 호환됨.

services:
  db: # 데이터베이스 서비스 정의
    image: mysql:8.0 # MySQL 이미지 버전 지정
    container_name: mysql_db # MySQL 컨테이너 이름 설정
    environment: # MySQL 설정을 위한 환경 변수
      MYSQL_ROOT_PASSWORD: your_root_password # MySQL 루트 사용자 비밀번호
      MYSQL_DATABASE: your_database_name # 자동으로 생성할 데이터베이스 이름
      MYSQL_USER: your_user # 생성할 사용자 이름
      MYSQL_PASSWORD: your_password # 해당 사용자의 비밀번호
    volumes: # 볼륨 설정으로 데이터를 컨테이너 외부에 저장
      - ./db_data:/var/lib/mysql # 로컬 디렉터리(db_data)를 MySQL 데이터 디렉터리에 마운트
    networks: # 네트워크 설정으로 서비스 간 통신을 가능하게 함
      - app-network # 정의된 네트워크 이름
    restart: always # 컨테이너가 중단되었을 때 자동으로 재시작

  phpmyadmin: # phpMyAdmin 서비스 정의
    image: phpmyadmin/phpmyadmin:latest # 최신 버전의 phpMyAdmin 이미지 사용
    container_name: phpmyadmin # phpMyAdmin 컨테이너 이름 설정
    environment: # phpMyAdmin 설정을 위한 환경 변수
      PMA_HOST: db # phpMyAdmin이 연결할 데이터베이스 서비스 이름 (위의 `db` 서비스와 연결)
      PMA_USER: your_user # phpMyAdmin에서 사용할 데이터베이스 사용자
      PMA_PASSWORD: your_password # 데이터베이스 사용자 비밀번호
    ports: # 포트 설정으로 호스트와 컨테이너 간 연결
      - "8080:80" # 호스트의 8080 포트를 phpMyAdmin의 80 포트에 매핑
    depends_on: # 컨테이너 실행 순서를 정의
      - db # phpMyAdmin이 `db` 컨테이너가 준비된 후에 실행되도록 설정
    networks: # 네트워크 설정
      - app-network # `db`와 동일한 네트워크에 연결
    restart: always # 컨테이너가 중단되었을 때 자동으로 재시작

networks:
  app-network: # 사용자 정의 네트워크를 생성
    driver: bridge # 브리지 네트워크 드라이버를 사용하여 동일 네트워크 상에서 통신 가능

volumes:
  db_data: # 로컬에서 데이터 지속성을 유지하기 위한 볼륨 생성               

일단 docker-compose 양식을 모르는 친구들도 있을까봐 이렇게 각 줄마다 상세히 적어놨습니다.

 

간단하게 docker-compose를 설명하자면 docker-compose.yml은 Docker Compose에서 사용하는 구성 파일로, 여러 컨테이너를 하나의 애플리케이션으로 정의하고 관리하기 위한 설정을 제공합니다. 이 파일을 사용하면 여러 Docker 컨테이너를 쉽게 정의, 연결, 배포, 실행할 수 있습니다.

 

한줄 요약하면 docker-compsoe up 이라는 명령어 하나면 수 많은 설정 명령어들을 안할 수 있습니다. 진짜 저는 docker를 사용하고 compose라는 존재를 모르고 살다가 알게되니깐 진짜 신세계였는데, 이제는 다시 명령어가 더 편해진거 같긴 합니다.

docker compose 실행

일단 자기 컴퓨터에 terminal을 모두 실행시키고, 저는 Mac이라서 조금 편하지만, window친구들도 docker 환경을 맞췄다면, wsl2라는 벽과 Ubuntu도 다 설치했을테니깐 이건 자세히 설명 안하겠습니다. 일단 저는

mkdir 명령어를 통해 docker-data를 만들고 이 안에 phpmyadmin_mysql이라는 폴더를 만들었습니다. 일단 저 위에 mysql_test는 잊으세요.

그리고 phpmyadmin_mysql 폴더를 들어가면 여기에

 

$ vim docker-compose.yml

 

이라는 명령어를 통해 파일을 만들고 그 안에 위의 양식을 넣습니다. 

 

esc누른 다음 :wq

 

를 치게 되면 저장하고 나오게 됩니다.

 

그런 상태에서 docker-compose.yml 파일이 있는 현 위치에서

$ docker-compose up -d

 

라는 명령어를 작성하면

 

도커 데스크탑에 이러한 화면이 나오게 될겁니다!

 

phpmyadmin에 접속하여 임시 테이블 만들기

도커 데스크탑에서 8080:80으로 포트가 적혀있는 phpmyadmin으로 접속하면  웹으로 들어가게 될겁니다. 아마도 localhost:8080을 접속하면 바로 될텐데, 만약 8080으로 잡혀있다면 포트를 바꿔야합니다. 

 

 

여기서 간단하게 table을 만들어보겠습니다. 

이렇게 대충 설정하고 저장을 누릅니다 하단에 그러면 이렇게 생성이 됩니다!

 

그리고 여기서 진짜 놀라운점. 내가 생성한 데이터베이스를 dump를 해야하는데, 그냥 설정에 내보내기를 누르면 끝입니다.

이렇게 어딨어. 다있겠지만 그래도 이런게 어딨어. 그리고 이렇게 내보내기를 누르면 자기 컴퓨터에 .sql확장자인 파일이 생겼을 겁니다. 그러면 거의 끝났어요!

 

dump 한 .sql 파일을 적용한 새로운 db docker image 만들기

총 3개의 준비물이 필요합니다.

1. .sql 파일

2. Dockerfile

3. Docker가 설치된 환경

 

아까 docker-compose를 작성한 것처럼

$ mkdir mysql_test

명령어로 폴더 하나를 만들어주고

$ vim Dockerfile

을 통해서 파일을 만들어주는데 vim이 없다면 apt, yum와 같은 패키지로 다운받으면 됩니다. (검색 고고) 없으면 vi 쓰세요 

전 vim 좋아합니다.

이렇게 mysql_test안에 두개의 파일이 있어야합니다.꼭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

아까 내보내기를 통해 보낸 sql 파일을 이렇게 여기에 들어가있어야해요. 그리고 Dockerfile 양식은 아래와 같습니다.

# MySQL 공식 이미지 기반
FROM mysql:8.0

# 데이터베이스 초기화 스크립트 복사
COPY db_dump.sql /docker-entrypoint-initdb.d/

# 환경 변수 설정
ENV MYSQL_ROOT_PASSWORD your_root_password
ENV MYSQL_DATABASE your_database_name
ENV MYSQL_USER your_user
ENV MYSQL_PASSWORD your_password

# MySQL 포트 열기
EXPOSE 3306

여기서 궁금한거는 /docker-entrypoint-initdb.d/ 일텐데

 

/docker-entrypoint-initdb.d**는 MySQL Docker 이미지에서 제공하는 초기화 스크립트를 자동으로 실행하는 디렉터리입니다.

이 디렉터리에 배치된 스크립트 또는 SQL 파일은 MySQL 컨테이너가 최초로 시작될 때 자동으로 실행됩니다.

MySQL 초기 설정, 데이터베이스 생성, 기본 데이터 삽입 등을 자동화하는 데 사용됩니다

 

작동 원리

 

MySQL Docker 이미지에는 docker-entrypoint.sh라는 초기화 스크립트가 포함되어 있습니다. 이 스크립트는 다음을 수행합니다:

1. 컨테이너가 처음 실행될 때 MySQL 데이터 디렉터리(/var/lib/mysql)가 비어 있는지 확인.

2. 데이터 디렉터리가 비어 있다면 초기화를 진행:

/docker-entrypoint-initdb.d 디렉터리 안에 있는 모든 .sql, .sql.gz, .sh 파일을 자동으로 실행.

 

이라고 합니다.

 

이 키워드만 알면 서치해서 오류 잡을 수 있어요.

그래서 이제 Dockerfile을 만들었으니 이미지를 만들어야하는데 사용하는 명령어는

$ docker build -t mysql_test .

mysql_test는 이미지 이름으로 들어갈겁니다.

그리고 이미지가 생성될겁니다! 그러면 docker desktop에 들어가서 그 이미지를 hub에 spring boot image와 함께 올리면 과제가 끝입니다.

휴..

일단 한번 확인해볼까요? 해당 이미지를 실행시켜보면

짠 이렇게 새로운 내가 설정한 DB의 데이터 그대로 도커 이미지가 생성되고 실행시키면 그대로 나오는 것을 알 수 있습니다!

 

일단 제가 하는 방법으로만 말한건데 방법은 다양합니다!

아래 블로그를 참고해서 해도 좋을거같아요!~

https://int-i.github.io/sql/2020-12-31/mysql-docker-compose/ 

 

Docker Compose로 MySQL/MariaDB 세팅하기 - 인하대학교 인트아이

Docker Compose를 이용하면 복잡한 DB 설치와 세팅 과정을 파일 하나로 간략화 할 수 있습니다. Docker와 Docker Compose가 설치되어 있어야 하며,...

int-i.github.io

 

728x90
반응형