有人在 SegmentFault 上邀请我回答问题:请问下有人使用Docker来安装Laravel本地开发环境吗,随手写了篇答案,记录下。php
首先须要明确,一容器一进程,多容器协做完成。html
因此,须要如下四个容器:mysql
nginxnginx
做用:响应 web 请求,处理静态文件。laravel
镜像:无需本身构建,直接拉去官方镜像。git
php-fpmweb
做用:处理 PHP 脚本。redis
镜像:因为项目中可能依赖不一样的扩展,须要依赖官方镜像自行构建, 另外还须要 composer 和 phpunit 支持。sql
mysqldocker
做用:数据库。
镜像:无需本身构建,直接拉去官方镜像。
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
就能够进行开发了,是否是很简单。