Installing Redis on Docker

Create a Redis key-value store Docker container.

Introduction

Redis is an open source key-value store that functions as a data structure server. Its Docker image happens to be one of the easiest to install and get up and running.

The following demonstrates how to install and test Redis on Docker.

Install

Permissions
You may need to prefix the following commands with sudo, or run sudo -i to run as root

Open a command / terminal and run the following:

docker run --name my-redis redis

Docker will check if you already have the redis image downloaded, otherwise it will download and install it. You should see something like the following:

root@ubuntu:~# docker run --name my-redis redis
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
8ec398bc0356: Pull complete
da01136793fa: Pull complete
cf1486a2c0b8: Pull complete
a44f7da98d9e: Pull complete
c677fde73875: Pull complete
727f8da63ac2: Pull complete
Digest: sha256:90d44d431229683cadd75274e6fcb22c3e0396d149a8f8b7da9925021ee75c30
Status: Downloaded newer image for redis:latest
1:C 12 Jan 2020 02:19:37.342 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 12 Jan 2020 02:19:37.342 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 12 Jan 2020 02:19:37.342 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 12 Jan 2020 02:19:37.343 * Running mode=standalone, port=6379.
1:M 12 Jan 2020 02:19:37.343 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 12 Jan 2020 02:19:37.343 # Server initialized
1:M 12 Jan 2020 02:19:37.343 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 12 Jan 2020 02:19:37.343 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
1:M 12 Jan 2020 02:19:37.343 * Ready to accept connections

At this point Redis is running and ready to accept local connections. However, for testing purposes, this is not really convenient because Redis is running inside a container, and we're outside of the container, so we're unable immediately interact with it.

What we can do is run the container in the background (detached) and then execute commands against it, such as docker-cli to tests its functionality.

Run container detached

First stop the container by typing ctrl-c and then run docker ps -a to see a list of all containers. The Redis container should show as stopped. Now start the container with docker start my-redis. It should now be running in detached state.

TIP
You can default to running containers as detached with -d option. Example: docker run -d --name my-redis redis
root@ubuntu:~# docker start my-redis
my-redis

Execute commands

We can now attach to the running container so that we can execute commands. Type docker exec -it my-redis bash. This will connect to the Redis container and execute an interactive bash shell.

root@ubuntu:~# docker exec -it my-redis bash
root@3e5e9c65c2fd:/data#

Redis CLI

You should see the prompt has now changed to indicate you're connected to the container. Type redis-cli to start the Redis CLI tool, and enter a redis command such as keys * to show all keys in the database.

root@3e5e9c65c2fd:/data# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>

Now create some data.

127.0.0.1:6379> set my-key test
OK
127.0.0.1:6379> get my-key
"test"
127.0.0.1:6379> incr my-sequence
(integer) 1
127.0.0.1:6379> incr my-sequence
(integer) 2
127.0.0.1:6379> incr my-sequence
(integer) 3
127.0.0.1:6379> decr my-sequence
(integer) 2
127.0.0.1:6379> keys *
1) "my-sequence"
2) "my-key"
127.0.0.1:6379>

Now type exit to exit the cli tool, and exit again to exit the bash shell.

127.0.0.1:6379> exit
root@3e5e9c65c2fd:/data# exit
exit
root@ubuntu:~#

Connect to Redis from a remote server

So far our Redis container is only accepting local connections. We had to run the redis-cli tool from within the container in order to connect to Redis server. We'll now set-up the Redis container to accept remote connections.

We'll need to stop and remove the container first. Type docker stop my-redis followed by docker rm my-redis. Check to see the container has been removed by typing docker ps -a. Redis should no longer show in the list.

root@ubuntu:~# docker stop my-redis
my-redis
root@ubuntu:~# docker rm my-redis
my-redis
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS
NAMES
root@ubuntu:~#

Now we'll run a new container as detached with -d option and also use the -p option to publish the redis port to the host.

root@ubuntu:~# docker run  -d -p 6379:6379 --name my-redis redis
220b2f1d53cd2dfb7595dc99030188336c1b123238e8930f40b039c08e2456d7
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS
          NAMES
220b2f1d53cd        redis               "docker-entrypoint.s…"   10 seconds ago      Up 9 seconds        0.0.0.0:6379->6379/tcp   my-redis
root@ubuntu:~#

Running docker ps should show us the new Redis container and also show us the port mapping: 0.0.0.0:6379->6379/tcp which tells us that the container's TCP port 6379 has been mapped to host TCP port also 6379. Now we can connect to Redis outside of the container.

Run Redis CLI on host

Install Redis CLI on the host to interact with Redis running in the container.

apt-get install redis-tools

As before, launch CLI tool with redis-cli and run some Redis commands.

root@ubuntu:~# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set name Neil
OK
127.0.0.1:6379> get name
"Neil"
127.0.0.1:6379> incr seq
(integer) 1
127.0.0.1:6379> incr seq
(integer) 2
127.0.0.1:6379> decr seq
(integer) 1
127.0.0.1:6379> keys *
1) "seq"
2) "name"
127.0.0.1:6379>

Redis is now available for use in your applications.

Useful links

Redis Docker hub https://hub.docker.com/_/redis/
Redis docs https://redis.io/documentation
Docker CLI docs https://docs.docker.com/engine/reference/commandline/docker/