In this part of the counter examples series we have Perl Dancer based application using Redis as the in-memory cache/database to store the counter.

The code runs in a Docker container and we have another container running the Redis server.

For this example to work we need the 4 files that you can see below (app.psgi, cpanfile, Dockerfile, docker-compose.yml) in a folder and you have to be in that forlder. You can download the individual files or you can clone the repository of the Perl Maven web site:

git clone https://github.com/szabgab/perlmaven.com.git
cd perlmaven.com/examples/redis_counter/

Install Docker and docker-compose then run the command:

docker-compose up

Then you can visit http://localhost:5001 and keep reloading it to see the counter increase.

Ctrl-C will stop the Docker compose.

The Dancer code

examples/redis_counter/app.psgi

use strict;
use warnings;
use Dancer2;
use Redis;

my $redis = Redis->new(server => 'myredis:6379');

get '/' => sub {
    my $counter = $redis->incr('counter');
    return $counter;
};

dance;

The name of the server "myredis" was defined in the docker-compose.yml file. See below.

cpanfile listing Perl dependencies

examples/redis_counter/cpanfile

requires 'Dancer2', '0.3';
requires 'Redis', '1.998';

Dockerfile for perl and the modules needed

examples/redis_counter/Dockerfile

FROM perl:5.32

WORKDIR /opt
COPY cpanfile /opt/
RUN cpanm --installdeps --notest .


CMD  ["plackup", "--host", "0.0.0.0", "--port", "5000"]

We install the modules using --notest so the installation will be faster. In a real, non-demo application I'd not do that. I'd want the tests to run to verify that the modules I install work properly on my installation.

docker-compose file to bind them all together

examples/redis_counter/docker-compose.yml

version: '3.8'
services:
  web:
    build: .
    ports:
    - "5001:5000"
    volumes:
    - .:/opt
    links:
    - myredis
  myredis:
    image: redis:6.2.1
    volumes:
      - redis-data:/var/lib/redis

volumes:
  redis-data:

Disk usage

The volume storing the redis data:

docker volume inspect redis_counter_redis-data

The containers created by docker-compose can be seen:

docker ps -a

They are called redis_counter_web_1 and redis_counter_myredis_1.

Cleanup

docker container rm redis_counter_myredis_1 redis_counter_web_1
docker volume rm redis_counter_redis-data