search
LoginSignup
22
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

docker-composeでphp + nginxの環境を作りました

前置き

phpとnginxが入っている環境をdocker-composeで作成しました。
慣れないことばかりで戸惑いましたが、備忘録代わりに手順を残しておこうと思います。

*docker for macをインストールしている前提で手順を進めていきます。

フォルダ構成

フォルダの構成はこのようになってます。

phpsql
│  docker-compose.yml
├─data
│ │
│ └─www
│     index.php
│ 
│   
│  
├─nginx
│    Dockerfile
│    server.conf
│
└─php5
     Dockerfile
     php.ini

docker-compose.ymlですが、プロジェクトの作業ディレクトリのルートに置く方法が一般的らしいです。
ではdocker-compose.ymlの中身を見ていきましょう。

docker-compose.yml

docker-compose.yml
version: '2'
services:
  nginx:
    build: ./nginx
    ports:
      - "9000:80"
    links:
      - php5
    volumes:
      - ./data/www:/var/www/html
      - ./nginx/server.conf:/etc/nginx/nginx.conf

  php5:
    build: ./php5
    volumes:
      - ./data/www:/var/www/html
      - ./php5/php.ini:/usr/local/etc/php/php.ini

  smtp:
      image: schickling/mailcatcher
      ports:
        - "1090:1080"
        - "1025:1025"

各種詳細

version: '2'

これでymlの記述を決めています。version1は廃止が決定されており、今後記述していくなら2が無難らしいです。

build

Dockerfileがあるディレクトリのパスを指定します。nginxのコンテナの場合、

docker-compose.yml
build: ./nginx

となっています。パスの./nginxはdocker-compose.ymlがある場所からの相対パスになります。
docker-compose buildをした際に、ディレクトリ直下のDockerfileを読み込んでコマンドを走らせます。

ports

ポートの公開内容です。

docker-compose.yml
ports:
 - "9000:80"

上記ならホスト側が9000でコンテナ側が80となっています。ホスト側は他のサービスで使っているポートと被らないように注意しましょう。

links
links:
  - php5

コンテナを他のコンテナにリンクさせます。上記のnginxはphp5とリンクさせていますね。

volumes

ホストとコンテナのフォルダを同期させている場所です。
例えば
ymlファイル上には

volumes:
 - ./data/www:/var/www/html

と記載されています。

ホスト側の./data/www、コンテナ側の/var/www/htmlのどちらにもindex.phpがあるとします。
ホスト側のindex.phpが編集されるとコンテナ側のindex.phpが同期されます。
ちなみにこの同期のことをマウントといいます。

次は各コンテナのDockerfileを見ます。

Dockerfile

nginx/Dockerfile
FROM nginx:latest

RUN apt-get update
RUN apt-get install -y vim less

MAINTAINER XXXXXX
nginx/dockerfile
FROM php:5-fpm
RUN apt-get update
MAINTAINER XXXXXX
From

Dockerイメージを構築する際に、元になるイメージを指定します。

Run

コンテナ内で実行するコマンドです。docker-compose buildした際にこのコマンドが走ります。

次はserver.confをみます。

server.conf

server.conf
user nginx;

worker_processes auto;
pid /var/run/nginx.pid;

events{
    worker_connections 2048;
    multi_accept on;
    use epoll;
}


http {
    charset UTF-8;
    server_tokens off;
    include /etc/nginx/mime.types;
    default_type text/plain;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    server {
            listen 80 default;
            server_name localhost;
            root /var/www/html;
            index index.php;
            charset utf-8;
            access_log /var/log/nginx/access.log;
            error_log  /var/log/nginx/error.log;

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

            location ~ \.php$ {
            fastcgi_pass phpsql_php7_1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include       fastcgi_params;
            }
    }
}

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

try_filesには存在をチェックするファイルやディレクトリを指定します。
$uriのパスに対するファイルが存在すれば、ファイルを返します。この場合ではindex.phpを返します。

実行

後はindex.phpに何かしら記述してdocker-compose buildをしてからdocker-compose upをすれば環境構築出来ると思います。

参考サイト

参考にさせていただいたサイトはこちらです。
https://qiita.com/naga3/items/be1a062075db9339762d
https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa
https://qiita.com/zembutsu/items/891c7ffd2c36097400b1
https://heartbeats.jp/hbblog/2012/04/nginx05.html
https://gtrt7.com/blog/nginx/docker-compose2#i-2
https://unskilled.site/%E4%BD%BF%E3%81%84%E6%96%B9%E5%9F%BA%E6%9C%AC%E7%89%88dockercompose%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%83%BB%E9%80%A3%E6%90%BA%E3%82%92%E6%A5%BD/

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
What you can do with signing up
22
Help us understand the problem. What are the problem?