이전 블로그에서 적었던 적이 있는 내용인데요. 이는 On-Premise 환경에서의 환경설정을 다루었는데, Docker Container로 넘어오면서는 조금 달라져서 Docker 환경에서의 설정 방법을 간단하게 기재해보고자 합니다.
혹시, Ubuntu 환경에서 Docker 설치 방법을 찾고 계시다면, 여기 글을 참고해주세요!
우리나라에서 DB를 구성할 때에는 고려를 해야할 부분이 크게 2가지입니다.
그 외에도 여러 상황에 따라서 접속 가능한 IP를 제한한다던지 등의 설정을 해줘야합니다. 이번 글에서는 간단하게 위의 2가지 설정을 반영하는 설정 예제를 공유드리고자 합니다.
사실, Docker 명령어로 배포하는 방법이 있습니다. 개인적으로는 명령어가 너무 길어지고, 각각의 옵션이 뭘 뜻하는지도 이해가 되지 않을 때가 있어서 저는 주로 Docker-compose를 사용합니다. 이를 이용하면 깔끔하게 컨테이너의 환경을 설정하고, 다른 환경에 옮길 때도 설정을 동일하게 하는데 도움이 됩니다.
# docker-compose.yaml
version: '3.1'
services:
mariadb:
container_name: mariadb
image: mariadb:(버전 기재)
restart: always
# 환경에 따라 변경
expose:
- "3306"
volumes:
# DB 데이터 저장 디렉터리
- ./data:/var/lib/mysql
# 설정 파일 저장될 위치
- ./config:/etc/mysql/conf.d
environment:
# 정의하지 않으면 실행 시, 에러가 발생합니다.
- "MYSQL_ROOT_PASSWORD=(root 계정의 PASSWORD 정의)"
# 컨테이너 내의 시스템 타임존을 우리나라에 맞게 설정합니다.
- "TZ=Asia/Seoul"
command:
# 위 명령어를 사용하지 않으면, 일부 설정이 latin으로 설정됩니다.
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
mariaDB의 버전은 여러가지인데, 각자에 맞는 버전으로 설정합니다. Tag는 Docker Hub에서 확인하실 수 있습니다. 저는 이전 서버에서 이전하는 것이기 때문에 버전을 이전 서버와 동일하게 맞췄습니다.
제가 설정한 환경의 경우, 외부에서의 연결이 필요 없고, 컨테이너들 사이에서만 통신을 하는 환경이기 때문에 컨테이너 내부 네트워크에만 노출시키는 expose라는 명령을 사용했습니다. 만일, 컨테이너 외부에서 연결이 필요하다면, ports로 바인딩할 포트를 정의하시면 됩니다.
volumes에는 2가지를 적어두었습니다. 첫번째는 data 라는 디렉터리인데, 이는 mariaDB의 데이터가 저장되는 디렉터리와 연결하여, 컨테이너를 재시작하더라도 데이터가 초기화되지 않도록 설정합니다.
두번째로 config 라는 디렉터리는 charset을 UTF8MB4로 설정하기 위한 conf.d 파일들을 연결시켜주기 위해 설정하였습니다.
environment에는 환경변수가 들어가 있는데요. MYSQL_ROOT_PASSWORD 의 경우 root 계정의 비밀번호를 정의해줍니다. 이 옵션을 정의하지 않고 시작할 경우 에러가 발생하여 포함시켰습니다. 두번째로 TZ 라는 환경변수가 있습니다. 이는 컨테이너 내의 타임존을 명시하여 추후에 생길 문제를 방지합니다.
이전에 직접 설치했을 때에는 utf8mb4가 기본이었던 걸로 기억합니다만, mariaDB 컨테이너의 기본 charset은 latin1 입니다. 그래서, Config를 수정하여 실행하여야 utf8mb4로 설정이 되는데요. mariaDB 컨테이너를 실행하면 있는 기본 Config 파일을 기반으로 수정한 파일들입니다.
# docker.cnf
[mysqld]
skip-host-cache
skip-name-resolve
# mariadb.cnf
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
[mysqldump]
default-character-set=utf8mb4
# mysqld_safe_syslog.cnf
[mysqld_safe]
skip_log_error
syslog
위 3개의 파일을 작성하여, config 디렉터리에 넣으시면 됩니다.
위와 같이 구성하시고, docker-compose up -d
하시면, 실행되는 모습을 확인할 수 있습니다.
Volume를 Docker에서 제공하는 Volume으로 변경하여 구성할 수 있습니다. Docker-compose 구성 파일 최하단에 아래 내용을 추가하고, Volume 부분의 Host 디렉터리 부분을 생성한 Volume으로 변경합니다.
volumes:
(Docker Volume 이름):
Docker-copmose down을 수행할 때, 생성한 볼륨도 삭제하기 위해서는 -v
옵션을 추가합니다.
위와 같이 Docker-compose 구성 파일에 서비스가 하나만 있다면, 네트워크가 달라 다른 서비스와 통신을 할 수 없습니다. 이럴 때에는 Docker-compose 구성 파일에 다른 서비스를 추가하여 통신하는 방법도 있지만, Docker에서 미리 network를 생성하고 해당 network에 DB와 통신할 컨테이너를 같은 네트워크 붙혀줍니다.
네트워크는 아래 명령어로 생성합니다.
docker network create (네트워크 이름)
이후, docker-compose 구성 파일에서 아래 내용을 추가합니다.
networks:
(네트워크 이름):
external: true
그 다음, mariadb 서비스 구성에서 아래 내용을 추가합니다.
networks:
- (네트워크 이름)
위 구성의 경우 연결할 컨테이너 구성에 같이 추가해줘야겠지요.
이렇게 간단하게 제가 설정했던 mariaDB의 설정을 공유해드렸습니다. 질문 사항 있으시면 댓글로 부탁드립니다. 그리고, 제안하실 부분이 있다면 제안해주심 감사하겠습니다! 🤗