Docker - 공식이미지와 MariaDB Connect Engine 공유

Cloud/docker / /
728x90

 


1.   MariaDB 공식 Image와 한계점 처리

Dockerhub에서 MariaDB 공식 이미지 이미지는 아래와 같다.

https://hub.docker.com/_/mariadb

 

해당 이미지의 Dockerfile을 살펴보면 맨 마지막에 해당과 같은 명령어를 실행한다.

CMD ["mysqld"]

 

해당 명령어가 실행되면서 Dockerfile build 시에 mysql Service를 자동으로 실행하는 것을 Container에 포함하게 되고 ProcessNo 1번으로 System Boot와 같은 영역이 된다.

root@mariadb1:/etc/mysql/mariadb.conf.d# ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD

mysql        1     0  0 10:58 ?        00:00:00 mysqld

root        62     0  0 10:59 pts/0    00:00:00 bash

root        76    62  0 11:01 pts/0    00:00:00 ps -ef

root@mariadb1:/etc/mysql/mariadb.conf.d#

 

 

해당 내용으로 인해 2가지 문제가 발생된다.

1)     Service 종료를 할 수 없는 상황

root@mariadb1:/etc/mysql/mariadb.conf.d# service mariadb stop

 * Stopping MariaDB database server mariadbd        [fail]

root@mariadb1:/etc/mysql/mariadb.conf.d#

 

A.     Service를 재실행해야 하는 Option변경을 하게 상황에서 ContainerStop 했다가 Start 해야 하는 상황이 발생된다.

B.      만약 docker-compose 파일에 해당 컨테이너가 올라갈 때만 적용되길 원하는 init.sh 같은 것을 정의하여 적용했다면 해당 shell이 실행되면서 기 진행된 내용이 초기화 될 수 있다.

2)     conf 파일을 외부 volume 으로 연결할 수 없는 상황

A.     conf의 저장위치를 관리하고 싶을 때 해당 volume으로 연결된 파일에 생성이 되지 못하는데 그 이유는 권한 문제이다.

build./db1

container_namemariadb1

restartalways

volumes:

.:/home/docker-container/mariadb

./db1/sqlfile:/var/lib/mysql

./db1/mariadb.conf.d:/etc/mysql/mariadb.conf.d

 

\mariadb> docker-compose up -d

 

root@mariadb1:/home/docker-container/mariadb# cd /etc/mysql/mariadb.conf.d/

root@mariadb1:/etc/mysql/mariadb.conf.d# ls

root@mariadb1:/etc/mysql/mariadb.conf.d#

 


B.      Conf 파일을 Host OS에서도 관리하기 위해서는 다음과 같은 방법을 사용할 수 있다.

                                  i.         conf와 연결되지 않은 외부 volume을 생성하여 Guest OS에 파일을 생성한다.

volumes:

.:/home/docker-container/mariadb

./db1/sqlfile:/var/lib/mysql

#  - ./db1/mariadb.conf.d:/etc/mysql/mariadb.conf.d

 

root@mariadb1:/etc/mysql/mariadb.conf.d# ls

50-client.cnf  50-mysql-clients.cnf  50-mysqld_safe.cnf  50-server.cnf  50-server.cnf.dpkg-old  60-galera.cnf  99-enable-encryption.cnf.preset

root@mariadb1:/etc/mysql/mariadb.conf.d#

 

                                 ii.         Guest OS conf 파일을 Host OS 폴더가 연결된 Volume으로 복사

root@mariadb1:/etc/mysql# cp -r mariadb.conf.d/ /home/docker-container/mariadb/mariadb.conf.d/

root@mariadb1:/etc/mysql# ls /home/docker-container/mariadb/mariadb.conf.d/

50-client.cnf  50-mysql-clients.cnf  50-mysqld_safe.cnf  50-server.cnf  50-server.cnf.dpkg-old  60-galera.cnf  99-enable-encryption.cnf.preset

root@mariadb1:/etc/mysql#

 

                                iii.         Host OS에서 Conf Path로 쓸 폴더에 해당 파일 이전


 


                                iv.         해당 Containerdown docker-compose.yml 수정에서 conf 파일 폴더를 volume으로 연결 후 다시 up 한다.

docker-compose down 

 

build./db1

container_namemariadb1

restartalways

volumes:

.:/home/docker-container/mariadb

./db1/sqlfile:/var/lib/mysql

./db1/mariadb.conf.d:/etc/mysql/mariadb.conf.d

 

docker-compose up -d

 

root@mariadb1:/home/docker-container/mariadb# cd /etc/mysql/mariadb.conf.d/

root@mariadb1:/etc/mysql/mariadb.conf.d# ls

50-client.cnf  50-mysql-clients.cnf  50-mysqld_safe.cnf  50-server.cnf  50-server.cnf.dpkg-old  60-galera.cnf  99-enable-encryption.cnf.preset

root@mariadb1:/etc/mysql/mariadb.conf.d#

 

파일 수정 후 날짜 변경 확인

root@mariadb1:/etc/mysql/mariadb.conf.d# vi 50-server.cnf

 


C.      해당 문제의 원인은 권한 문제이며 mysql 설치 시 자동으로 셋팅되어 build 시 이미 권한이 주어 지기 때문에 Host 폴더를 연결한 Volume 에 파일을 생성할 수 없는 것이다.

D.     따라서 MariaDB 설치와 실행을 Guest OS에서 실행하면 2가지의 이슈를 모두 피할 수 있다.

 

2.   MariaDB Connect Engine Docker 공유

위의 문제를 해결하기 위해 Mariadb 10.5repo를 연결하고 Connect Engine odbc 관련 패키지는 공유 하고자 한다.

 

Dockerfile의 내용은 다음과 같다.

https://github.com/YunhoJIn/docker/blob/main/mariadb10.5_connect/Dockerfile

 

FROM ubuntu:20.04

 

# mysql account register

RUN groupadd -r mysql 

RUN useradd -r -g mysql mysql

RUN useradd -r -m -g mysql mha

 

# basic system install

RUN apt-get update 

RUN DEBIAN_FRONTEND="noninteractive" apt-get install -y tzdata

RUN set -ex; \

    apt-get install -y --no-install-recommends \

        sudo \

        net-tools \

        iputils-ping \

        openssh-server \

        unzip \

        wget \

        gnupg \

        dirmngr \

        curl \

        vim \ 

        locales \

        language-pack-ko \

        unixodbc \

        unixodbc-dev \

        openjdk-8-jdk \

        odbc-mariadb \

        mariadb-plugin-connect \

        software-properties-common

        

RUN curl https://mariadb.org/mariadb_release_signing_key.asc | apt-key add -

RUN echo 'deb [arch=amd64] https://mirror.yongbok.net/mariadb/repo/10.5/ubuntu focal main' >> /etc/apt/sources.list.d/mariadb.list

RUN echo 'deb-src https://mirror.yongbok.net/mariadb/repo/10.5/ubuntu focal main' >> /etc/apt/sources.list.d/mariadb.list

RUN apt-get update 

 

# set to language korean

RUN locale-gen ko_KR.UTF-8

ENV LC_ALL C.UTF-8

ENV LANGUAGE ko_KR.UTF-8

ENV LANG ko_KR.UTF-8

RUN update-locale LANG=ko_KR.UTF-8 LC_MESSAGES=POSIX

 

# set environment variable

ENV TZ=Asia/Seoul

ENV TERM=xterm-256color

ENV NLS_LANG=KOREAN_KOREA.AL32UTF8

 

# set odbc driver sql server

RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -

RUN curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list

RUN apt-get update

RUN ACCEPT_EULA=Y apt-get install msodbcsql17 mssql-tools

RUN echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> /etc/profile

RUN echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> /etc/bash.bashrc

 

# grant sudo to mysql account

RUN echo 'mysql ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

 

1)     Ubuntu 20.04 OS를 기반으로 Image 제작되었다.

2)     mysql 전용 계정과 그룹을 생성한다.

3)     Linux에서 사용하는 기본적인 패키지들을 설치하고 Connect Engine 관련 패키지도 설치한다.

A.     odbc 관련 패키지

unixodbc \

unixodbc-dev \

odbc-mariadb \

 

B.      jdbc 관련 패키지

openjdk-8-jdk \

 

C.      Connect Engine 패키지

mariadb-plugin-connect \

 

4)     MariaDB Repos 설정한다.

5)     한글 관련 설정

6)     SQL Serverodbc로 연결하기 위한 관련 Repo 설정한다.

7)     위의 이미지는 다음과 같이 공유 되어 있다.

https://hub.docker.com/repository/docker/behind520/mariadb_10_5_connect_engine

8)     Taglatest 1개만 제공하고 있다.

FROM behind520/mariadb_10_5_connect_engine:latest

 

9)     해당 이미지는 up을 진행 후 apt install –y mariadb-server 를 통해서 서버를 설치해야 한다.

728x90

'Cloud > docker' 카테고리의 다른 글

Docker On WSL Without Desktop  (0) 2021.10.05
Docker - Neo4j 설정 공유 및 OS 한글과 이미지 공유  (0) 2021.07.12
Docker - Ubuntu 한글판 공유  (0) 2021.06.04
Docker on WSL  (0) 2021.04.15
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기