ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker와 함께하는 Redis Install
    DevOps/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 설정파일에 정의된 내용을 기반으로 동작한다.

     

    Redis Config File example

     

    # 지정된 포트로 레디스 서버에 접속할 수 있게 허용
    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
Designed by Tistory.