Docker 实践(八):构建 Laravel 开发环境

义公
• 阅读 10719

有人在 SegmentFault 上邀请我回答问题:请问下有人使用Docker来安装Laravel本地开发环境吗,随手写了篇答案,记录下。

首先需要明确,一容器一进程,多容器协作完成。

所以,需要以下四个容器:

  1. nginx

    • 作用:响应 web 请求,处理静态文件。

    • 镜像:无需自己构建,直接拉去官方镜像。

  2. php-fpm

    • 作用:处理 PHP 脚本。

    • 镜像:由于项目中可能依赖不同的扩展,需要依赖官方镜像自行构建, 另外还需要 composer 和 phpunit 支持。

  3. mysql

    • 作用:数据库。

    • 镜像:无需自己构建,直接拉去官方镜像。

  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

就可以进行开发了,是不是很简单。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java实现接口导出csv文件
<palign"center"<imgsrc"http://qiniu.tomxin.cn/blog/180920/5BkJdmB10j.png?imageslim"alt"MaterialRenderPhone"</p<h1align"center"<ahref"http://tomxin.cn"target"\
待兔 待兔
4年前
【Golang】Golang + jwt 实现简易用户认证
<p本文已同步发布到我的个人博客:<ahref"https://links.jianshu.com/go?tohttps%3A%2F%2Fglorin.xyz%2F2019%2F11%2F23%2FGolangjwtsimpleauth%2F"target"_blank"https://glorin.xyz/2019/11/23/Golang
Wesley13 Wesley13
3年前
CSS 右侧固定宽度 左侧自适应 或者 三列布局 左右固定 中间自适应的问题
一: 右侧固定宽度左侧自适应  第一种方法:左侧用marginright,右侧float:right 就可以实现。    HTML代码可以如下写:   <div      <ahref""target"_blank"我是龙恩</a   </div <div
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
CSS _text
参考:https://segmentfault.com/q/1010000007136263法一:textalignlast:justify;html<div<pclass"item"<labelfor"name"class"itemLabel"姓名</la
Stella981 Stella981
3年前
Python基础教程,Python入门教程(非常详细)
<divclass"htmledit\_views"id"content\_views"<p<ahref"http://c.biancheng.net/python/base/"rel"nofollow"第1章Python编程基础</a</p<p1.<ahref"http://c.biancheng.net/view/
Stella981 Stella981
3年前
CodeBlocks下载与安装教程
<divclass"htmledit\_views"id"content\_views"<p一、下载教程</p<p1.在浏览器上搜索CodeBlocks官网或者直接输入网址<ahref"http://www.codeblocks.org/"rel"nofollow"http://www.codeblocks.org/进入Co
Stella981 Stella981
3年前
Dubbo爆出严重漏洞!可导致网站被控制、数据泄露!附解决方案
http://dy.163.com/v2/article/detail/F5FPIFRU0511Q1AF.html  !(http://dingyue.ws.126.net/2020/0216/125ec4c4p00q5rcrs0019d200ig009qg00ig009q.png)  来源:华为云  原文地址:https://w
Wesley13 Wesley13
3年前
Java分布式锁之数据库实现
<divid"cnblogs\_post\_body"class"blogpostbody"<p之前的文章<ahref"http://www.cnblogs.com/garryfu/p/7978611.html"target"\_blank"《Java分布式锁实现》</a中列举了分布式锁的3种实现方式,分别是基于数据库实现,基于缓存
Wesley13 Wesley13
3年前
JS 返回上一步(退回上一步上一个网页)
链接式:<ahref"javascript:history.go(1)"返回上一步</a<ahref"<%Request.ServerVariables("HTTP\_REFERER")%"返回上一步</a按钮式:<INPUTname"pclog"type"button"value"GO"o
Wesley13 Wesley13
3年前
(寒假开黑gym)2017
<ahref"https://codeforces.com/gym/101933/"target"\_blank"style"fontsize:24px;"<strong传送门</strong</a付队!(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.