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변경을 하게 상황에서 Container를 Stop 했다가 Start 해야 하는 상황이 발생된다.
B. 만약 docker-compose 파일에 해당 컨테이너가 올라갈 때만 적용되길 원하는 init.sh 같은 것을 정의하여 적용했다면 해당 shell이 실행되면서 기 진행된 내용이 초기화 될 수 있다.
2) conf 파일을 외부 volume 으로 연결할 수 없는 상황
A. conf의 저장위치를 관리하고 싶을 때 해당 volume으로 연결된 파일에 생성이 되지 못하는데 그 이유는 권한 문제이다.
build: ./db1
container_name: mariadb1
restart: always
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. 해당 Container를 down 후 docker-compose.yml 수정에서 conf 파일 폴더를 volume으로 연결 후 다시 up 한다.
docker-compose down
build: ./db1
container_name: mariadb1
restart: always
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.5의 repo를 연결하고 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 Server에 odbc로 연결하기 위한 관련 Repo 설정한다.
7) 위의 이미지는 다음과 같이 공유 되어 있다.
https://hub.docker.com/repository/docker/behind520/mariadb_10_5_connect_engine
8) Tag는 latest 1개만 제공하고 있다.
FROM behind520/mariadb_10_5_connect_engine:latest
9) 해당 이미지는 up을 진행 후 apt install –y mariadb-server 를 통해서 서버를 설치해야 한다.
'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 |
최근댓글