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: ""

  mysql:
    image: mysql:5.7
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=
    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;
    }
}

<<:  NestJs 延伸篇 - Federation 设定

>>:  Day 26 - Lognormal 分布测试

Day16:今天来聊一下如何使用njRAT RAT Trojan控制Windows电脑攻防

攻击者会使用Trojan horses(木马程序)来诱骗使用者在电脑上执行预先设计的操作, 一旦木马...

DAY 6 ROS 通讯架构2

前言 今天我们要来讲 ROS 中最为核心的部分,ROS 提供了 四种通讯方式,分别为 Topic、S...

Day13 HTML三

今天的影片内容为介绍一些常用的元素,像是插入超连结与图片,以及表格的建立等~ 一起来看看让网页变得更...

写在VSCode Extension系列文之後 - 12th铁人赛颁奖典礼得奖致词

2021/08/02 大家好,我是韦恩。 新的一年的铁人赛又到了,在这个时候,回顾下上次比赛结尾时的...

Day30. 8人订阅Q&A问答

前情提要:Day1. 前言(动机与简介) 动机 重新整理在blog中的相关内容。 与大家讨论学习。...