はじめに
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