Docker Alpine Linux에 WordPress Mariadb 설치하기#2

Docker Alpine Linux에 Mariadb를 설치하고 WordPress용 Database를 구성하는 방법에 대해 설명한다.

1. 환경설명

프로덕션이나 라이브 환경에서는 Managed 된 클라우드 서비스 또는 VM에 직접설치해서 사용하는걸 권장한다.

alpine에 설치하는 경우는 극히 드물어서 레퍼런스를 찾기도 어렵다.

Docker Hub의 mariadb Official Image를 활용하는 방안도 있지만 해당 이미지의 Dockerfile을 확인해보면 Ubuntu(focal)를 사용하는데 나에게는 필요없는 패키지들이 설치된다.(pwgen,tzdata 등등, 고도화 이후 필요할것 같다)

지난 포스팅에서 Synology NAS의 Virtual Machine Manager 기능을 활용하여 HostOS를 구성하였고, WordPress 컨테이너를 구축하였다.
이번 포스팅에서는 같은 HostOS에 DBMS를 구축하는 방법에 대해 알아본다.

1. HostOS인 Ubuntu에 Docker 컨테이너용 Storage Directory 생성

				
					mkdir -p /docker/mariadb/config # mariadb config directory
mkdir -p /docker/mariadb/data # mariadb data directory
				
			

/docker/mariadb/config 폴더에서 작업한다. cd /docker/mariadb/config

2. Mariadb Dockerfile 설정(Dockerfile)

				
					# alpine 3.15 Version을 기반으로 한다.
FROM alpine:3.15

# no-cache 옵션은 /var/cache/apk/* 에 garbage가 남지 않음.
# alpine3.15 기준 mariadb-10.6.8-r0 LTS
# SQL문을 직접 넣기위해 client 필요
# /etc/init.d/mariadb setup 이후 mysqld 재시작을 위해 openrc 필요
RUN apk add --no-cache mariadb mariadb-client openrc

# mysql_secure_installation 설정이 담긴 sql쿼리문
COPY mysql_secure_installation.sql /home/

# sql server 설정 since alpine 3.9 First Global config file, main directives
COPY mariadb-server.cnf /etc/my.cnf.d/

# wordpress database 설정
COPY create_wordpressdb_user.sql /home/

# sql 시작 스크립트
COPY start_mariadb.sh /home

VOLUME ["/var/lib/mysql"]

# DBMS포트는 8475를 사용한다.
EXPOSE 8475
ENTRYPOINT sh /home/start_mariadb.sh
				
			

3. Mariadb Security 설정 SQL 쿼리(mysql_secure_installation.sql)

최초 Mariadb가 설치되면 OS의 Root 권한을 가진 shell에서 DB에 접근하면 패스워드 없이도 접근이 가능하다.(socket)
mariadb 데몬에서 관리되는 계정만 허용할 경우 아래와 같이 native로 변경하고 패스워드를 설정해준다.
SQL문이 실행되고 나면 localhost, 즉 Docker 내부에서만 Root 로그인이 가능하다.

				
					-- mariadb 10.5부터 native, socket 인증방식 동시사용가능, native인증으로 고정 및 root 패스워드 변경
ALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING PASSWORD("변경할 패스워드 입력");

-- '@localhost' 익명연결 허용 삭제
DELETE FROM mysql.user WHERE User='';

-- testdb 삭제
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';

-- 적용
FLUSH PRIVILEGES;
				
			

4. Mariadb 기본 설정(mariadb-server.cnf)

				
					#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]
socket=/run/mysqld/mysqld.sock
port=8475
user=mysql
bind-address=0.0.0.0
# 네트워크 통신 허용
skip-networking=false

# Galera-related settings
[galera]
# Mandatory settings
#wsrep_on=ON
#wsrep_provider=
#wsrep_cluster_address=
#binlog_format=row
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#
# Allow server to accept connections on all interfaces.
#
#bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.5 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.5]
				
			

5. WordPress database 생성 및 유저, 권한 설정(create_wordpressdb_user.sql)

				
					-- database 생성
create database wordpress;

-- database 유저생성
create user 'wordpressuser'@'%' identified by '{사용할 패스워드 입력}';

-- database 권한
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, CREATE VIEW, EVENT, TRIGGER, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON wordpress.* TO 'wordpressuser'@'%';

-- 적용
FLUSH PRIVILEGES;
				
			

6. Mariadb 구동 스크립트(start_mariadb.sh)

				
					# rc pid 실행을 수행한다.
rc default

# datadir에 기본 셋업을 진행한다.
/etc/init.d/mariadb setup

# SQL 쿼리문을 넣기위해 잠시 실행한다.
rc-service mariadb start

# wordpress database 생성 SQL문
mysql -u root < /home/create_wordpressdb_user.sql

# mysql_secure_installation 설정이 담긴 sql쿼리문
mysql -u root < /home/mysql_secure_installation.sql

rc-service mariadb stop

# ForeGround로 실행한다.
/usr/bin/mysqld_safe
				
			

7. Mariadb Docker 빌드 및 실행

				
					docker build -t alpine:mariadb-0.1 /docker/mariadb/config
docker run -d --name wordpress_db -p 8475:8475 -v /docker/mariadb/data:/var/lib/mysql alpine:mariadb-0.1
				
			

최종완료된 Docker Image Size이다.

mariadb1

References