AWS EC2가 설치되었다고 가정하고 진행.
- Docker 서비스 시작 및 부팅 시 자동으로 시작되도록 설정
sudo service docker start
sudo systemctl enable docker
- 현재 사용자에 Docker 권한 추가
sudo usermod -a -G docker ec2-user
1. 도커에 Redis 설치
- Docker Redis Image 다운로드
$ docker pull redis
- 다운로드 된 Docker Image 확인
$ docker images
- Redis 도커 컨테이너 실행
docker run -d --name redis-server -p 6379:6379 redis
- Redis 컨테이너 실행 여부 확인
docker ps
- Redis CLI를 사용하여 Redis 서버에 접속
docker exec -it redis-server redis-cli
- CLI에 접속하면 다음과 같은 프롬프트가 나타난다. Redis 명령어로 연결 테스트를 진행해본다.
127.0.0.1:6379> PING
// 정상적으로 연결되었다면 다음과 같은 응답이 나타난다.
PONG
2. Redis 환경 설정
Redis는 in-memory 기반 저장소이므로 Docker Container 내에서 실행 시 해당 컨테이너가 중지되거나 삭제되면 Redis에 저장된 모든 데이터가 손실된다. 이러한 문제를 방지하기 위해 도커를 사용할 때 볼륨이라는 개념을 사용해서 컨테이너에 파일 or 디렉토리를 마운트하여 방지한다. 따라서, Redis 백업용 도커 볼륨을 생성하자.
- Redis 백업용 도커 볼륨 생성
$ docker volume create {생성하고자 하는 volume 이름}
- 도커 Volume 조회
$ docker volume ls 또는 docker volume inspect {생성한 volume 이름}
- Redis Config 환경 설정 파일 생성
백업 종류인 RDB, AOF 중 RDB를 사용했고 Replication은 진행하지 않았으므로 설정에서 빼주었다.
# 연결 가능한 네트위크(0.0.0.0 = Anywhere)
bind 0.0.0.0
# 연결 포트
port 6379
# Master 노드의 기본 사용자 비밀번호
requirepass redis
# 최대 사용 메모리 용량(Default : 시스템 전체 용량)
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 설정 (주기적 백업)
# 15분 안에 최소 1개 이상의 key가 변경되었을 때
save 900 1
# 5분 안에 최소 10개 이상의 key가 변경되었을 때
save 300 10
# 60초 안에 최소 10000개 이상의 key가 변경되었을 때
save 60 10000
# 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
- Docker Container로 Redis 실행
docker run \\
-d \\
--name redis-server \\
-p 6379:6379 \\
-v ~/redis-config/redis.conf:/etc/redis/redis.conf \\
-v redis-volume:/data \\
redis redis-server /etc/redis/redis.conf
3. 확인 및 테스트
- 컨테이너 목록 확인
docker ps
- Redis 데이터 저장 및 확인
docker exec -it redis-server redis-cli
- Redis CLI에서 데이터 저장해보기
127.0.0.1:6379> auth {설정한 비밀번호}
OK
127.0.0.1:6379> SET testkey "Hello, Redis!"
OK
127.0.0.1:6379> GET testkey
"Hello, Redis!"
- 컨테이너 중지 및 삭제 후 데이터 확인
docker stop redis-server
docker rm redis-server
Redis 컨테이너 다시 실행
docker run \\
-d \\
--name redis-server \\
-p 6379:6379 \\
-v ~/redis-config/redis.conf:/etc/redis/redis.conf \\
-v redis-volume:/data \\
redis redis-server /etc/redis/redis.conf
다시 Redis CLI 접속 후 데이터 확인
docker exec -it redis-server redis-cli
127.0.0.1:6379> auth {설정한 비밀번호}
OK
127.0.0.1:6379> GET testkey
"Hello, Redis!"
- 완료
Docker 볼륨을 생성하고 이를 컨테이너에 마운트하여 데이터가 유지되는 것을 통해 얻은 여러 이점이 있다.
- 데이터 지속성
- Docker 볼륨을 사용하면 컨테이너가 중지되거나 삭제되더라도 데이터가 유지된다.
- 볼륨을 통해 백업과 복원이 용이하다.(In-memory 기반 저장소의 단점 보완)
- 컨테이너 독립성
- 컨테이너 간 동일한 볼륨을 공유하고 사용할 수 있다.
- 컨테이너를 삭제하고 재생성하더라도 볼륨에 저장된 데이터는 그대로 유지되므로, 애플리케이션을 쉽게 업데이트하고 배포할 수 있다.
- 보안 및 관리
- Docker 볼륨에 비밀번호를 설명하면 데이터 접근 권한을 제어할 수 있다.