-
Docker와 함께하는 Redis InstallDevOps/Docker 2024. 8. 14. 19:06
들어가기 전에
Redis를 사용하기 위해 Docker Hub에서 제공하는 Redis를 설치하며 경험한 내용을 작성
Docker Redis 설치
Redis 공식문서에는 Install Redis와 Install Redis Stack 두 가지를 제공한다.
Docker Redis는 Install Redis Stack 페이지에서 확인할 수 있다.
제공하는 Docker image는 다시 두 가지로 나뉜다.
- redis/redis-stack
- redis/redis-stack-server
redis/redis-stack은 로컬 개발용으로 적합하고 내장된 Redis Insight를 제공한다.
redis/redis-stack-server는 프로덕션용으로 적합하고 오직 Redis server만 제공한다.
$ docker pull redis/redis-stack:latest # 도커 이미지 가져오기 $ docker images # 가져온 도커 이미지 확인 # 포트 6379는 이후 redis-cli를 통해 redis-server 접속에 사용 # 포트 8001은 Redis Insight를 보기위한 브라우저 접속에 사용 $ docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest $ docker ps # 현재 실행중인 도커 컨테이너 프로세스 확인 $ docker exec -it redis-stack redis-cli # redis-cli를 통해 redis-stack 도커 컨테이너 접속
여기까지만 해도 도커 허브에서 제공하는 이미지를 통해 redis를 설치하고 redis-server에 접속할 수 있다.
하지만, 여기서 redis-cli를 통해 접속할 때 비밀번호를 사용해 접속을 시도하며 여러가지 고민을 하게 되었다.
Redis 접속 비밀번호 설정
redis는 redis.conf 설정파일에 정의된 내용을 기반으로 동작한다.
# 지정된 포트로 레디스 서버에 접속할 수 있게 허용 port 6379 # 서버 외부에서 레디스 인스턴스로 연결하기 위한 허가된 ip bind 127.0.0.1 # 이 설정이 yes일 경우 패스워드를 설정해야만 레디스에 접근 protected-mode yes # 레디스 서버에 접속하기 위한 패스워드 값 requirepass test # 복제 구조를 사용할 때 연결될 마스터의 패스워드 값 masterauth test # 레디스 프로세스 데몬 실행 daemonize yes dir ./redis-data
redis.conf 파일을 로컬에서 만들었다.
그렇다면 로컬에서 생성한 파일을 Docker Image Redis에서 어떻게 사용하게 할까?
모든 Docker Container는 Linux 가상 머신내에서 동작하며 이 가상 머신은 Docker Engine을 포함하고 있다.
그렇다! 내가 만든 도커 컨테이너는 Linux에 설치 되고 있고 Linux 디렉토리 구조에 맞게 마운트 시켜야 한다.
인터넷에 검색하든 실제 Linux 를 설치해서 구조를 확인할 수 있지만 Docker Desktop에서 Container의 파일 구조를 볼 수 있다.
Docker desktop files 여기서 두 가지를 마운트할 계획이다.
- redis.conf
- data
redis.conf는 redis 관련 설정 파일이고 data 디렉토리는 docker에 저장되는 모든 데이터를 보관하는 곳이다.
# 도커에 저장되는 data 디렉토리를 로컬에서 생성한 local-data 디렉토리와 마운트 $ docker run -v /local-data/:/data redis/redis-stack:latest # redis-stack.conf 파일을 로컬에서 생성한 local-redis-stack.conf 파일과 마운트 $ docker run -v `pwd`/local-redis-stack.conf:/redis-stack.conf -p 6379:6379 -p 8001:8001 redis/redis-stack:latest
이렇게 설정 후 도커를 실행하면 지정한 경로가 마운트 되고 redis-cli 사용시 비밀번호를 제공해야한다.
$ docker exec -it redis-stack redis-cli -a {패스워드}
Docker desktop mount 그런데 이런 경고를 보게된다.
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Redis CLI에서 비밀번호를 명령줄 인수로전달할 때 보안상 문제가 있다는 경고 문구이다.
무시하고 넘어갈 수 있지만 경고 문구를 어떻게 해결할 수 있을까 조사해보았다.
Docker Compose와 .env 파일
Redis 공식문서에서는 환경 변수 설정을 통해 해결하라고 제시한다.
$ docker run -e REDIS_ARGS="--requirepass redis-stack" redis/redis-stack:latest
공식문서에서는 위 명령을 통해 환경변수를 선언하라고 했다. 하지만, CLI 명령을 통해 추가하는 환경변수로 관리가 어려울 것이라 판단했고 어떤 방법이 있을까 더 찾아보니 compose와 .env파일을 사용함으로 환경변수 관리 편의성을 높일 수 있다는걸 알게되었다.
아래는 docker-compose.yml 파일 내용이다.
services: redis-stack: image: redis/redis-stack:latest container_name: redis-stack-compose ports: - "6379:6379" - "8001:8001" env_file: - redis-stack.env volumes: - ./redis-stack.conf:/usr/local/etc/redis/redis-stack.conf - ./redis-stack-data/:/data
redis.conf 파일도 변경해주었다.
# 지정된 포트로 레디스 서버에 접속할 수 있게 허용 port 6379 # 서버 외부에서 레디스 인스턴스로 연결하기 위한 허가된 ip bind 127.0.0.1 # 이 설정이 yes일 경우 패스워드를 설정해야만 레디스에 접근 protected-mode yes # 레디스 서버에 접속하기 위한 패스워드 값 requirepass ${REDIS_PASSWORD} # 복제 구조를 사용할 때 연결될 마스터의 패스워드 값 masterauth ${REDIS_PASSWORD} # 레디스 프로세스 데몬 실행 daemonize yes dir ./redis-data
redis-stack.env
REDIS_PASSWORD={패스워드}
이렇게 파일을 구성 후 docker compose 백그라운드 실행을 해주면 docker-compose.yml 내용을 읽어들이며 아래와 같은 일을 한다.
- Docker Hub에서 사용할 이미지를 가져온다
- 생성한 container 이름을 설정
- 해당 container 포트를 열어준다
- 외부 환경변수 파일을 읽어온다
- 선언한 경로에 파일or폴더를 마운트 한다
위에서 CLI 명령으로 작성한 모든 것을 하나의 파일로 관리할 수 있게되었다.
여기서 나는 정말 Docker Container가 redis-stack.env 파일에서 작성한 패스워드를 사용하는지 궁금했다.
정말 다행이게도 Docker Desktop은 내가 생성한 Docker Container 내부에 명령어를 실행할 수 있는 터미널을 제공하고 있다.
Docker desktop 컨테이너 내부 환경변수 아주 좋아 완전 좋아!!
마지막으로 redis-cli 접속 후 PING - PONG 을 확인해보겠다.
PING - PONG 'DevOps > Docker' 카테고리의 다른 글
Docker MySQL 연결과 IntelliJ Heap Size (0) 2024.09.06