LoginSignup
4
1

More than 3 years have passed since last update.

DockerでRedisコンテナを立ち上げLaravelで読み書きする

Last updated at Posted at 2020-07-24

はじめに

DockerでRedisコンテナを立ち上げLaravelから読み書きしてみましたので、
Redisコンテナを立ち上げるまでの最小限の構成を紹介します。

やりたいこと

  • DockerでRedisコンテナを立ち上げたい
  • Redisのデータを永続化したい
  • LaravelからRedisのデータを読み書きしたい

この記事で説明しないこと

  • Redis以外のDocker構成
  • Laravelのインストール手順

ディレクトリ構成

.
├── data
│   └── redis
│       └── appendonly.aof(コンテナ起動時に作成されます)
├── docker-file
│   ├── nginx
│   │   └── default.conf
│   └── php
│       ├── Dockerfile
│       └── php.ini
├── volumes
│   └── www
└── docker-compose.yml

各ファイルの内容

docker-compose.yml

データ永続化の為にdataフォルダをマウントしています。

また、redisコンテナを立ち上げ直すたびにIPアドレスが変わっては不便なのでnetworksで固定IPを割り振るようにしています。

docker-compose.yml
version: '3.3'

services:
  php:
    container_name: php
    build: ./docker-file/php
    volumes:
      - ./volumes/www:/var/www
    networks:
      app_net:
        ipv4_address: 172.16.238.2

  nginx:
    image: nginx
    container_name: nginx
    ports:
      - 8080:80
    volumes:
      - ./volumes/www:/var/www
      - ./docker-file/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
    networks:
      app_net:
        ipv4_address: 172.16.238.3

  redis:
    image: "redis:latest"
    container_name: redis
    ports:
      - "6379:6379"
    command: redis-server --appendonly yes
    volumes:
      - "./data/redis:/data"
    networks:
      app_net:
        ipv4_address: 172.16.238.4

networks:
  app_net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.16.238.0/24

docker-file/nginx/default.conf

default.conf
server {
  listen 80;

  root  /var/www/public;
  index index.php;

  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   php:9000;
    fastcgi_index  index.php;

    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO $fastcgi_path_info;
  }
}

docker-file/php/Dockerfile

公式でPhpRedis PHP拡張が推奨されている為、phpredisをgit cloneしています。

LaravelでRedis使用するには、PECLを使用してPhpRedis PHP拡張をインストールすることを推奨します。インストール方法は複雑ですが、Redisをヘビーユースするアプリケーションではより良いパフォーマンスが得られます

FROM php:7.3-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
  && apt-get install -y zlib1g-dev libzip-dev libpq-dev iputils-ping net-tools git
RUN git clone https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis
RUN docker-php-ext-install zip pgsql pdo_pgsql redis

COPY --from=composer /usr/bin/composer /usr/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www

RUN composer global require "laravel/installer"

docker-file/php/php.ini

php.ini
[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

実行

docker-composeで起動します。

$ docker-compose up -d
Creating network "redis-docker_app_net" with driver "bridge"
Creating php   ... done
Creating redis ... done
Creating nginx ... done

Laravelから読み書きする

config/database.phpを設定する必要がありますが、基本的には初期設定のままで問題ありません。
参考:Redis 6.x Laravel

書き込み、読み込み

/app/Http/Controllers/RedisController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Redis;

class RedisController extends Controller
{
    /**
     * Redisへデータをセット
     */
    public function setRedis($id)
    {
        Redis::set('test', $id);

        return;
    }

    /**
     * Redisのデータを取得
     */
    public function getRedis()
    {
        $redis_data = Redis::get('test');

        return;
    }
}

Redisのデータを削除

コマンドは以下のサイトを参考にさせて頂きました。
参考:Redisのデータを削除する方法

$ docker exec -it redis /bin/bash
root@7c462a072597:/data# redis-cli
127.0.0.1:6379> flushdb
OK
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1