개발/개발관련

[개발관련] Docker_ MariaDB Container 만들기

mabb 2024. 6. 1. 12:14
반응형

들어가며

Database(MariaDB)가 필요할 때 다음과 같은 절차로 서버에 직접 설치하곤 하였습니다.

1) MariaDB설치 (패키지매니저 설치, 오프라인 환경에서는 준비한 RPM으로 설치)
2) my.cnf세팅
3) 데이터디렉터리 변경
4) 데이터베이스 생성
5) 유저생성
6) 스키마 및 코드데이터 세팅

만약 설치한 데이터데이스를 다른 서버에 옮겨야 한다거나, 여러 대의 서버에 위의 작업을 반복한다고 하면 귀찮고 힘든 작업이 될 것입니다.

 

목표

MariaDB 설정, 유저 및 데이터 베이스 생성, 스키마 및 코드데이터가 세팅된 도커 이미지를 만들어보겠습니다. 이 이미지의 컨테이너를 가동하기만 하면 서버에 직접 MariaDB를 설치할 때의 번거로운 절차가 한 번에 해결됩니다. 

 

Dockerfile

아래와 같이 도커파일을 작성하였습니다. 

FROM --platform=linux/amd64 mariadb:10.11
RUN apt-get update && apt-get install -y vim

RUN mkdir -p /data/dump
COPY .//dump.tar /data/dump

ENV MARIADB_ROOT_PASSWORD='ROOT비밀번호'
ENV MARIADB_USER='생성할유저아이디'
ENV MARIADB_PASSWORD='생성할유저비밀번호'
ENV MARIADB_DATABASE='생성할 데이터베이스명'

COPY ./my.cnf /etc/mysql/
RUN chmod +x /etc/mysql/my.cnf

COPY ./생성할_데이터베이스에_실행할_SQL.sql /docker-entrypoint-initdb.d/

기본적인 사항은 docker hub, docker docs, mariadb-docker git을 참고하였습니다. (하단 링크 첨부)
MariaDB Dockerfile에서 첫번째로 재미있는 점은 ENV 설정입니다.

- MARIADB_ROOT_PASSWORD
- MARIADB_USER
- MARIADB_PASSWORD
- MARIADB_DATABASE

Dockerfile로 이미지 생성 시 위의 환경 변수를 설정해 주면 MariaDB에 자동으로 해당하는 값들이 세팅됩니다. 이것이 어떻게 가능한지는 FROM 이미지인 mariadb:10.11의 도커파일을 보면 알 수 있습니다. 해당 이미지에서는 docker-entrypoint.sh 셸 스크립트를 ENTRYPOINT로 사용하고 있습니다. 그리고 docker-entrypoint.sh는 컨테이너 내 /usr/local/bin/ 경로에 위치합니다.

mariadb-docker/10.11 /Dockerfile

아래는 컨테이너의 /usr/local/bin/docker-entrypoint.sh 를 docker cp로 꺼내어 VSCode로 열어본모습입니다. Dockerfile에서 설정한 환경변수(ENV) 중 MARIADB_USER로 검색을 해보니 사용자를 생성하는 CREATE USER 문이 보입니다. 컨테이너에 설정한 환경변수(ENV)를 이용하여 컨테이너 내에서 가동되는 프로세스의 세팅을 해주는 것입니다. (비슷한 예로 DB접속 정보를. ENV 파일에 설정하는 방법이 있습니다.)

docker-entrypoint.sh

ENV를 이용한 데이터베이스 생성에 있어서 한 가지 아쉬운 부분은 ENV로 한 개의 데이터 베이스만 생성할 수 있다는 점입니다. 그 이유는 아래와 같이 docker-entrypoint.sh 파일에서 MARIADB_DATABASE 환경 변수를 복수로 지원하지 않기 때문입니다. 해당 셸 스크립트에서는 MARIADB_DATABASE 환경변수가 있을 경우 CREATE DATABASE 문을 수행합니다.
(이를 변경하고자 한다면 git에 공개된 dockerfile과 docker-entrypoint.sh를 수정하여 이미지를 만드는 방법이 있을 것입니다. 하지만 저는 일단 데이터베이스 별로 하나의 MariaDB 컨테이너를 만들었습니다.)

docker-entrypoint.sh

Dockerfile에서 두번째로 재미있는 점은 /docker-entrypoint-initdb.d 경로에 .sql파일을 COPY하는 부분입니다. 이 부분의 스크립트는 완벽히 파악은 못했습니다만,  /docker-entrypoint-initdb.d 경로 내의 파일을 이용하여 데이터베이스 초기 세팅을 수행하고 있습니다. 이 덕분에 Dockerfile에서 ENV로 생성한 데이터베이스 내에 스키마 및 코드 데이터 등을 미리 세팅할 수가 있습니다.

docker-entrypoint.sh
docker-entrypoint.sh

 

 

mariadb - Official Image | Docker Hub

Docker Official Images are a curated set of Docker open source and drop-in solution repositories. Why Official Images? These images have clear documentation, promote best practices, and are designed for the most common use cases.

hub.docker.com

 

 

mariadb-docker/10.11/Dockerfile at 44ed2e231207787c08d56acc94b79d5f06efe006 · MariaDB/mariadb-docker

Docker Official Image packaging for MariaDB. Contribute to MariaDB/mariadb-docker development by creating an account on GitHub.

github.com

 

 

Reference documentation

Find reference documentation for the Docker platform’s various APIs, CLIs, and file formats

docs.docker.com

 

 

my.cnf

아래와 같이 기본적인 사항만 my.cnf로 작성하였습니다. 저의 경우에는 이미지 생성 시 /etc/mysql/ 경로에 해당 my.cnf파일을 COPY 하고 실행 권한을 추가하였습니다. 

[client-server]
socket = /run/mysqld/mysqld.sock

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mariadb]
character-set-client-handshake = FALSE
character-set-server           = utf8mb4
collation-server               = utf8mb4_unicode_ci
lower_case_table_names=1

!includedir /etc/mysql/mariadb.conf.d/
!includedir /etc/mysql/conf.d/

 

 

docker-compose.yml

아래와 같이 Docker compose 파일을 작성하였습니다. 여기서 편리한 점은 바로 volumes 부분입니다. MariaDB를 직접 설치할 때 귀찮은 부분 중 하나가 위에 작성하였던 3) 데이터디렉터리 변경 부분입니다. 데이터디렉터리를 변경하는 것은 MariaDB에서 기본 설정되는 /var/lib/mysql 파티션의 용량이 부족할 때 필요합니다. 원래는 my.cnf 파일에 datadir 설정을 추가하고 rsync 등의 툴을 이용하여 데이터 디렉터리를 이동시키는 절차가 필요합니다. 하지만 도커 컨테이너를 이용한다면 컨테이너의 데이터 디렉터리 경로를 호스트의 원하는 경로에 마운트 해줌으로써 데이터 디렉터리를 세팅해 줄 수 있습니다.

version: 2.24
services:
    db1:
      image: db1_img
      container_name: db1_container
      restart: always
      ports:
        - "33061:3306/tcp"
      volumes:
        - "/mysql/db1:/var/lib/mysql"
    db2:
      image: db2_img
      container_name: db2_container
      restart: always
      ports:
        - "33062:3306/tcp"
      volumes:
        - "/mysql/db2:/var/lib/mysql"

 

결론

MariaDB를 도커 컨테이너로 운영하면 설치, MariaDB 설정, 데이터 베이스 및 유저 생성, 스키마 및 코드데이터 세팅까지 이미지로 만들어 둘 수 있고 어떤 서버라도 도커만 있다면 손쉽게 MariaDB 컨테이너를 가동할 수 있습니다.

아래와 같은 절차로 확인 하였습니다.
1) 이미지 생성: docker build -t '이미지명' -f '도커파일명' .
2) 이미지 저장: docker save -o img.tar '이미지 1' '이미지 2'
3) 구축할 서버로 전송: scp
4) 이미지 로드: docker load -i img.tar
5) 도커컴포즈 실행: docker compose -f '도커컴포즈파일명' up -d
6)도커 컨테이너 확인: docker exec -it '컨테이너명' /bin/bash
7) MariaDB 확인: mysql -u root -p
8) my.cnf 설정 적용 확인: show variables like '% lower%';
9) 데이터베이스 생성 및 스키마 확인: information_schema.tables 확인

결과

 

반응형