DockerのNginxでPHPを表示してみる

※CentOS7(Vagrant)の環境

index.phpを用意し、

$ mkdir html
$ vi html/index.php
<?php
echo 'Hello, world!';

PHP-FPMのコンテナを起動。

$ docker run -d --name hoge_php --rm -v /home/vagrant/html:/var/www/html php:fpm

default.confをネットの情報を見様見真似で作成し、

$ vi default.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location ~ \.php$ {
        root           /var/www/html;
        fastcgi_pass   hoge_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;
    }
}

Nginxのコンテナを起動。

$ docker run -d --name hoge_web -p 80:80 --rm -v /home/vagrant/default.conf:/etc/nginx/conf.d/default.conf nginx

しかし、Nginxのコンテナが起動していない。

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS      NAMES
9c049e4dedee   php:fpm   "docker-php-entrypoi…"   2 minutes ago   Up 2 minutes   9000/tcp   hoge_php

フォアグラウンドで起動してみると、hoge_phpなんてホストは無いよ、と怒られてた。

$ docker run --name hoge_web -p 80:80 --rm -v /home/vagrant/default.conf:/etc/nginx/conf.d/default.conf nginx
・・・
nginx: [emerg] host not found in upstream "hoge_php" in /etc/nginx/conf.d/default.conf:12

デフォルトでは、ネットワークは下記の3つあり、

$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f2337f34777d   bridge    bridge    local
ace3dc876a4c   host      host      local
adcbb2bfc1a5   none      null      local

何も指定しないと、bridgeのネットワークに接続してるみたい。

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        ・・・
        "Containers": {
            "9c049e4dedee11cb3ff40c233556592368952ad97cf45ea8f8a47944ffd919f8": {
                "Name": "hoge_php",
                ・・・
            }
        },
        ・・・
    }
]

しかし、下記のドキュメントによると、デフォルトブリッジはDNS解決しないみたい。

ブリッジネットワークの利用 https://matsuand.github.io/docs.docker.jp.onthefly/network/bridge/

ということで、
一旦、コンテナを停止し、

$ docker stop hoge_php

ネットワークを作成し、

$ docker network create hoge_net
$ docker network ls
・・・
67fc2abb14d0   hoge_net   bridge    local
・・・

改めて、--networkを指定して、コンテナを起動。

$ docker run -d --name hoge_php --network hoge_net --rm -v /home/vagrant/html:/var/www/html php:fpm
$ docker run -d --name hoge_web --network hoge_net -p 80:80 --rm -v /home/vagrant/default.conf:/etc/nginx/conf.d/default.conf nginx

これで、index.phpが表示できた。
f:id:yk5656:20210129171706j:plain