LoginSignup
134
118

More than 3 years have passed since last update.

Docker + Nginx + PHP-FPM なら40秒くらいで環境を準備できる docker-compose が楽しくなってきました。

Last updated at Posted at 2017-02-05

掲題のアイテムをつかっての環境づくりなので、DBもないし、完全に docker の勉強です。でもこれらの組み合わせのサンプルをいろいろ Web で漁ったのですが、なぜか動かなく..。なんとか動くものができたので、投稿になります。

GitHub

こちらにまとめましたので、結論だけ知りたいかたは、こちらからどうぞ。:pray:

mochizukikotaro/docker-nginx-phpfpm - branch:simple

できたもの

  • docker
  • nginx
  • php-fpm

な環境を docker-compose を用いて簡単に作れるようになりました。

僕は Mac ユーザーで、それ前提ですが、Doceker for Mac が入っていれば以下のコマンドで、phpinfo() に辿りつけます。

開始コマンド

$ git clone git@github.com:mochizukikotaro/docker-nginx-phpfpm.git
$ cd docker-nginx-phpfpm.git
$ docker-compose up

上の 3 つのコマンドで、localhost:8080 にアクセスすると下の画面に辿りつけます。

スクリーンショット 2017-02-05 22.32.27.png

あとかづけコマンド

docker-compose up でコンテナが立ち上がっていますが、勉強なので削除もしっかりしておきたいところです。
(下のコードの piyo は僕のディレクトリ名がそうなっているだけなので、あまり気にしないでください。)

# プロセス確認
$ docker-compose ps
   Name                 Command               State     Ports
-------------------------------------------------------------
piyo_php_1   docker-php-entrypoint php-fpm   Exit 137
piyo_web_1   nginx -g daemon off;            Exit 137

# コンテナ削除
$ docker-compose down
Removing piyo_web_1 ... done
Removing piyo_php_1 ... done

ソースコードの紹介

コードもできるだけシンプルな構成にしております。

$ tree
.
├── Dockerfile
├── README.md
├── code
│   └── index.php
├── docker-compose.yml
└── site.conf

これだけなので、あまり難しいことはないと思います。

docker-compose.yml
version: '3'
services:
  web:
      build: ./
      ports:
          - "8080:80"
      depends_on:
          - php
  php:
      image: php:7-fpm
      volumes:
          - ./code:/code
site.conf
server {
    index index.php index.html;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /code;

    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;
    }
}
code/index.php
<?php
echo phpinfo();

全ソースはこちら

以上です。:slight_smile:
ここまでの話は、シンプルでわかりやすいと思います。

考察とか、解説とか

その1. links

最初に docker-compose.yml をつくったときは、下のように links: をつかっていました。

docker-compose.yml
web:
    # 略
    links:
        - php
    # 略

links: を設定することで、nginx のコンテナの /etc/hosts にサービス情報が追加されます。これにより、site.conf に以下のように記載することができます。

fastcgi_pass php:9000;

実際に hosts の情報を確認してみると以下のようになっていました。

# まずは、nginx コンテナに入る
# ぼくは git clone *** piyo でディレクトリ名指定しているので、以下のようなカンジです。

# コンテナ名を確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
6ee2fb5c8aaa        nginx:latest        "nginx -g 'daemon ..."   6 minutes ago       Up 6 minutes        443/tcp, 0.0.0.0:8080->80/tcp   piyo_web_1
9b8ed908d621        php:7-fpm           "docker-php-entryp..."   6 minutes ago       Up 6 minutes        9000/tcp                        piyo_php_1

# 中に入る
$ docker exec -it piyo_web_1 bash
root@6ee2fb5c8aaa:/#


# 入ったあとに cat 
root@6ee2fb5c8aaa:/# cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  php 9b8ed908d621 piyo_php_1 # ちゃんと追加されてました。
172.17.0.2  php_1 9b8ed908d621 piyo_php_1
172.17.0.2  piyo_php_1 9b8ed908d621
172.17.0.3  6ee2fb5c8aaa

その2. links: の代わりに depends_on: を使うと

ngix コンテナの hosts に php とは書かれていませんでした。

$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                           NAMES
14487c92de8b        dockernginxphpfpm_web   "nginx -g 'daemon ..."   10 hours ago        Up 10 hours         443/tcp, 0.0.0.0:8080->80/tcp   dockernginxphpfpm_web_1
ba2d44f70e13        php:7-fpm               "docker-php-entryp..."   10 hours ago        Up 10 hours         9000/tcp                        dockernginxphpfpm_php_1

$ docker exec -ti dockernginxphpfpm_web_1 bash
root@14487c92de8b:/# cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.21.0.3  14487c92de8b # これが使われています。

TODO:
あれ、nginx の設定ファイル site.conf の fastcgi_pass php:9000; はうごくのか.... links のおかげで hosts にかかれて動くと思っていたんですが。どういう仕組なんだろう。..勉強します。

少ししらべた結果 :
nginx コンテナの /etc/resolv.conf に nameserver が指定してありますので、DNS がうごきます。実際、 ping php に対して名前解決はされていました。

$ docker exec -it dockernginxphpfpm_web_1 ping php
PING php (172.21.0.2): 56 data bytes
64 bytes from 172.21.0.2: icmp_seq=0 ttl=64 time=0.102 ms
64 bytes from 172.21.0.2: icmp_seq=1 ttl=64 time=0.216 ms

その3. nginx/conf.d/default.conf を上書きしています

こちらに nginx の設定ファイル についてかきましたが、デフォルトで、default.conf がいます。それで、最初は以下のようにしていました。

docker-compose.yml
# before
- ./site.conf:/etc/nginx/conf.d/site.conf

# after ( default.conf を上書きます)
- ./site.conf:/etc/nginx/conf.d/default.conf

beforeの状態だと、default の location が効いてしまい、うまくいきませんでした。

( nginx についても勉強不足なので、目下勉強中でございます。)

以上でございます。ありがとうございました。 :wave:

134
118
4

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
134
118