[Docker] Docker-in-Docker(dind) 환경에서 redis cluster 구성

by 스뎅(thDeng) on

Docker 환경에서 간편하게 redis cluster를 구성할 수 있는 Grokzen/docker-redis-cluster가 있다. 설정 자체도 많지 않아서 쉽게 사용할 수 있다.

version: '3.8'
services:
  redis-cluster:
    image: grokzen/redis-cluster:6.2.1
    environment:
      IP: '0.0.0.0'             # https://github.com/Grokzen/docker-redis-cluster#important-for-mac-users
    ports:
      - '7000-7005:7000-7005'   # The cluster is 6 redis instances running with 3 master & 3 slaves, one slave for each master. They run on ports 7000 to 7005.

macOS 사용자 필수 설정

환경변수 IP를 설정해 주어야 한다. 설정해 주지 않으면 hostname으로 사용되고, 접속이 안 된다.

services:
  redis-cluster:
    environment:
      IP: '0.0.0.0'             # https://github.com/Grokzen/docker-redis-cluster#important-for-mac-users

현재 팀에서는 로컬(macOS)에서도 사용하고 GitLab CI/CD에서도 사용하기 때문에 IP 설정을 해주었다.

Docker-in-Docker(dind) 환경

GitLab CI/CD에서 integration test를 동시에 여러개를 실행시키기 위해 테스트에 필요한 환경을 dind 형태로 사용한다. (참고: Use the Docker executor with the Docker image (Docker-in-Docker))

이 경우 GitLab CI가 동작하는 docker에서 redis cluster로 접속이 어렵다. 접속할 때 seed node 정보로 접속을 하게 되고, 처음 접속을 하면 cluster의 node 정보를 얻어온다. 이 때 cluster는 자기 hostname을 반환해 주는데 dind 모드에서는 이 hostname으로 접속이 불가능 하다. 이 때 redis.conf 파일에 cluster-announce-ip 설정을 해주면 cluster node 정보를 얻어올 때 이 IP를 알려주게 된다. NAT 설정이 되어 있거나 port 포워딩이 된 경우 사용하는 설정들이다.

그런데, Grokzen/docker-redis-cluster을 사용하다보니 이 redis.conf 파일을 설정하기가 어렵다. 이 docker 이미지는 entrypoint에서 설정한 master node와 replica 개수를 통해서 자동으로 redis.conf 파일을 생성하고 있다. 따라서, 직접 redis.conf 파일을 외부에서 mount 시켜주면 파일이 리셋되기 때문에, redis-cluster.tmpl 파일을 수정해 주어야 한다.

# redis/redis-cluster.tmpl

bind ${BIND_ADDRESS}
port ${PORT}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /redis-data/${PORT}
cluster-announce-ip my-redis

마지막에 cluster-announce-ip 설정을 추가해 주고 이 파일을 mount해주면 된다.

version: '3.8'

services:
  redis-cluster:
    image: grokzen/redis-cluster:6.2.1
    environment:
      IP: '0.0.0.0'             # https://github.com/Grokzen/docker-redis-cluster#important-for-mac-users
    ports:
      - '7000-7005:7000-7005'   # The cluster is 6 redis instances running with 3 master & 3 slaves, one slave for each master. They run on ports 7000 to 7005.
    volumes:
      - './redis/redis-cluster.tmpl:/redis-conf/redis-cluster.tmpl'
    extra_hosts:
      - 'my-redis:127.0.0.1'

이 때, extra_hosts 설정으로 /etc/hosts에 host를 추가해 주어야 하는데, custer를 구성하는 node들끼리 서로 연결할 때도 cluster-announce-ip를 사용하기 때문이다. 설정해 주지 않으면, 서로 연결을 맺지 못 하고 각 node들이 따로 놀고 있는 모습을 볼 수 있다.

이제 끝이다. GitLab CI/CD에서 my-redis:7000(또는 7001, 7002, ..)으로 접속하면 된다.

참고

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License