วิธีการใช้งาน Redis ด้วย Docker
การติดตั้ง Redis บน Docker จะสะดวกกว่าการติดต้ังลงบนเครื่องมากๆ โดยเฉพาะ Redis CLI บน Windows ซึ่งต้องใช้งานผ่านทาง WSL เราจึงนิยม Run Redis CLI ด้วย Docker เป็นหลัก ซึ่งในบทความนี้เราจะพาไปดูวิธีการติดตั้ง Redis Server, Redis CLI และ RedisInsight ด้วย Container โดยจะแบ่งเป็นหัวข้อต่างๆ ดังนี้
ก่อนจะเข้าไปสู่วิธีการติดตั้งเราต้องเข้าใจการทำงานของ Redis กันก่อนโดยที่จะแบ่งการทำงานออกเป็น 2 ส่วนดังนี้
-
Redis Server ทำหน้าที่เป็น Database Server ดังนั้นเราต้องมีการ Mount Volume ออกมาในกรณีที่เราทำการเก็บข้อมูลลง Disk ด้วย Redis Database Snapshot(RDS) หรือ Append Only File(AOF)
-
Redis Client ทำหน้าที่ส่ง Command เข้าไปยัง Database Server เพื่อให้เพิ่มหรือลบข้อมูลตามที่เราต้องการ โดยมี 2 ทางให้เลือกดังนี้
- Redis CLI ถ้าเราต้องการจัดการกับ Redis ด้วย Command Line(Cli) เราจะใช้ Redis CLI ในการทำงาน ข้อดีของการใช้ Command Line คือถ้าคุณใช้ Command Line ได้คุณจะสามารถเขียน Code ได้เลย เพราะ Library ส่วนใหญ่จะมีชื่อ function ตรงกับชื่อ Command Line
- RedisInsight คือเครื่องมือที่ใช้จัดการ Redis ผ่านทาง GUI ซึ่งจะง่ายต่อการทำงานมากกว่า
ติดตั้ง Redis Server บน Docker
เราสามารถนำ redis มาใช้งานในเครื่องได้ด้วยคำสั่งนี้
- Pull redis server image ลงมาก่อน
เราสามารถเลือก version และ Base Image ของ Redis ได้ ซึ่ง ณ ตอนที่กำลังเขียนความนี้ Version ล่าสุดจะเป็น 7.2.5 เราสามารถดขียนเป็น
$ docker pull redis:latest
และโดย default base image ของ Redis จะเป็น Debian ถ้าเราอยากได้ Image ที่มีขนาดเล็กลง(ประมาณ 5 MB) เราจะเลือกใช้ alpine เป็น base image แทน โดยจะระบุเป็น$ docker pull redis:7.2.5
$ docker pull redis:7.2.5-alpine
- สร้าง Redis server container ขึ้นมาด้วยคำสั่ง
$ docker run -p 6379:6379 --rm redis redis-server
คำสั่งนี้จะเป็นการตั้ง redis server ขึ่้นมา โดย redis จะใช้ port 6379 ในการสื่อสาร ถ้าต้องการเปลี่ยน Port อื่นเราจะใช้คำสั่ง
$ docker run -p 6380:6380 --rm redis redis-server --port 6380
ติดตั้ง Redis ด้วย Redis Stack
ถ้าเราต้องการ Redis ที่มาพร้อมกับ RedisInsight และ Redis Module เราสามารถเลือกติดต้ัง Redis Stack แทน แต่การใช้ Redis Stack จะเหมาะกับการ Test เท่านั้นเพราะทุกอย่างถูก pack ลงมาใน container เพียงตัวเดียว
เราสามารถใช้งาน Redis Insight ผ่าน Redis Stack ด้วยคำสั่งนี้
$ docker run -p 6379:6379 -p 8001:8001 --rm redis/redis-stack:latest
เราจะเห็นว่า Container ที่กำลังทำงานอยู่ใน Terminal และแสดง Port 6379 และ 8001 ซึ่งเราสามารถเข้าไปหน้าหลักของ RedisInsight ได้ที่ http://localhost:8001 จะได้ผลลัพธ์ดังรูป
ถ้าสนใจการใช้งาน RedisInsight สามารถเข้าไปอ่านต่อได้ที่ วิธีจัดการ Redis ผ่าน GUI ด้วย RedisInsight"
Custom Redis Config
ถ้าเราต้องการปรับเปลี่ยน Configuration ให้เป็นไปตามที่เราต้องการเราจะต้องสร้าง Image ขึ้นมาเองด้วยการเขียน Dockerfile
FROM redis
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
สามารถดูตัวอย่างไฟล์ redis.conf ได้ที่นี่
หลังจากที่เรา ปรับแต่ง Configuration ของ Redis เรียบร้อยแล้วให้สั่ง Build Docker Image ด้วยคำสั่ง
$ docker build -t my-redis .
แล้วให้เราสร้าง Redis Container จาก Image ที่เรา Custom ขึ้นมาแทน
$ docker run --rm -p 6379:6379 my-redis
ติดตั้ง Redis Client บน Docker
การใช้งาน Redis CLI ผ่านทาง Docker เราจะต้องใช้คำสั่ง
$ docker run -it --rm redis redis-cli -h host.docker.internal
เนื่องจาก container 2 ตัวนี้่ไม่ได้สร้างบน network เดียวกัน ทำให้เราต้อง connect เข้าไปที่ redis server โดยใช้ host.docker.internal แต่ถ้าคุณนำไปสร้างด้วย docker-compose ก็จะต้องอ้าง host ด้วยชื่อ service ใน docker-compose แทน
หลังจากนั้น เราจะเข้าสู่ shell ของ redis ซึ่งเราจะทำการ check ก่อนว่า redis-server นั้นพร้อมใช้งานหรือไม่ด้วยคำสั่ง PING ถ้า redis server ตอบ PONG กลับมาแสดงว่าใช้ได้
redis host.local.internal:6379> ping
PONG
หรือจะเรียกผ่าน redis-cli ตรงๆ โดยเข้าไปที่ shell แบบนี้ก็ได้
$ docker run -it --rm redis bash
หลังจากเข้าไปใน shell ของ redis แล้วก็เรียก redis-cli จากตรงนี้ได้เลย
$ redis-cli ping
PONG
ถ้าเราใช้คำสั่ง PING และ Redis ตอบ PONG กลับมาถือว่า Connection เสร็จสมบูรณ์
ติดต้ัง RedisInsight บน Docker
-
เริ่มจากการ Pull image ลงมาก่อน
1
$ docker pull redis/redisinsight
-
สร้าง Redisinsight Container ด้วยคำสั่ง
1 2
$ docker run -d --name redisinsight \ -p 5540:5540 redis/redisinsight:latest
RedisInsight จะใช้ port 5540 เป็น default port
-
ถ้าต้องการเก็บข้อมูลการใช้งาน RedisInsight ไว้เราต้อง Mount Volume ออกมาด้วยคำสั่ง
1 2 3
$ docker run -d --name redisinsight \ -p 5540:5540 redis/redisinsight:latest \ -v redisinsight:/data
ใน docker command นี้จะใส่ parameter
-v
เข้าไปเพื่อสร้าง volume ชื่อ redisinsight สำหรับเก็บข้อมูลการใช้งาน RedisInsight -
เข้าไปหน้าแรกของ RedisInsight ได้ที่ http://localhost:5540
-
ถ้าต้องการเช็คสถานะ(health check) ของ redisinsight เราสามารถเข้าไปตรวจสอบได้ที่ http://localhost:5540/api/health
-
ถ้าเราต้องการปรับแต่ง Configuration ของ RedisInsight เราสามารถกำหนด Environment Variables ตามตารางนี้ได้
Variables Type Description Default RI_APP_HOST string IP address or hostname to bind to 0.0.0.0 RI_APP_PORT number Port to bind to 5540 SERVER_TLS boolean Enable TLS true RI_SERVER_TLS_CERT string Path to TLS certificate file undefined RI_SERVER_TLS_KEY string Path to TLS key file undefined RI_ENCRYPTION_KEY string Key to encryption data in redis undefined RI_LOG_LEVEL string Log level info RI_STDOUT_LOGGER boolean Log to STDOUT true RI_FILES_LOGGER boolean Log to file false เช่น ถ้าต้องการเปลี่ยนจาก Port 5540 ไปเป็น 5541 เราจะใช้คำสั่ง
1 2 3 4
$ docker run -d --name redisinsight \ -e API_PORT=5541 \ -p 5541:5541 redis/redisinsight:latest \ -v redisinsight:/data