Docker 實踐(八):構建 Laravel 開發環境

有人在 SegmentFault 上邀請我回答問題:請問下有人使用Docker來安裝Laravel本地開發環境嗎,隨手寫了篇答案,記錄下。php

首先須要明確,一容器一進程,多容器協做完成。html

因此,須要如下四個容器:mysql

  1. nginxnginx

    • 做用:響應 web 請求,處理靜態文件。laravel

    • 鏡像:無需本身構建,直接拉去官方鏡像。git

  2. php-fpmweb

    • 做用:處理 PHP 腳本。redis

    • 鏡像:因爲項目中可能依賴不一樣的擴展,須要依賴官方鏡像自行構建, 另外還須要 composer 和 phpunit 支持。sql

  3. mysqldocker

    • 做用:數據庫。

    • 鏡像:無需本身構建,直接拉去官方鏡像。

  4. redis

    • 做用:緩存數據庫。

    • 鏡像:無需本身構建,直接拉去官方鏡像。

下面說一下 php-fpm 鏡像的構建,須要注意如下幾點:

  • 直接依賴官方的 php:7.0.12-fpm 鏡像便可,無需本身從頭開始構建。

  • 不當玩具使用的話最好不要使用 alpine 系列的鏡像,雖然它小巧玲瓏。

一個簡單的 dockerfile 示例:

FROM php:7.0.12-fpm
MAINTAINER Tairy <tairyguo@gmail.com>

WORKDIR /working
RUN apt-get update --fix-missing && apt-get install -y \
    g++ autoconf bash git apt-utils libxml2-dev libcurl3-dev pkg-config \
    && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && docker-php-ext-install iconv curl mbstring \
        xml json mcrypt mysqli pdo pdo_mysql zip \
    && docker-php-ext-configure gd \
        --with-gd \
        --with-freetype-dir=/usr/include/ \
        --with-png-dir=/usr/include/ \
        --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install gd \
    && docker-php-ext-enable gd \
    && pecl install /pecl/redis-3.0.0.tgz \
    && docker-php-ext-enable redis \
    && apt-get purge -y --auto-remove \
    && rm -rf /var/cache/apt/* \
    && rm -rf /var/lib/apt/lists/* \
    && rm -rf /pecl
    
# 安裝 composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
    && php composer-setup.php \
    && php -r "unlink('composer-setup.php');" \
    && mv composer.phar /usr/local/bin/composer \
    && composer self-update \
    && composer config -g repo.packagist composer https://packagist.phpcomposer.com \
    && composer global require "laravel/installer=~1.1" \
    && composer global require predis/predis \
    && wget https://phar.phpunit.de/phpunit.phar \
    && chmod +x phpunit.phar \
    && mv phpunit.phar /usr/local/bin/phpunit

固然,構建過程當中可能會遇到 GFW 的問題,能夠參考個人文章作一些調整:Docker 實踐(七):提高幸福感

構建好鏡像以後,多容器管理須要使用編排工具 docker-compose,因此還須要編寫 docker-compose.yml 文件,一個簡單的示例(不要忘了看註釋):

version: '2'
services:
  nginx:
    image: nginx:alpine
    depends_on:
      - red
    ports:
      - 8080:80
    volumes:
      - /path/to/nginx.conf:/etc/nginx/nginx.conf
      - /path/to/default.conf:/etc/nginx/conf.d/default.conf
      # 這個掛載是爲了處理靜態文件
      - /path/to/static:/working
    networks:
      - app
  app:
    image: your-php-fpm-image
    depends_on:
      - mysql
      - redis
    volumes:
      - .:/working
      - /path/to/php.ini:/usr/local/etc/php/php.ini
    networks:
      - app
  mysql:
    image: mysql:latest
    environment:
      TZ: 'Asia/Shanghai'
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - ./data:/var/lib/mysql
    ports:
      - 8002:3306
    networks:
      - app
  redis:
    image: redis:latest
    ports:
      - 8003:6379
    networks:
      - app
networks:
  app:

須要注意的幾點:

  • 必定要定義網絡。

  • nginx.conf, default.conf, php.ini 最好本身定義,掛載到容器中。

  • 不要忘了設置時區。

這樣在nginx的 default.conf 文件能夠這樣寫:

server {
  listen 80 default_server;
  server_name  default;

  location /static/ {
    root /working;
    index index.html;
  }

  index index.html index.php;
  root /working/public;
  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location /packages {
    try_files $uri $uri/;
  }

  location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    # 注意下面這行,pass 到 php-fpm 容器的服務名便可。
    fastcgi_pass app:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }

  sendfile off;
}

至此,配置工做完成,之後你只須要 cd 到你的項目目錄下執行

docker-compose up -d

就能夠進行開發了,是否是很簡單。

相關文章
相關標籤/搜索