본문 바로가기

여러가지/Docker & AWS

[실습](6) mariadb 구축

● 실습 환경

(OS) Rocky Linux release 8.7 (Green Obsidian)

 

 

● 요구 사항

1) 설치

- mariadb 설치

- net-tools, iproute 네트워크 관련 도구

- iptables 방화벽 도구

 

2) 외부접속

- mariadb root 사용자 권한 부여

- 해당 포트(3308) 방화벽 설정

 

 

Step 1. 파일 생성

(파일) Dockerfile

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

베이스 이미지 :  Rocky Linux 최신 버전

FROM rockylinux/rockylinux:latest 

 

# mariadb-server 및 네트워크 관련 도구 설치 후 캐시 정리
RUN dnf install -y mariadb-server net-tools iproute iptables && \
    dnf clean all

 

# 데이터 디렉토리와 실행 디렉토리 생성 후 권한 부여
RUN mkdir -p /var/lib/mysql /var/run/mysqld && \
    chown -R mysql:mysql /var/lib/mysql /var/run/mysqld && \
    chmod 777 /var/run/mysqld

 

# 초기화 스크립트 컨테이너 내부로 복사 및 권한 부여
COPY init_mariadb.sh /init_mariadb.sh
RUN chmod +x /init_mariadb.sh

 

# 환경 변수 : mariadb 루트 비밀번호
ENV MYSQL_ROOT_PASSWORD=dbsafer00

 

# 환경 변수 : 사용할 포트
ENV PORT 3308
EXPOSE $PORT

 

# mariadb 설정 파일 컨테이너 내부로 복사
COPY my.cnf /etc/my.cnf

 

# 컨테이너 시작 시 초기화 스크립트 실행
CMD ["/init_mariadb.sh"]

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

/var/lib/mysql: MariaDB의 데이터 파일 저장 기본 디렉토리
/var/run/mysqld: MariaDB의 소켓 파일, PID 파일 등 실행과 관련된 임시 파일 저장 디렉토리

 

(파일) init_mariadb.sh

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

#!/bin/bash

# 데이터 디렉토리 초기화
mysql_install_db --user=mysql --datadir=/var/lib/mysql

# 포트 열기   ※ 외부 접속
iptables -A INPUT -p tcp --dport 3308 -j ACCEPT

# MariaDB 서버 시작
mysqld_safe --defaults-file=/etc/my.cnf --datadir='/var/lib/mysql' &

# MySQL 서버가 시작될 때까지 대기
for i in {30..0}; do
    if mysqladmin ping &>/dev/null; then
        break
    fi
    echo 'MySQL init process in progress...'
    sleep 1
done

if [ "$i" = 0 ]; then
   echo >&2 'MySQL init process failed.'
   exit 1
fi

# 루트 비밀번호 설정
mysqladmin -uroot password "${MYSQL_ROOT_PASSWORD}"

# 필요한 SQL 명령어 실행   ※ 외부 접속
mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" <<-EOSQL
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
EOSQL

# MariaDB 로그를 tail하여 컨테이너가 종료되지 않도록 함
tail -f /dev/null
-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

(파일) my.cnf

---------------------------------------------------------------------------------------------------------------------------------------------------------------- 

# mysqld 데몬 설정 정의, 따라서 MariaDB 서버 실행되는 동안 사용하는 주요 설정 포함

[mysqld]  

 # 실행 사용자

user=mysql 

# 데이터 디렉토리
datadir=/var/lib/mysql  

# 소켓 파일 경로
socket=/var/lib/mysql/mysql.sock  

# 에러 로그 파일 경로
log-error=/var/log/mariadb/mariadb.log  

# PID 파일 경로
pid-file=/var/run/mariadb/mariadb.pid  

# mariadb 서버 포트

port=3308 

# 모든 IP 주소에서의 접속 허용   ※ 외부 접속

bind-address=0.0.0.0  

 

# mysqld 데몬 안전한 시작 및 모니터링, 비정상적 종료 시 재시작
[mysqld_safe]  
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

Step2. 네트워크 생성

# docker network create --subnet=192.168.112.0/24 container_network

 

Step3. Dockerfile 빌드하여 이미지 생성

# docker build -t custom-mariadb .

 

Step4. 이미지 사용하여 컨테이너 생성 및 실행

# docker run -d --name mariadb_container --net container_network --ip 192.168.112.5 -p 3308:3308 --privileged custom-mariadb

 

Step5. 외부 접속

(로컬 시스템)

# mysql -h 192.168.112.5 -P 3308 -u root -p

(Workbench)

※ 외부 접속 시, 로컬 시스템 IP 기입합니다.

=> 컨테이너 내부 DB에서 변경된 사항 정상적으로 반영되는 것 확인할 수 있다.