# LaraDock

# 介绍

# 简介

一套完整的基于Docker的PHP开发环境。

包含了预先打包的Docker镜像,所有预先配置都是为了提供一个完美的PHP开发环境。

Laradock是在laravel社区众所周知的,因为这个项目最开始只关注在Docker上运行的laravel项目。后来,由于PHP社区的大量使用,它开始支持比如SymfonyCodeIgniterWordPressDrupal等其他的PHP项目。

# 快速概览

让我们来看一下用它安装NGINX, PHP, Composer, MySQL, Redis and Beanstalkd是多么容易:

  • 克隆Laradock到你的PHP项目中:
git clone https://github.com/Laradock/laradock.git
  • 进入laradock文件夹并重命名env-example.env:
cp env-example .env
  • 运行你的容器:
docker-compose up -d nginx mysql redis beanstalkd
  • 打开你项目里的.env文件并设置以下内容:
DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd
  • 打开浏览器并访问本地主机: http://localhost.
That's it! enjoy :)

# 特点

  • 轻松切换PHP版本: 7.1, 7.0, 5.6...
  • 选择你最喜欢的数据库引擎: MySQL, Postgres, MariaDB...
  • 运行你自己的软件组合: Memcached, HHVM, Beanstalkd...
  • 每个软件都运行在一个单独的容器中: PHP-FPM, NGINX, PHP-CLI...
  • 通过简单的编辑 Dockerfile很容易定制任何容器
  • 所有镜像都继承自官方的基础镜像 (可信任的基础镜像)。
  • 预先配置在您的根目录下的NGINX可以托管任何代码。
  • 每个项目都可以使用laradock,或者所有项目也可以共用一个laradock。
  • 可以很容易的使用环境变量安装/删除容器中的软件。
  • 干净、结构很好的Dockerfiles (Dockerfile)。
  • 最新版的Docker Compose文件 (docker-compose)。
  • 一切都是可见、可编辑的。
  • 快速的镜像构建。
  • 每周会有更多更新。

# 支持的软件

在秉承Docker推动的关注分离原则的同时,Laradock在各自的容器中(Container)独立运行各自的软件,你可以像任何容器一样打开/关闭多个实例,而不用担心配置,一切都很有魅力。

  • 数据库引擎: MySQL - MariaDB - Percona - MongoDB - Neo4j - RethinkDB - MSSQL - PostgreSQL - Postgres-PostGIS.
  • 数据库管理: PhpMyAdmin - Adminer - PgAdmin
  • 缓存引擎: Redis - Memcached - Aerospike
  • PHP 服务器: NGINX - Apache2 - Caddy
  • PHP 编译器: PHP FPM - HHVM
  • 消息队列: Beanstalkd - RabbitMQ - PHP Worker
  • 队列管理: Beanstalkd Console - RabbitMQ Console
  • 随机 工具: HAProxy - Certbot - Blackfire - Selenium - Jenkins - ElasticSearch - Kibana - Grafana - Mailhog - MailDev - Minio - Varnish - Swoole - Laravel Echo...

作为一个开发环境,Laradock引入了Workspace镜像,它包含一套丰富的有用的工具,所有工具都用上预先配置好的,几乎可以与所有你选择的容器或者工具组合起来一起工作。

Workspace 镜像工具

PHP CLI - Composer - Git - Linuxbrew - Node - V8JS - Gulp - SQLite - xDebug - Envoy - Deployer - Vim - Yarn - SOAP - Drush...

你可以从.env文件中选择要安装的在工作区的容器和其它容器中的工具。

如果你修改docker-compose.yml, .env 或者任何 dockerfile 文件, 你必须重新构建你的容器, 在运行实例中查看这些修改的效果。

如果您在列表中找不到您的软件,请自行构建并提交。贡献欢迎:)

# 赞助商

通过成为赞助商来支持这个项目。

您的logo将会显示在github 仓库 的索引页和 文档 主页, 并链接到您的网站. [成为赞助商]

img img img img img img img img img img

# 什么是Docker

Docker 是一个开发、运输、运行应用程序的开放平台。

Docker可以使你将应用程序和你的基础架构(设备)分离,因此你可以快速的交付你软件。

使用Docker,你可以管理应用程序一样管理你的基础架构,通过使用Docker的methodologies来快速的传输、测试和部署代码,可以显著的缩短编写代码和生成环境中运行的代码之间的延迟。

# 为什么是Docker而不是Vagrant

Vagrant 可以在进分钟内创建虚拟机, 而 Docker 是在几秒中内创建虚拟容器。

Docker提供轻量级的虚拟容器,它们共享相同的内核,并允许安全的执行独立的进程,而不像Vagrant一样提供完整的虚拟机。

除了速度之外,Docker还提供了很多Vagrant无法实现的功能。

最重要的是,Docker可以运行在开发和生产(任何地方都可以做到相同的环境),而Vagrant仅仅只是为了开发而设计(因此您必须每次在生产环境中重新配置您的服务器)

# 入门

# 要求

# 安装

选择最适合你的需求进行设置

# 单个项目的设置

(如果你想为每个项目单独配置Docker环境,按照下面这些步骤)

# 已经有一个PHP项目
# 1.将laradock克隆到你项目的根目录:
git submodule add https://github.com/Laradock/laradock.git

注意: 如果你还没有为你的项目使用Git,你可以使用 git clone代替 git submodule

记录你的laradock的变化同时保持更新laradock到你的项目 查看这些文档

你的文件夹结构应该如下所示:

+ project-a
  + laradock-a
+ project-b
  + laradock-b

(如果你想为每个项目运行单独的laradock,将laradock文件夹重命名为每个项目中的唯一名称很重要).

现在跳转到用法部分.

# 还没有一个PHP项目

# 1.将repository克隆到你机器的任意位置:
git clone https://github.com/laradock/laradock.git

你的文件夹结构应该如下所示

+ laradock
+ project-z
# 2.编辑你的web服务器站点配置

我们需要去执行用法部分的第一步来实现这一点

cp env-example .env

在顶部, 修改 APPLICATION变量为你的项目路径.

APPLICATION=../project-z/

确保使用你的项目文件夹名称将project-z进行替换

现在跳转到用法部分

# 多个项目的设置

(如果你想为你的所有项目使用单个的Docker环境,请遵循以下步骤)

# 1.在你的机器上的任意位置克隆repository(类似于上面的还没有一个PHP项目):
git clone https://github.com/laradock/laradock.git

你的文件夹结构应该如下所示:

+ laradock
+ project-1
+ project-2
# 2.进入nginx/sites为访问的不同的域名创建配置文件去指向不同的项目目录

默认情况下laradock包含app.conf.example, laravel.conf.examplesymfony.conf.example 作为工作样本

# 3.修改默认名称为*.conf:

你可以根据需要重命名配置文件、项目文件夹和域名,只要确保root在配置文件中指向正确的文件夹名称即可。

# 4.在hosts文件中增加域名
127.0.0.1  project-1.test
127.0.0.1  project-2.test
...

如果你使用的是Chrome 63或者更高版本进行开发的,请勿使用.dev的域名 为什么?. 使用 .localhost, .invalid, .test, .example取代它。

现在跳转到用法部分

# 用法

开始阅读之前:

如果你使用的是 Docker Toolbox (VM), 请执行以下操作中的任意一个:

# 升级Mac/WindowsNative(推荐). 检查升级 Laradock
# 使用 Laradock v3.*. Visit the Laradock-ToolBox branch. (outdated)

我们推荐使用比1.13更新的Docker版本

警告: 如果你使用旧版的laradock,强烈推荐你所使用的容器,你需要看怎样重新构建容器以尽量避免错误

# 1.进入laradock文件夹并复制env-example to .env
cp env-example .env

你可以编辑.env文件去选择你想在环境中安装的软件,你始终可以参考docker-compose.yml文件去看如何使用这些变量。

根据主机的操作系统,您可能需要更改给定的值 COMPOSE_FILE的值, 当你在MacOS上运行laradock时要使用的文件分隔符是:, 当你在Windows环境上运行laradock时,必须使用 ;来作为多个文件的分隔符。

这里需要对配置针对性修改一下

# 如果您需要更改源(即中国),请将CHANGE_SOURCE 设置为true
CHANGE_SOURCE=true
# mysql 默认使用的是 latest 最新版本,我这里设置成 5.7 是为了兼容
MYSQL_VERSION=5.7

# composer 全局安装,建议开启
WORKSPACE_COMPOSER_GLOBAL_INSTALL=true 
# composer 中国镜像,如果使用 composer 一定要配置
WORKSPACE_COMPOSER_REPO_PACKAGIST=https://mirrors.aliyun.com/composer
# npm 的淘宝镜像
WORKSPACE_NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node
# 是否安装 node 根据需求,可选(安装它可能导致,一直安装不上)
WORKSPACE_INSTALL_NODE=true
# node 版本
WORKSPACE_NODE_VERSION=node
# npm 淘宝镜像
WORKSPACE_NPM_REGISTRY=https://registry.npm.taobao.org
# 安装 pnpm 
WORKSPACE_INSTALL_PNPM=false
# 安装 yarn ,根据需求可选
WORKSPACE_INSTALL_YARN=true
# 安装最新版 yarn
WORKSPACE_YARN_VERSION=latest
# 安装 npm gulp 压缩工具,默认安装(安装它可能导致,一直安装不上)
WORKSPACE_INSTALL_NPM_GULP=true
WORKSPACE_INSTALL_NPM_BOWER=false
WORKSPACE_INSTALL_NPM_VUE_CLI=true
WORKSPACE_INSTALL_NPM_ANGULAR_CLI=false
# 2.运行docker-compose来构建环境

在这个例子中我们将看到如何运行Nginx(web服务器)和MySQL(数据库引擎)来托管一个PHP脚本

docker-compose up -d nginx mysql

注意: 大多数情况下 workspacephp-fpm 会自动运行, 所以不需要再up命令中指定它们, 如果你找不到他们,那么你需要这样指定它们: docker-compose up -d nginx php-fpm mysql workspace

你可以从这个列表中选择自己的容器组合

(请注意,有时我们忘记更新文档,请检查docker-compose.yml文件以查看所有可用容器的更新列表)

# 3.进入Workspace容器, 执行比如(Artisan, Composer, PHPUnit, Gulp, ...)等命令
docker-compose exec workspace bash

另外, 针对 Windows PowerShell 用户: 执行以下命令以进入任何正在运行的容器:

docker exec -it {workspace-container-id} bash

注意: 你可以添加--user=laradock来创建主机的用户. 比如:

docker-compose exec --user=laradock workspace bash

您可以从.env文件中更改PUID (用户标识) 和 PGID (组标识) 变量

# 4.更新您的项目配置以使用数据库主机

打开你PHP项目的.env文件或者你正在读取的配置文件, 并将数据库配置DB_HOST设置为mysql:

DB_HOST=mysql

如果你想将laravel安装为PHP项目, 请参阅 如和在Docker容器中安装laravel.

# 5.打开浏览器并访问您的本地主机地址http://localhost/, 如果你按照多个项目设置,你可以访问 http://project-1.test/http://project-2.test/