LoginSignup
14
13

More than 3 years have passed since last update.

docker-composeでunixソケットを使った、Nginx、php-fpmコンテナを作る

Last updated at Posted at 2020-06-20

はじめに

ecs試したいなあと考えていた矢先、開発環境に利用していたdocker-composeファイルを確認すると悲劇が起こっていた。起こったこととしては、nginxに対し、Laravelのアプリをそのままマウントしていたのだ。これでは、コンテナの意味がない。ただ、tcpを使うのもなんだからunixソケットを試してみようということになった。

完成図

.
├── docker
│   ├── html
│   │   └── index.php
│   ├── nginx
│   │   ├── Dockerfile
│   │   ├── conf.d
│   │   │   └── default.conf
│   │   └── nginx.conf
│   └── php_fpm
│       └── php-fpm.d
│           └── zz-docker.conf
└── docker-compose.yml

git : https://github.com/yCroma/unixsocket-php-fpm

試し方

$ git clone https://github.com/yCroma/unixsocket-php-fpm.git unixsocket
$ cd unixsocket
$ docker-compose up -d --build

# もし表示されなかったら
$ docker-compose restart

# コンテナの中身が見たい
$ docker-compose exec nginx ash
$ docker-compose exec php_fpm ash

http://localhost:28000 へアクセス

解説

内容としては、Nginx + PHP-FPM で unix ドメインソケットを使ったシンプルな docker-compose.yml を書きました。2をalpineで実装したものとなります。

ポイント

先ほどのリンクにある通り、ユーザーの管理が肝でした。

docker-compose.yml

トップレベルボリュームを利用することによって、コンテナ間のソケットを通しています。

docker-compose.yml
version: '3'

volumes:
  php_sockert:

services:
  nginx:
    container_name: test_nginx
    build: 
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    ports:
      - 28000:80
    volumes:
      - ./docker/html/:/var/www/html/
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./docker/nginx/conf.d/:/etc/nginx/conf.d/
      - php_sockert:/var/run
    depends_on:
      - php_fpm

  php_fpm:
    container_name: test_php_fpm
    image: php:7.2-fpm-alpine
    volumes:
      - ./docker/html/index.php:/var/www/html/index.php
      - ./docker/php_fpm/php-fpm.d/zz-docker.conf:/usr/local/etc/php-fpm.d/zz-docker.conf
      - php_sockert:/var/run

Nginx

Nginxは構築用に、Dockerfileを作成しました。内容としては、ソケット用のユーザーを追加しました。むしろ、そのために作りました。

Dockerfile

ユーザーを追加しました。先ほどのリンクのところで、82番のuidをもったwww-dataが必要だったとのことなので、条件に合わせて追加しました。

docker/nginx/Dockerfile
FROM nginx:stable-alpine

RUN adduser -S www-data -u 82 \
  && echo "www-data ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \
  && echo 'www-data:www-data' | chpasswd

nginx.conf

ここでは、一番最初の行でNginxのユーザーを変更しています。一番大事なところです。

docker/nginx/nginx.conf
# ↓これ
user  www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

default.conf

ここでは、fastcgiの設定とドキュメントルートの設定をしました。

docker/nginx/conf.d/default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    root         /var/www/html;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /var/www/html;
        index  index.php index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           /var/www/html/;
        fastcgi_pass   unix:/var/run/php7-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

php-fpm

ここでは、ファイル名を特に注意しなければなりませんでした。
PHPの公式DockerイメージでUNIXソケット通信しようとして罠にハマるの巻

ファイル名の先頭のzz-は必ずつけるようにしてください。

docker/php_fpm/php-fpm.d/zz-docker.conf
[global]
daemonize = no

[www]
user  = www-data
group = www-data

listen = /var/run/php7-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode  = 0666

また、ここも参考にさせていただきました。
Nginx+PHP-FPMでUNIXドメインソケットを使っていてハマる

おわりに

このコンテナの良いところは、index.phpさえマウントすれば動く可能性があること。今後はこれらのファイルを元に、Laravel環境を構築していきたいですね。

参考

14
13
1

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
14
13