LaravelでTwitterクローンその2

nginxのコンテナは起動したと思いますので、次はphp-fpmのコンテナを立ち上げてnginxをunixドメインソケットで連携するところまでやってみたいと思います。ここから急に難しくなりますので注意深く読みながら進めてください。

unixドメインソケットについてはこちらで軽く勉強しておいてください。

Unix Domain Socketって何?

Unix Domain Socketって何?

Unix Domain Socketは同一マシン上でプロセス間通信するための仕組みです。ソケットとは受け口、バケツみたいなイメージですがまさにその通りで受け口をつくっておいて通信が来るのをまっています。PHPでもPythonでもfast c…

Unix Domain Socketは同一マシン上でプロセス間通信するための仕組みです。ソケットとは受け口、バケツみたいなイメージですがまさにその通りで受け口をつくっておいて通信が来るのをまっています。PHPでもPythonでもfast c…

unixドメインソケットを使ってnginxとphp-fpmのコンテナで通信させるには

  1. volumeをつくる
  2. php-fpmコンテナでマウントする
  3. unixドメインソケットの出力先をこのvolumeにする
  4. nginxのコンテナからそのunixドメインソケットのファイルを読み書きするように設定する

PHPフレームワークLaravel入門第2版 [ 掌田津耶乃 ]

価格:3300円
(2024/11/4 11:41時点)
感想(2件)

volumeをつくる

その前にdockerのvolumeてなんだというのをこの記事で学んでください。OGP画像がないので表示がへんですが、このページの画像が非常にわかりやすかったのであえて選びました。

ボリュームの利用

ボリュームの利用

ボリュームを利用します。

ボリュームを利用します。

次にdocker-compose.ymlを編集します。編集といっても2行追加するだけですが・・・。

name: twitter-clone

volumes:
  twitter-clone-php-fpm-socket:

services:
  web:
    container_name: twitter-web
    image: nginx:latest
    ports:
      - "9999:80"

servicesの前にvolumesという項目を追加するだけで、volumeを作ってくれます。概念は難しいかもしれませんが、作業としては簡単ですね。

php-fpmコンテナでマウントする

この作ったvolumeをphp-fpmのコンテナにマウントします。マウントしてそこにphp-fpmのunixドメインソケットのファイルを出力するように設定します。いつものようにdocker-compose.ymlを。

name: twitter-clone

volumes:
  twitter-clone-php-fpm-socket:

services:
  web:
    container_name: twitter-web
    image: nginx:latest
    ports:
      - "9999:80"

  php:
    container_name: twitter-php-fpm
    image: php:8.3-fpm
    volumes:
      - twitter-clone-php-fpm-socket:/run/php

phpのコンテナをnginxと同じようにphpとして追加しました。そしてそのvolumeの項目に先ほど作ったvolumeをマウントします。

twitter-clone-php-fpm-socket:/run/phpで書かれているコロンの右側はコンテナの中のパスです。twitter-clone-php-fpm-socketというdockerのvolumeがphp-fpmのコンテナの/run/phpにマウントされました。

php-fpmのunixドメインソケットの出力先をこのvolumeにする

デフォルト設定をもってくる

# まずはconf格納するディレクトリをつくる
mkdir -p docker/conf

docker run --rm --entrypoint=cat php:8.3-fpm /usr/local/etc/php-fpm.d/zz-docker.conf > docker/conf/zz-docker.conf

php-fpmの設定ファイルを編集する

[global]
daemonize = no

[www]
user = www-data
group = www-data
listen = /run/php/php-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0666

listen = 9000となっているところを、このローカルのパスに変更するとphp-fpmがunixドメインソケットで通信するようになります。その下の設定はファイルのオーナーとパーミッションです。nginxから読み書きできるように追記します。

設定ファイルをマウントする

name: twitter-clone

volumes:
  twitter-clone-php-fpm-socket:

services:
  web:
    container_name: twitter-web
    image: nginx:latest
    ports:
      - "9999:80"

  php:
    container_name: twitter-php-fpm
    image: php:8.3-fpm
    volumes:
      - twitter-clone-php-fpm-socket:/run/php
      - ./conf/zz-docker.conf:/usr/local/etc/php-fpm.d/zz-docker.conf:ro

今度はローカルファイルをコンテナのパスに設定して、上書きします。これで先程www-dataとかいたzz-docker.confが上書きされました。最後のroというのはreadonlyという意味です。ファイル変更しない場合はこれをつけておくと多少のスピード改善が可能です。

Laravelの教科書 バージョン10対応 [ 加藤 じゅんこ ]

価格:3300円
(2024/11/4 11:42時点)
感想(0件)

PHPフレームワークLaravel実践開発 [ 掌田津耶乃 ]

価格:3300円
(2024/11/4 11:42時点)
感想(1件)

nginxのコンテナからそのunixドメインソケットのファイルを読み書きするように設定する

デフォルトの設定ファイルを取得する

phpのときと同じようにデフォルトの設定ファイルを取得します。

docker run --rm --entrypoint=cat nginx /etc/nginx/nginx.conf > docker/conf/nginx.conf

2行目にある user nginx; のところを user www-data; と書き換えるだけです。

php-fpmと同じようにマウントして上書きする

docker-compose.ymlを編集します

name: twitter-clone

volumes:
  twitter-clone-php-fpm-socket:

services:
  web:
    container_name: twitter-web
    image: nginx:latest
    ports:
      - "9999:80"
    volumes:
      - twitter-clone-php-fpm-socket:/run/php
      - ./conf/nginx.conf:/etc/nginx/nginx.conf:ro

  php:
    container_name: twitter-php-fpm
    image: php:8.3-fpm
    volumes:
      - twitter-clone-php-fpm-socket:/run/php
      - ./conf/zz-docker.conf:/usr/local/etc/php-fpm.d/zz-docker.conf:ro

これでnginxとphp-fpmのコンテナはunixドメインソケットで通信できる下準備はできました。まだdocument rootの設定やnginx側のunixドメインソケットのパス設定などが残っているのでこのままではブラウザにはphp実行結果は表示できません。

LaravelのWelcomeページまで書こうかなと思いましたがけっこうなボリューム(複雑さ)になってきたのでここらで終わりとします。次回はLaravelのWelcomeページを表示するところまでやってみたいと思います。