容器化你的 PHP 應用程式 (nginx)

tags: Docker Nginx PHP
category: Back-End
description: 容器化你的 PHP 應用程式 (nginx)
created_at: 2021/08/31 22:00:00

cover image


前言

暫時懶得想,今天寫了一堆code有點累


事前準備

  • 裝好 Docker 環境

拉 Image 下來

這裡使用 Nginx

$ docker pull nginx

PHP 使用 php-fpm

$ docker pull php:8.0-fpm

建立 Docker network

預設是 bridge , 同一個 bridge 下的容器網路互通,還有其他種模式可以使用,但這邊使用 bridge

$ docker network create my-network

假設目錄結構是這樣

  • /root
    • /conf.d
      • /default.conf
    • www
      • /index.php

設定檔直接拿 Laravel 官方的來小改一下

default.conf

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass php80-fpm:9000;   # <--- 主要改了這個
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

index.php

<?php
    phpinfo();

先這樣子測試是否運作正常。


建立容器

首先是 php-fpm

$ docker run -d \
             --name php80-fpm \
             -v {專案目錄}:/var/www/html \
             --network my-network 
             php:8.0-fpm

再來是 nginx

$ docker run -d \
             --name nginx \
             -p 8000:80 \
             -v {設定檔目錄}:/etc/nginx/conf.d \
             -v {專案目錄}:/var/www/html \
             --network my-network \
             nginx

需要注意的是 Windows 不支援這種寫法,要把結尾的 \ 都刪除變為一行。所以我是一行寫完再整理成這個格式比較好呈現的

主要就是幫容器做幾件事

  • -d: 背景執行(daemon)
  • --name: 幫容器取名
  • -p: port映射,主機port:容器port
  • -v: 掛 volume,可以想像成掛載目錄給他
  • --network: 設定網路
  • 最後一行是要建立的 image

最後到你的瀏覽器上面開啟 localhost:8000 應該就會看到 phpinfo 生成的頁面。


轉換至 docker-compose

建立 docker-compose.yml

version: "3.9"
services: 
  nginx:
    image: nginx:latest
    container_name: nginx
    networks: 
      - my-network
    ports: 
      - 8000:80
    volumes: 
      - ./conf.d:/etc/nginx/conf.d
      - ./www:/var/www/html
  php80-fpm:
    image: php:8.0-fpm
    container_name: php80-fpm
    networks:
      - my-network
    volumes: 
      - ./www:/var/www/html

networks: 
  my-network:
    driver: bridge

然後執行下面的指令就可以一次在背景執行2個服務

$ docker-compose up -d

這時候在去 localhost:8000 一樣可以看到結果

如果要把服務關掉,一樣只要一行,就可以把兩個服務刪除。

$ docker-compose down



最後更新時間: 2021年08月31日.