SW 개발

[오드로이드 설정] mariadb docker 수동 설치 (Dockerfile 직접작성)

. . . 2020. 9. 8. 10:12
반응형

아래내용은 odroid c2 기준으로 설명을 한 자료입니다. 하지만 다른 오드로이드 보도나 다른 sbc 에서도 유사한 문제가 있을시, 본 포스트와 동일하게 적용이 가능할것이라고 생각됩니다.

또한, 기본적인 docker 를 사용하는 방법을 익힌 사용자 기준으로 설명됩니다. (이번기회에 docker 에 대해서 같이 공부해보시죠 ㅠㅠ)

기존 mariadb docker container 의 문제점

오드로이드에서는 제공되는 mariadb(https://hub.docker.com/_/mariadb) 의 docker 를 사용할수있다. (arm64 arch 를 제공한다.)

하지만.. 실제 적용해보면 오만가지 문제가발생한다.

mariadb       | 2020-09-07 06:40:09+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 1:10.5.5+maria~focal started.
mariadb       | 2020-09-07 06:40:10+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
mariadb       |         command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.PGni8JgQRH

대표적인 예가 위와같은 문제점이 발생한다. 그뿐만아니라 몇가지 문제점이 더 발생하는데... 해결하기가 영 까다로운게 아니다. (구글링을 해도 별다른 내용이 없었다.)ㅠㅠ

그래서, 그냥 native 설치방식으로 docker 를 만들기로한다.

그럼 매뉴얼 하게 만들자.

여러가지 포스팅이나, 오드로이드 공식블로그를 보면 lamp 서버를 구성시 mariadb 를 설치해서 쓰는걸 확인 하였다. 그럼 mariadb 사용가능하네!!

그래서 그냥 매뉴얼하게 설치하자.

Dockerfile

일단, 다음과 같이 Dockerfile 을 구성한다.

FROM ubuntu:16.04

#Creator
MAINTAINER 0.2 xxxx@gmail.com

# repo update
RUN apt-get update

# mysql
RUN apt-get install -y mariadb-server mariadb-client php-mysql

# tz setting
RUN DEBIAN_FRONTEND="noninteractive" apt-get -y install tzdata

# locale setting
# RUN apt-get install -y --no-install-recommends locales
RUN apt-get install -y locales
RUN locale-gen en_US.UTF-8
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8

# dir setting

# entry point
COPY ./entrypoint.sh /usr/sbin/entrypoint.sh
ENTRYPOINT ["/usr/sbin/entrypoint.sh"]
  • 내용은 그냥 간단하다. 공식배포처에서 제공하는 mariadb 를 설치하는 과정이다.
  • 그리고 중요한곳은.. entrypoint.sh 를 실행한다는 것인다. 해당 스크립트에서 기본적인, db 설정등을 하게된다.

docker-compose.yml 구성

docker-compose 를 다음과 같이 구성한다. build: 내용을 추가함으로서, 위에서 작성한 Dockerfile 을 빌드하도록한다.

version: '3'
services:
  mariadb-d:
    image: mariadb-d:${TAG:-latest}
    container_name: mariadb-d
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./entrypoint.sh:/usr/sbin/entrypoint.sh
      - /root/.ssh:/root/.ssh:ro
      - ./docker/mariadb/etc/mysql/conf.d:/etc/mysql/mariadb.conf.d/
      - ./docker/mariadb/var/lib/mysql:/var/lib/mysql/
      - ./docker/mariadb/var/log/maria:/var/log/maria
    ports:
      - "51036:3306"
    restart: unless-stopped
    #    ports:
    #  - "9091:9091"
  • 포트나, 볼륨등은 사용자 설정에 맞게하자.
  • 일단, 기본 설정등이 없다면, ./docker/mariadb/etc/mysql/conf.d:/etc/mysql/mariadb.conf.d/ 부분을 삭제 한 후에 컨테이너를 만들도록하자.

entrypoint.sh

만든 컨테이너는 entrypoint.sh 를 실행하게 한다.

#!/bin/bash

mysqld_safe --skip-grant-tables &
sleep 4
mysql_install_db
mysql -u root -e "use mysql; update user set password=PASSWORD('your_password') where User='root'; flush privileges;"
mysql -u root -e "use mysql; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password';;; flush privileges;"
#service mysql start

while :
do
  sleep 3600
done
  • mysqld_safe --skip-grant-tables 을 실행하서, root password 를 커맨드로 바로 설정할수있게 한다.
  • sleep 4 를 하는이유는, mysqld_safe 를 백그라운드에서 실행하였을때 바로 db 접근이 안되는경우가 있어 일정시간 sleep 을 준다.
  • mysql_install_db 명령어를 통해서 기본 db 등을 만든다.
    • docker-compose.yml 에서 /var/lib/mysql 을 외부 볼륨으로 연결했기때문에 기본 db 가 없다.
    • 그래서 기본db 를 새로만들어준다.
  • mysql -u root -e xx 어쩌고 하는부분은 root password 를 설정하고, root 접근권한을 모두 풀어주는 것이다.
    • your_password 부분을 각자 원하는데로 써넣자.

마치며..

위와같이 하는것은 약간 무식한 방법이긴하다. 하지만, 기본 base image 를 ubuntu 로 설정하였고, entrypoint.sh 에서 쉘을 잡고있기때문에 언제든지 컨테이너 내부에 접근가능하다.

일단, docker 로 mariadb 를 분리한것에 의의를 두도록하고, 온전히 내 마음데로 컨테이너를 구성하고, 뜯어보고 즐길수있다는것에 의의를 두자.

반응형