● 실습 환경
(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에서 변경된 사항 정상적으로 반영되는 것 확인할 수 있다.
'여러가지 > Docker & AWS' 카테고리의 다른 글
[정리] 환경 변수 및 환경 변수 파일 (0) | 2024.06.05 |
---|---|
[실습](7) Rocky Linux - ssh 구축 (0) | 2024.06.05 |
[실습](5) node 구축 - nodemon & 환경 변수 (0) | 2024.06.05 |
[실습](4) nodemon (0) | 2024.06.05 |
[실습](3) 로컬 <-> 컨테이너 파일 전송 (0) | 2024.06.05 |