iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
1
自我挑戰組

Laravel 實戰經驗分享系列 第 26

Laravel 實戰經驗分享 - Day26 Dockerize 你的 Laravel 專案(下)

昨天在文章中提到如何 Dockerize 你的專案,而設定你自己的 Docker Image 就是一件重要的事情,我們可以先看看 Laravel 需要的 PHP 套件,來決定我們要寫的 Dockerfile 內容。

  • PHP >= 7.3
  • BCMath PHP Extension
  • Ctype PHP Extension
  • Fileinfo PHP Extension
  • JSON PHP Extension
  • Mbstring PHP Extension
  • OpenSSL PHP Extension
  • PDO PHP Extension
  • Tokenizer PHP Extension
  • XML PHP Extension

Dockerfile

因此我們的 Dockerfile 可以這樣設置。

FROM php:7.3-fpm
 
RUN apt-get update && apt-get install -y \
        # For php gd ext
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
        # For php zip ext
        zlib1g-dev \
        libzip-dev \
        # For memcached
        libmemcached-dev \
        # Install required packages
        default-mysql-client \
        locales \
        # For php composer
        unzip \
        # For Terminal
        git \
        subversion \
        vim \
    && docker-php-ext-configure mysqli \
    && docker-php-ext-install -j$(nproc) mysqli \
    && docker-php-ext-configure gettext \
    && docker-php-ext-install -j$(nproc) gettext \
    && docker-php-ext-configure gd --with-freetype-dir --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-configure ldap \
    && docker-php-ext-configure sockets \
    && docker-php-ext-install -j$(nproc) sockets \
    && docker-php-ext-configure pdo_mysql \
    && docker-php-ext-install -j$(nproc) pdo_mysql \
    && docker-php-ext-configure zip \
    && docker-php-ext-install -j$(nproc) zip \
    && pecl install xdebug \
    && docker-php-ext-enable xdebug \
    && pecl install memcached \
    && docker-php-ext-enable memcached
 # For composer
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer
 # For time zone
ENV TZ=Asia/Taipei
RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone

以上有加上一些我自己在設定 container 時需要用到的套件。

Docker Compose 設置

Docker Compose 是一個能夠自動建立 docker container 的工具,這樣不用到各個 Dockerfile 目錄中下指令建立 images,也方便管理各個 container

專案資料夾結構

  • ./docker-compose.yml
    管理所有 docker images
    Nginx、MySQL、Node.js images 可以直接在 docker-compose.yml 建立
  • ./files
    • ./php
      由於 Laravel 需要用到的 PHP 環境較多,因此另開 Dockerfile 建立 images,包含設定 composer、git 等應用
    • ./nginx/conf.d
      default.conf 為 nginx 設定檔,對應之後 docker container 啟動時 nginx 的設定
  • ./frontend
    前端程式檔案位置
  • ./html
    後端程式檔案位置
  • ./log
    應用程式執行的 log 檔,在 docker container 啟動後自動產生(docker-compose.yml 內設定)
  • ./mysql
    資料庫檔案,在 docker container 啟動後自動產生(docker-compose.yml 內設定)

docker-compose.yml 設定

  • version: docker-compose 版本

  • services: docker-compose 要運行的 images 設定
    php

    • build: 要執行的 Dockerfile 目錄
    • volumes: 要對應容器內的資料夾,冒號左邊為本地目錄,右邊為容器內目錄
    • depends_on: 該 images 依賴 mysql images

    mysql

    • image: 要建立的 mysql 版本
    • environment: 建立的 mysql 環境變數設定,如資料庫的名稱、使用者、密碼等...
    • ports: docker container 啟動時,本地端的 Port 對應容器內的 port
    • volumes:
      • ./mysql:/var/lib/mysql
        本地端存放的資料庫檔案對應容器內的目錄
      • ./log/mysql:/var/log/mysql
        本地端存放的 log 對應容器內的目錄
        nginx
    • ports: 網路伺服器要對應的 Port,冒號左邊為本地端 port,右邊為對應的 container 內的 port
    • volumes: 與本地端對應的 nginx 服務
    • Laravel 程式碼目錄
      • "./html:/var/www/html"
        前端程式碼目錄
      • "./frontend/build:/var/www/build"
        nginx log 目錄
      • "./log/nginx:/var/log/nginx"
        nginx 設定目錄
      • "./files/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf"

完整程式碼

version: "3.3"
 
services:
  php:
    build: ./files/php/
    restart: unless-stopped
    volumes:
      - "./html:/var/www/html"
    depends_on:
      - mysql 
    environment:
      DB_ROOT_PW: "zs53570612"

  mysql:
    image: mysql:5.7
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=zs53570612
    ports:
      - 3307:3306
    volumes:
      - ./mysql:/var/lib/mysql
      - ./log/mysql:/var/log/mysql
 
  nginx:
    image: nginx:latest
    ports:
      - 81:80
    volumes:
      - "./html:/var/www/html"
      - "./frontend/build:/var/www/html/public"
      - "./log/nginx:/var/log/nginx"
      - "./files/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf"
    depends_on:
      - node
    links:
      - php

Nginx 設定

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    root   /var/www/html/public; 
    index index.html index.htm
 
    location / {
        index  index.html index.htm index.php;
 
        location /api {
            try_files $uri $uri/ /index.php$request_uri;
        }
        
        try_files $uri $uri/ /index.html;
 
        location ~ ^(.+\.php)(.*)$ {
            fastcgi_pass   php:9000;
            fastcgi_index  index.php;
            # 讓 PHP 可以取得 PATH_INFO 參數
            fastcgi_split_path_info         ^(.+\.php)(/.+)$;
            fastcgi_param  PATH_INFO        $fastcgi_path_info;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            include        fastcgi_params;
        }
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

上一篇
Laravel 實戰經驗分享 - Day25 Dockerize 你的 Laravel 專案(上)
下一篇
Laravel 實戰經驗分享 - Day27 Eloquent 的關聯
系列文
Laravel 實戰經驗分享30

尚未有邦友留言

立即登入留言