탕구리's 블로그

Docker로 Redis 사용하기(feat. 삽질) 본문

devOps

Docker로 Redis 사용하기(feat. 삽질)

탕구리당 2020. 4. 7. 23:16
반응형

오늘의 내용은 레디스를 테스트하며 도커로 컨테이너를 띄우는 작업을 진행하며 겪었던 삽질에 대해서 적어보려 한다. (생각만 해도 벌써 짜증이 밀려온다)

 

하려고 했던 작업의 과정은 아래와 같다.

 

1. 기존에 사용하던 레디스의 백업본(*.rdb)과 설정파일(*.conf)을 생성한다.

2. 도커를 사용하기 위해 내가 원하는 환경의 DockerFile를 작성한다.

3. 레디스를 구동하여 테스트한다.

 

내용만 보면 진짜 간단하다. 할 것도 없다. 해본 적이 없던 것도 아니다. 그렇지만 항상 맘대로 되는 게 없다.

 

 

1. 레디스의 백업본은 쉽게 만들 수 있다.

 

우선, 레디스의 백업? 본은 두 가지가 존재한다. aof파일과 rdb 파일의 차이점이 궁금하면 여기를 참고하자.

레디스에 접속하여(redis-cli) save 명령어를 날려주면 쉽게 생성 가능하며, 생성되는 rdb파일의 이름은 redis.conf의 dbfilename 설정을 통해 가능하고, dir을 통해 경로 설정 또한 가능하다. 이렇게 일단 백업 파일을 만들었다.

 

*.conf 파일은 기존에 사용하던 설정 파일을 그대로 이용하였다. <-이게 엄청난 골치를 나에게 안겨주게 될 줄 몰랐었다.

 

 

2. 도커 파일을 작성하자!

 

처음 내가 하려고 했던 환경은 원하는 os위에 원하는 redis 버전을 설치하여 내 맘대로 사용하는 것이 목표였다. centos 이미지를 기반으로 직접 redis를 설치하고 내 맘대로 경로를 잡아서 사용하고자 하였고 도커 파일을 작성하는 부분에 더 익숙해지기 위함도 있었다.

 

# 처음 작성했던 Dockerfile

FROM centos:7

RUN mkdir -p /apps
RUN mkdir -p /logs && mkdir -p /logs/redis

# 의존성 패키지 설치
RUN yum update -y && yum install wget gcc gcc-c++ make -y

# redis 2.8.23 설치
RUN wget http://download.redis.io/releases/redis-2.8.23.tar.gz
RUN tar -xvf redis-2.8.23.tar.gz# RUN mv /redis-2.8.23 /redis
RUN mv /redis /apps/redis
RUN mkdir -p /apps/redis/dump && mkdir -p /apps/redis/pid

COPY ./conf/default.conf /apps/redis/conf/default.conf
COPY ./conf/admin.conf /apps/redis/conf/admin.conf
COPY ./conf/ranking.conf /apps/redis/conf/ranking.conf
COPY ./conf/shard.conf /apps/redis/conf/shard.conf
COPY ./conf/user.conf /apps/redis/conf/user.conf
COPY ./dump/user.rdb /apps/redis/dump/user.rdb

WORKDIR /apps/redis/src
RUN make

ENTRYPOINT [ "/apps/redis/src/redis-server"]

3. 생성한 레디스 이미지를 컨테이너화 하기

 

그냥 기본적인 구동 테스트를 하기 위해 간단한 명령어로 실행하였다.

$docker container run -d -p 6379:6379 <image_name> /apps/redis/conf/user.conf

 

컨테이너가 구동되자마자 꺼저버리는것이 아닌가? 이때부터 열이 오르기 시작하였고, 내가 작성한 파일들에 대해 오타가 있나 다시 한번 확인 후 도커 로그를 확인해 보았다.

$docker logs <container_name>

 

정확히는 기억이 안 나지만 permission denied에 대한 오류 메시지를 보았고 docker build 과정에서 파일에 대한 권한을 확인하고 수정하였다.

RUN chmod 644 /apps/redis/conf/user.conf
RUN chmod 644 /apps/redis/conf/default.conf

 

우선 이렇게 퍼미션에 대한 문제를 해결! redis 구동하는 프로세스에서 conf 파일에 대한 접근권한이 없었던 것 같아 파일 권한을 풀어줌으로써 해결하였지만 그 후에도 컨테이너는 구동 명령과 동시에 죽어버렸다.

 

이때부터 문제가 심각했다. 컨테이너는 로그도 찍히지 않았고 그냥 죽었다. 왜 죽는지 시어머니도 모른다. 왜? 컨테이너가 아무것도 나에게 주지 않았다. 호랑이는 죽어서 가죽을 남기는데 컨테이너는 아무것도 남기지 않았다. (주절주절...쿵쾅쿵쾅...)

 

이렇게 원인모를 이유로 인해 퇴근하며 짬짬이 하던 작업들을 하기가 싫어져서 계속 미루고 있다가 무슨 바람이 불었는지 오랜만에 다시 작업을 했고 이런저런 설정을 계속 바꿔가 보며 오류를 찾기 위해 피나는 노력을 하다 보니 시간이 새벽 2시가 되었고...... 정말 아무 생각 없이 conf에 설정된 daemonize 옵션을 주석 처리하였더니..

 

띠용!!

 

해결되었다. 맘 같아선 해결되자마자 뒤 도안 돌아보고 그다음 작업을 진행하고 싶었지만, 원인이 무엇인지 알아보도록 하자.

 

 

 

떡하니 stackoverflow에 올라와있는 질문이 있다.

 

답변은 아래와 같다.

 

redis process를 domonize 옵션으로 구동하는 경우 도커 프로세스는 구동되고 있는 프로세스가 없다고 판단하여 컨테이너를 종료해버린다. 만약 컨테이너를 구동하는 상태로 유지하고 싶으면 docker wait 명령어를 이용하거나 redis log를 tail -f 하여 유지할 수 있다.

 

 

나와 같이 간단한 이유 때문에 오랜 삽질을 하는 분이 있다면, 꼭 이 글을 보고 해결하였으면 좋겠다...

 

반응형
Comments