docker 명령어로 redis.conf 파일을 설정하던 중 발생한 오류였다. 내가 작성한 명령어는 아래와 같았다.
docker run --name redis-serer -p 6379:6379 -d -v redis-volume:/data -v ~/redis.conf:/etc/redis/redis.conf redis redis-server /etc/redis/redis.conf
- docker run : 도커 컨테이너 실행
- --name redis-serer : 컨테이너 이름을 redis-server로 지정
- -p 6379:6379 : 호스트 포트 6379, 컨테이너 포트 6379 (이 설정을 통해 호스트 머신에서 localhost:6379로 접근하면 컨테이너 내부의 redis 서버에 연결할 수 있다.)
- -d : 백그라운드에서 실행
- -v redis-volume:/data : Docker의 볼륨을 사용하여 컨테이너의 /data 디렉터리를 redis-volume이라는 이름의 Docker 볼륨에 매핑
- -v ~/redis.conf:/etc/redis/redis.conf : 호스트 시스템의 ~/redis.conf 파일을 컨테이너 내부의 /etc/redis/redis.conf 파일에 매핑
- redis : docker hub에 저장된 도커 이미지 파일의 이름
- redis-server /etc/redis/redis.conf : 컨테이너가 실행될 때 redis-server 명령어를 실행하며, 다음 경로에 있는 설정 파일로 redis 서버를 설정하라는 의미
하지만.... redis 서버 내부에는 /etc/redis/redis.conf 라는 파일이 존재하지 않았다. 그래도 해당 경로에 redis.conf 파일이 생성될 줄 알았다. 그러나 돌아온 결과는 redis.conf 폴더가 생성되는 것 이었다............................... 폴더...디렉토리!!!!!
해당 문제를 해결하기 위해 열심히 삽질했다. (5시간 경과.....) Dockerfile을 이용하는 방법을 찾아냈다.
Dockerfile을 이용하는 방법
1. redis.conf 파일을 생성
각자 작성한 redis.conf 파일을 이용하자. 나는 아래와 같이 설정했다.
# 연결 가능한 네트위크(0.0.0.0 = Anywhere)
bind 0.0.0.0
# 연결 포트
port 6379
# Master 노드의 기본 사용자 비밀번호
requirepass redis
# 최대 사용 메모리 용량(지정하지 않으면 시스템 전체 용량)
maxmemory 2gb
# 설정된 최대 사용 메모리 용량을 초과했을때 처리 방식
# - noeviction : 쓰기 동작에 대해 error 반환 (Default)
# - volatile-lru : expire 가 설정된 key 들중에서 LRU algorithm 에 의해서 선택된 key 제거
# - allkeys-lru : 모든 key 들 중 LRU algorithm에 의해서 선택된 key 제거
# - volatile-random : expire 가 설정된 key 들 중 임의의 key 제거
# - allkeys-random : 모든 key 들 중 임의의 key 제거
# - volatile-ttl : expire time(TTL)이 가장 적게 남은 key 제거 (minor TTL)
maxmemory-policy volatile-ttl
# == RDB 관련 설정 ==
# 저장할 RDB 파일명
dbfilename backup.rdb
# 15분 안에 최소 1개 이상의 key가 변경 되었을 때
save 900 1
# 5분 안에 최소 10개 이상의 key가 변경 되었을 때
save 300 10
# 60초 안에 최소 10000개 이상의 key가 변경 되었을 때
save 60 10000
# RDB 저장 실패 시 write 명령 차단 여부
stop-writes-on-bgsave-error no
# == AOF 관련 설정 ==
# AOF 사용 여부
appendonly yes
# 저장할 AOF 파일명
appendfilename appendonly.aof
# 디스크와 동기화 처리 방식
# - always : AOF 값을 추가할 때마다 fsync를 호출해서 디스크에 쓰기
# - everysec : 매초마다 fsync를 호출해서 디스크에 쓰기
# - no : OS가 실제 sync를 할 때까지 따로 설정하지 않음
# appendfsync everysec
# == Replication 관련 설정 ==
# Slave Redis 설정
# slaveof 127.0.0.1 6380
2. Dockerfile 작성
Dockerfile 안에는 아래와 같이 작성해준다. Dockerfile을 이용해서 커스텀 Redis 이미지를 생성하고, 동시에 이 이미지에 redis.conf 파일을 포함시키는 방법이다. 이러한 방법을 이용한다면 해당 경로에 파일이 존재하지 않아 발생하는 오류를 다신 겪지 않을 수 있다.
FROM redis:latest
COPY ./redis.conf /usr/local/etc/redis/redis.conf
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]
3. Docker 이미지 빌드 및 실행
docker build -t my-redis .
최종적으로 내가 작성한 명령어이다.
docker run --name redis-server -d -v redis-volume:/data my-redis
redis-cli 에서 info 명령어를 통해 확인해보면, 내가 설정한 config_file 경로와 마운트된 경로를 확인할 수 있다. 삽질 끝!