배포 전용 DB 서버 구축 체계화(도커 컨테이너로 관리하기)

김상연·2023년 2월 2일

배포와 서버

목록 보기
7/8

배경

도커를 막 접했을 땐 컨테이너로 DB를 관리하는 것에 반감이 있었다. 컨테이너 삭제는 10초도 안걸리는데, 그러면 그 안에 데이터가 다 날아간다니..

도커 볼륨 어쩌구 하는 대책이 있다는 것은 그때도 읽었었다. 하지만 그때 당시 당장 빨리 배포하고 싶은 마음에 익숙한 대로 로컬에서 상시 돌아가는 방식을 선택했었다.

어제 포트폴리오 사이트를 만들다보니 기존 프로젝트들을 다시 배포 해야 할 필요를 느꼈다. 그러나 결국엔 하지 못했다. 다른 것 보다도 DB가 문제다.. 새로운 서버로 옮길 때 마다 프로그램을 설치하고, 스키마를 만들고, 포트 열어주고, 포트 연결하고... 참 번거롭다. 그래서 이참에 제대로 다시 공부하고 재사용 가능한 체계를 만들어두기로 했다.

본론

전체 구상

  • 프로젝트 하나에 로컬 디렉토리 하나를 사용한다.(도커 볼륨)
  • 프로젝트 하나에 DB서버용 컨테이너 하나(=도커 이미지 하나)를 사용한다.
  • DB서버의 설정은 도커 이미지를 만드는 도커 파일에서 최대한 자동화 한다.
  • 스키마 설계 또한 도커파일에서 한다.

아직 외부 배포는 해 보지 않았던 bulse2를 가지고 실전적으로 공부 해 봐야겠다.

1. 도커파일 만들기


FROM mariadb:latest

ENV MYSQL_ROOT_PASSWORD=메롱

RUN apt-get update && apt-get install -y vim

일단 최신버전 가져오면서 필수 변수 설정 해 준다. 이건 mariadb공식 문서에서 시킨대로 했다.

그리고 vim도 설치 해 준다.

#[host dir]:[container dir]
VOLUME ~/DB/bulse:/var/lib/mysql						

잘못된 방법

볼륨 설정은 해 준다.(엄청 쉽다) 그냥 호스트 dir과 컨테이너의 dir을 연결 해 주기만 하면 된다. 포트 연결 하듯이.

위처럼 하면 안된다.
https://darkrasid.github.io/docker/container/volume/2017/05/10/docker-volumes.html

도커파일에서 볼륨을 설정하면 경로 : 경로로 되지 않고, 도커가 자동으로 생성해준(이름도 막 해쉬값으로 지어주는 그것!) 볼륨으로 입력된 경로를 연결 해 준다. 어째 암만 해 봐도 호스트에 디렉토리가 생성되지 않더만..

보니까 볼륨은 여러가지 방식으로 설정 할 수 있지만, 그냥 컨테이너 run 시킬 때
-v host_dir:container_dir 처럼 볼륨 옵션으로 주는게 편리해보인다. 볼륨은 설정은 도커파일에서 제외한다! 아마도 훗날 도커 컴포즈에서 이것마저 스크립트화(?) 할 수 있을 것 같다.

COPY ./bulse-sql-script.sql /docker-entrypoint-initdb.d/

구글링해서 찾았는데, sql 파일을 통해 스키마 구성을 미리 해 줄 수 있다. 여기까지 만든 이미지로 컨테이너를 실행 해 봤더니, 내부에서 내가 작성한 sql 파일에 따라 스키마가 잘 구성되어 있음을 확인했다.

개발 할 때 사용하던 로컬 db schema를 mysqldump로 복제하려고 했다. 근데 웬걸, root 계정 비번을 까먹어서 복구하다가 뭔가 잘못 건드렸는지 mariadb를 다시 켤 수가 없었다. (systemctl restart를 실패)

실제 데이터가 저장된 위치에서 frm과 ibd 확장자를 가진 파일들을 확인했고, dbsake(https://dbsake.readthedocs.io/en/latest/)라는 툴을 이용해서 테이블 등 스키마의 틀을 재생성 할 수 있는 sql파일을 만들어줬다.



2. 실제 서버에 적용하는 나만의 체계 만들기

profile
리눅스와 컴퓨터 프로그래밍

0개의 댓글