見出し画像

docker初心者がphp+nginxのdocker環境を構築してみる

こんにちは、おしうみです!

今回はdockerについてさほど詳しくなかった僕が、docker環境を構築してみたので、初心者目線で簡単に解説をしたいと思います。


結論からいうとこんなファイルができました


Dockerfile

FROM php:7.2-fpm-alpine

docker-compose.ymlファイル

version: '2'

services:
  nginx:
    image: nginx:alpine
    container_name: laravel_nginx
    volumes:
      - ./config/conf.d/:/etc/nginx/conf.d/
      - ./public:/var/www/public
      - /var/run/docker.sock:/tmp/docker.sock:ro
    environment:
       HOST_NAME: 'つけたいホスト名(app.com)など'
    ports:
      - 80:80
    networks:
      default:
        ipv4_address: 172.28.0.4
    links:
      - phpfpm
    depends_on:
      - phpfpm
  phpfpm:
    container_name: laravel_phpfpm
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - ./:/var/www/
networks:
  default:
    ipam:
      config:
        - subnet: 172.28.0.4/16

default.conf

server {
    listen       0.0.0.0:80;
    server_name  localhost;
    charset      utf-8;

    root /var/www/public;

    index index.php;

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

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

/etc/hosts

172.28.0.4 app.com


これからちゃんと説明していきます!

docker環境(nginx+php)構築に必要なファイル

docker環境構築に必要なファイルは3つです!

- Dockerfile(メインのファイル)
- docker-compose.ymlnginxphpなど複数のコンテナ間の決まりを書くファイル)
- default.confnginxの設定を書くファイル, 〇〇.confという形式ならどんな名前でも可)

この3つがあればnginx+phpのdocker環境は作れます!


Dockerfileはどんな感じ?

Dockerfileは僕は一行しか書いていません。笑

FROM php:7.2-fpm-alpine

これでいけるんです!

これは、php7.2-fpm-airpineというイメージを使って環境を構築するという意味です。えっ!これだけ!?と思うかもしれませんが、これとdocker-compose.ymlとdefault.conだけで立派なphp環境は構築します。


Docker-compose.ymlファイルはどんな感じ?

version: '2'

services:
  nginx:
    image: nginx:alpine
    container_name: nginx
    volumes:
      - ./config/conf.d/:/etc/nginx/conf.d/
      - ./public:/var/www/public
    ports:
      - 80:80
    links:
      - phpfpm
    depends_on:
      - phpfpm
  phpfpm:
    container_name: phpfpm
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - ./:/var/www/

少し長いですが、人によってここを修正したらいいですよ!っていう部分だけ解説していきます。


まずは、nginxのこの部分!volumesは自分のパソコン上にあるフォルダやファイルをdocker内と共有するという意味ですが、nginxの設定ファイルであるdefault.conf(あとで作る)とサービスの公開するファイルがある部分(laravelならpublicディレクトリなど)を書く必要があります。この場合だと、default.confは.「config/conf.d/default.conf」にあり、publicディレクトリは「./public」にあります。右側の`/etc/nginx/conf.d`と`/var/www/public`は変える必要ありません。(docker内のnginxの設定ファイルは/etc/nginx/conf.dに、公開ディレクトリは/var/www/publicにと決まっています。)

volumes:
      - ./config/conf.d/:/etc/nginx/conf.d/
      - ./public:/var/www/public


次にphpのこの部分!Dockerfileはどこにあるかということを明示します。同じディレクトリにあれば、./Dockerfileで大丈夫です。

dockerfile: ./Dockerfile


nginx.confはどんな感じ?

nginx.confは正直、全部コピペで大丈夫です。ポート番号とかを変えない限りは、このままでいけます。

server {
    listen       0.0.0.0:80;
    server_name  localhost;
    charset      utf-8;

    root /var/www/public;

    index index.php;

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

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


localhostではなく、開発環境でもドメイン名を付けて開発したい場合

開発するときは、`http://localhost`で開発するケースが多いかもしれません。

でも「http://app.com」などで、ドメイン名を付けて開発したいケースもあると思います。そのときはdocker-compose.ymlとdefault.confをこのように修正します。


version: '2'

services:
  nginx:
    image: nginx:alpine
    container_name: laravel_nginx
    volumes:
      - ./config/conf.d/:/etc/nginx/conf.d/
      - ./public:/var/www/public
+     - /var/run/docker.sock:/tmp/docker.sock:ro
+   environment:
+      HOST_NAME: 'つけたいホスト名(app.com)など'
    ports:
      - 80:80
+   networks:
+     default:
+       ipv4_address: 172.28.0.4
    links:
      - phpfpm
    depends_on:
      - phpfpm
  phpfpm:
    container_name: laravel_phpfpm
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - ./:/var/www/
+networks:
+ default:
+   ipam:
+     config:
+       - subnet: 172.28.0.4/16


server {
    listen       0.0.0.0:80;
-   server_name  localhost;
+   server_name  $HOST_NAME;
    charset      utf-8;

    root /var/www/public;

    index index.php;

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

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


`/var/run/docker.sock:/tmp/docker.sock:ro`を使用することで、dockerのnginxのipアドレスを使うことができます。

実際に`docker network inspect アプリ名_default`を打ち込むと、nginxのipアドレスが出てくると思います。なので、http://172.18.0.4とか打てば表示されるはずです。

しかし、それだけでは、docker-compose upをするたびにipアドレスが変わってしまい、ご面倒なので、ipアドレスを固定することにします。その設定がdocker-compose.ymファイルの「networks」の部分です。上の例では「172.28.0.4」に固定しています。

environmentのHOST_NAMEの部分には、自分がつけたいホスト名を書いてください、このHOST_NAMEがdefault.conの$HOST_NAMEに勝手に結びつきます。


ipアドレスを固定するなら/etc/hostsも修正

ipアドレスを固定して、ドメインを使いたい場合は、こんな感じに`etc/hosts'を修正します。

172.28.0.4 app.com

そうしたら、http://app.comにアクセスすると、172.28.0.4のipアドレスに結びつけてくれて、開発環境でもドメインを使えるようになります。


これで、開発環境でもドメインを使ったdocker環境が完成しました!

ドメインではなく、localhostでも良い場合もこのnoteを参考にしてもらえば簡単に構築できると思います!

この記事が気に入ったらサポートをしてみませんか?