利用Docker搭建Laravel开发环境的完整步骤

前言

在这篇文章中我们将通过Docker在个人本地电脑上构建一个快速、轻量级、不依赖本地电脑所安装的任何开发套件的可复制的Laravel和Vue项目的开发环境(开发环境的所有依赖都安装在Docker构建容器里),加入Vue只是因为有的项目里会在Laravel项目中使用Vue做前后端分离开发,开发环境中需要安装前端开发需要的工具集,当然前后端也可以分成两个项目开发,这个话题不在本篇文章的讨论范围内。

所以我们的目标是:

  • 不在本地安装Mamp/Wamp这样的软件
  • 不使用类似Vagrant这样的虚拟机
  • 不在本地电脑全局安装PHP开发所需要的工具集
  • 不在本地电脑全局安装前端开发所需要的工具集
  • 不在本地电脑全局安装Mysql和Nginx

开始前你需要先去安装一个Docker客户端,Docker的官网中有详细的安装方法。

第一步:获取Laravel的源码包

因为我们电脑上不安装Composer,所以就不能使用Composer来创建Laravel项目了, 这里我使用cURL直接从github上下载了最新的Laravel源码包,你也可以使用wget或者git clone 来获取源码包。

curl -L -O https://github.com/laravel/laravel/archive/v5.5.0.tar.gz /
&& tar -zxvf v5.5.0.tar.gz /
&& rm v5.5.0.tar.gz

上面的命令在curl下载完源码包后会解压源码压缩包,解压完成后在把源码压缩包v5.5.0.tar.gz删掉,执行完后你会看到一个laravel-5.5.0的项目目录。

第二步:添加docker-compose.yml

在项目中创建docker-compose.yml文件。

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。在这里我们会用到四个容器分别将PHP、Mysql、Nginx放在四个不同的容器中,通过compose将四个应用容器关联到一起组成项目。
编排文件的开头如下:

version: '2'
services:
  # our services will go here

在编排文件中,把每个容器叫做一个服务,services下定义整个应用中用到的所有服务(即容器)。

App服务

APP服务的容器将执行我们项目中的代码。

app:
 build:
  context: ./
  dockerfile: app.dockerfile
 working_dir: /var/www
 volumes:
  - ./:/var/www
 environment:
  - "DB_PORT=3306"
  - "DB_HOST=database"

Notes:

  • 我们使用app.dockerfile这个镜像文件来构建我们的App容器,在镜像文件中我们会对项目中用到的PHP模块镜像配置,也会额外安装NPM用来构建前端代码。
  • working_dir: /var/www把工作目录设置成了/var/www,在容器中项目代码将会被放在/var/www目录下面,包括使用docker exec app执行的命令也都是以/var/www为当前工作目录的。
  • volumes是容器内数据卷所挂载路径设置,在这里我们只定义一个数据卷,把宿主机项目目录挂到在容器中的/var/www上,这样我们在本地电脑对项目代码进行的更改就会马上同步到容器中去,反过来也是一样,容器中对代码做的更改也会及时反馈到本地电脑的项目中。
  • environment设置环境变量名,这里我们设置了DB_PORT和DB_HOST 这样就不用修改项目中的.env文件里关于这两项的值了,当然任何你需要在开发环境单独设置的环境变量都可以写到这里,Laravel读取配置使用的DotEnv会检测是否系统有指定环境变量的设置,有的话就不会在去读取.env文件了。

现在我们需要创建上面build环节中提到的app.dockerfile这个文件了,具体内容如下:

FROM php:7.1.22-fpm

# Update packages
RUN apt-get update

# Install PHP and composer dependencies
RUN apt-get install -qq git curl libmcrypt-dev libjpeg-dev libpng-dev libfreetype6-dev libbz2-dev

# Clear out the local repository of retrieved package files
# RUN apt-get clean

# Install needed extensions
# Here you can install any other extension that you need during the test and deployment process
RUN apt-get clean; docker-php-ext-install pdo pdo_mysql mcrypt zip gd pcntl opcache bcmath

# Installs Composer to easily manage your PHP dependencies.
RUN curl --silent --show-error https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Install Node
RUN apt-get update &&\
  apt-get install -y --no-install-recommends gnupg &&\
  curl -sL https://deb.nodesource.com/setup_10.x | bash - &&\
  apt-get update &&\
  apt-get install -y --no-install-recommends nodejs &&\
  npm config set registry https://registry.npm.taobao.org --global &&\
  npm install --global gulp-cli

CMD php-fpm

Notes:

  • 我在这里先将NPM和Composer装到了app容器中,因为在开发时经常需要执行他们,如果发布到生产环境,一般是使用单独的composer对项目代码进行构建而不是放在运行应用的容器里,容器的核心思想之一就是保持单一,这样才能做到快速增加相同角色的容器。

Web服务

接下来,我们需要配置一个Web服务器用,我们把这个容器在编排文件中命名成web

web:
 build:
  context: ./
  dockerfile: web.dockerfile
 working_dir: /var/www
 volumes_from:
  - app
 ports:
  - 8080:80

Notes:

  • volumes_from用来复用在app服务中定义的数据卷路径
  • 通过ports将本地电脑的8080端口映射到web容器的80端口,这样在开发环境中我们就不用设置hosts文件,直接通过IP加端口就能访问服务了。

Web服务器选用nginx,所以我们需要用一个nginx镜像文件来构建这个容器,在这之前我们需要在nginx镜像的基础上再设置一下项目中用到的vhost,所以我们需要一个web.dockerfile文件,它的定义如下:

FROM nginx:1.10

ADD vhost.conf /etc/nginx/conf.d/default.conf

根据镜像文件的定义,我们把项目中的vhost.conf复制到了容器的/etc/nginx/conf.d/default.conf中,这样基本的nginx配置就配置好了,vhost.conf中的定义如下:

server {
  listen 80;
  index index.php index.html;
  root /var/www/public;

  location / {
    try_files $uri /index.php?$args;
  }

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass app:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

Notes:

  • 因为是开发环境我们就只进行最简单的配置,不做调优考虑了。
  • fastcgi_pass app:9000; nginx将对PHP的请求通过fastcgi传递给了app服务的9000端口,docker-compose会自动把services中定义的容器服务连接起来,各个服务相互之间使用服务名称引用。

Mysql服务

接下来我们将配置Mysql服务,与上面两个服务有点不一样的是,在PHP-FPM和Nginx的容器中,我们配置本地电脑的文件可以同步到容器中供容器访问,这让我们开发时对文件作的更改能够快速的在容器中得到反馈加快我们的开发过程。但是在数据库容器中我们希望容器中创建的文件能够持久化(默认容器销毁时,容器内创建的文件也会被销毁),我们可以通过Docker的数据卷来实现上述功能,只不过这次不用再把本地电脑的文件挂在到数据卷上了,Docker客户端会管理创建的数据卷的在本地电脑上具体存储的位置。
下面是编排文件中对database服务的设置

version: '2'
services:

 database:
  image: mysql:5.7
  volumes:
   - dbdata:/var/lib/mysql
  environment:
   - "MYSQL_DATABASE=homestead"
   - "MYSQL_USER=homestead"
   - "MYSQL_PASSWORD=secret"
   - "MYSQL_ROOT_PASSWORD=secret"
  ports:
    - "33061:3306"

volumes:
 dbdata:

Notes:

  • 在文件的最下面我们通过volumes命令创建了一个名为dbdata的数据卷(dbdata后面的冒号是有意写上去的,这是YML文件的一个语法限制,不用太关心)
  • 定义完数据卷后,在上面我们使用<name>:<dir>的格式,通知Docker,将dbdata数据卷挂在到容器中的/var/lib/mysql目录上
  • environments中设置的是Mysql的docker镜像需要的四个必要参数。
  • ports端口映射中,我们将本地电脑的33061端口映射到容器的3306端口,这样我们就能通过电脑上的数据库工具连接到docker内的Mysql了。

将所有服务编排到一起

下面是完整的docker-compose.yml文件,通过编排文件我们将三个应用容器关联在一起组成了项目的服务端

version: '2'
services:

 # The Application
 app:
  build:
   context: ./
   dockerfile: app.dockerfile
  working_dir: /var/www
  volumes:
   - ./:/var/www
  environment:
   - "DB_PORT=3306"
   - "DB_HOST=database"

 # The Web Server
 web:
  build:
   context: ./
   dockerfile: web.dockerfile
  working_dir: /var/www
  volumes_from:
   - app
  ports:
   - 8080:80

 # The Database
 database:
  image: mysql:5.6
  volumes:
   - dbdata:/var/lib/mysql
  environment:
   - "MYSQL_DATABASE=homestead"
   - "MYSQL_USER=homestead"
   - "MYSQL_PASSWORD=secret"
   - "MYSQL_ROOT_PASSWORD=secret"
  ports:
    - "33061:3306"

volumes:
 dbdata:

启动服务

按照上面的步骤配置好编排文件还有指定的docker镜像文件后,我们就可以通过下面的命令启动服务了,执行完后会启动上面文件里定义的三个服务。

docker-compose up -d 

第一次启动时,由于docker客户端要下载上面提到的三个镜像并且构建服务所以启动速度会慢一些,等到下载完镜像并构建完成后,以后的启动都会非常快。

初始化Laravel项目

启动完服务后我们可以初始化Laravel项目了,步骤跟官方文档里介绍的一样,但是需要在启动的app服务的容器里执行:

docker-compose exec app composer install
docker-compose exec app npm install // 如果包含前端项目的话再执行相关命令
docker-compose exec app cp .env.example .env
docker-compose exec app php artisan key:generate
docker-compose exec app php artisan optimize
docker-compose exec app php artisan migrate --seed
docker-compose exec app php artisan make:controller MyController

Notes:

  • docker-compose exec 将命令发送到指定的容器中去执行
  • app是定义在docker-compose.yml中的一个服务,它是一个运行着php-fpm的容器
  • php artisan migrate 是要在容器里执行的命令

查看nginx日志的方法:

  • docker ps 找到nginx服务的container id
  • docker exec -it < contianer id > /bin/bash 进入nginx容器
  • nginx日志的具体路径请查看项目中的vhost.conf

执行完上面的命令后你就能通过http://127.0.0.1:8080/访问到项目啦。

在我的Github gist有一组参考文件方便同学们参考https://gist.github.com/kevinyan815/fa0760902d29f19a4213b4a16fe0501b

gist里的文件稍微旧一些,后来在使用的过程中又加入些新的PHP模块和Node,之前composer也单独放到了一个容器中,不过相信聪明的你看到这里应该已经会根据需求更改这些文件啦。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • Docker部署Laravel应用的实现示例

    本文 PHP 基础镜像使用:php:7.3-apache 本文 Laravel 版本为:laravel:5.8.* 队列和任务调度我们在下一篇写 一. 准备我们的 Laravel 应用 # 运行 mix 命令,打包 js.css.img 文件,如果没有用到 mix 这一步可以省略 npm install npm run production # 安装 composer.lock 中的依赖 composer install --ignore-platform-reqs --optimize-aut

  • 详解用Docker搭建Laravel和Vue项目的开发环境

    本文介绍了用Docker搭建Laravel和Vue项目的开发环境,分享给大家,具体如下: 在这篇文章中我们将通过Docker在个人本地电脑上构建一个快速.轻量级.不依赖本地电脑所安装的任何开发套件的可复制的Laravel和Vue项目的开发环境(开发环境的所有依赖都安装在Docker构建容器里),加入Vue只是因为有的项目里会在Laravel项目中使用Vue做前后端分离开发,开发环境中需要安装前端开发需要的工具集,当然前后端也可以分成两个项目开发,这个话题不在本篇文章的讨论范围内. 所以我们的目标

  • 使用 Docker 搭建 Laravel 本地环境的教程详解

    Laravel 官方提供 Homestead 和 Valet 作为本地开发环境,Homestead 是一个官方预封装的 Vagrant Box,也就是一个虚拟机,但是跟 docker 比,它占用体积太大,启动速度慢,同时响应速度很慢,现在有了 docker 这种更好的方式,可以轻松方便的搭建整套 PHP 开发环境. 本文就介绍如何使用 docker 搭建 Laravel 本地环境. 安装 docker 首先安装 docker. 克隆 laradock laradock 官方文档: http://

  • 使用Docker compose编排Laravel应用的方法

    前言 Laravel官方开发环境推荐的是Homestead(其实就是一个封装好的Vagrant box),我感觉这个比较重,于是自己用Docker compose编排了一套开发环境,在这里分享下. 环境要求 先要安装好Docker 和 Docker compose,而且Docker 仓库镜像最好换成国内的.一般地,我开发电脑上会运行一个Vagrant,然后再在里面运行Docker等应用. 主要思路 Docker官方推荐的是一个容器运行一个服务,所以会有Compose编排,各个服务间通过容器互联技

  • 详解如何用docker安装laravel开发环境

    看laravel框架的官方文档安装部分时,发现需要安装特别多软件,估计还有许多复杂的配置,官方推荐使用Laravel Homestead虚拟机进行安装,但是我想现在既然有 docker这么好的东西,为什么不用呢? Docker vs Vagrant 为什么使用Docker而不是Vagrant:从时间上来看,Vagrant提供虚拟机需要数分钟,而Docker只需数秒:此外,从体量上来看,Vagrant提供的是完整的虚拟机,而Docker提供的是轻量级的虚拟容器,这些虚拟容器共享同一个内核并且允许在

  • Docker部署Laravel应用实现队列&任务调度

    上一篇我们写了如何用 Docker 部署 Laravel 应用,然后这一篇我们写一下如何部署含有队列以及任务调度的 Laravel 应用. 一. 我们首先准备一下我们的 docker/app.cron 文件 注意一下,文件最后的空行是必须的. #!/usr/bin/env bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin * * * * * cd /var/www/html && php artis

  • 利用Docker搭建Laravel开发环境的完整步骤

    前言 在这篇文章中我们将通过Docker在个人本地电脑上构建一个快速.轻量级.不依赖本地电脑所安装的任何开发套件的可复制的Laravel和Vue项目的开发环境(开发环境的所有依赖都安装在Docker构建容器里),加入Vue只是因为有的项目里会在Laravel项目中使用Vue做前后端分离开发,开发环境中需要安装前端开发需要的工具集,当然前后端也可以分成两个项目开发,这个话题不在本篇文章的讨论范围内. 所以我们的目标是: 不在本地安装Mamp/Wamp这样的软件 不使用类似Vagrant这样的虚拟机

  • 利用Docker搭建本地https环境的完整步骤

    什么是 HTTPS 我们都知道 Web App 的运行都是建立在网络应用层 HTTP 协议的,HTTP 协议能够进行客户端和服务器之间的请求和返回.但是这个过程是明文传输的,当请求被抓包后传输内容很容易被篡改,这对用户的安全性来说是极其严重的威胁.PWA 应用出于安全性的考虑要求项目必须部署在 HTTPS 环境. 那么 HTTPS 是什么呢? HTTPS 是将 HTTP 置于 SSL/TLS 之上,其效果是加密 HTTP 流量( traffic ),包括请求的 URL.结果页面.cookies.

  • 利用docker搭建web服务环境的方法步骤

    前言 做过开发的人对开发环境的安装.配置应该都不会太陌生,不管你做什么开发,对开发环境都会具有一定的依赖性的.对于 PHP 的 Web 开发来说,开发环境至少要有一个 Web 服务器(如 Apache.Nginx).一个数据库服务器(如 MySQL)和一个 PHP 解析器吧,如果你的 PHP 代码使用的一些扩展,那你还需要给你的 PHP 安装上这些扩展,那样你的 PHP 代码才能够顺利地跑起来.对于一个只想静静地敲代码的开发人员来说,开发环境的安装与配置这种事情,只要经历一次就已经很折腾人了.可

  • 本地使用Docker搭建go开发环境的全过程

    目录 前言 安装 1.docker安装 2.go安装 3.配置 4.运行 5.完成 总结 前言 对于我这种小白来说,本地环境搭建常规的操作一向是直接去go官网下载go安装包,本机进行安装,然后配置相应的GOROOT和GOPATH,再将GOPROXY和GO111MODULE设置完成,本地跑一下go env,可以正常使用就OK了. 不过,自从学习了docker之后,被深深的套路了. 说一下用docker部署本地环境的好处: 可以保持系统软件环境的纯净.这一点对于喜欢折腾各种工具软件,然后把系统依赖环

  • Webpack 4.x搭建react开发环境的方法步骤

    本文介绍了了Webpack 4.x搭建react开发环境的方法步骤,分享给大家,也给自己留个笔记 必要依赖一览(npm install) 安装好. "dependencies": { "babel-core": "^6.26.3", "babel-loader": "^7.1.5", "babel-preset-env": "^1.7.0", "react&

  • VSCode搭建STM32开发环境的方法步骤

    目录 1.安装VScode 2.安装C/C++插件 3.安装Keil Assistant插件 4.用vscode打开keil工程 5.编译.下载程序 6.常用操作 官方简述 摘要: 作为一个51单片机或STM32单片机的使用者,keil一直是我们的必备的一款工具之一.但keil的一些问题也一直存在,当然也有人用其他的比如STM32CubeIDE.但是今天推荐的是VScode+Keil Assistant插件,不需要很复杂的配置各种文件和环境变量,只需要一个插件即可!可以编译代码和下载程序. 当我

  • Eclipse+ADT+Android SDK搭建安卓开发环境的实现步骤

    目录 运行环境 下载地址 环境下载 安装JDK 安装Eclipse 下载独立的Android SDK工具 ADT安卓开发工具安装 eclipse离线安装ADT插件 配置ADT插件 通过Android SDK Manage添加新的软件包 AVD Manage创建安卓虚拟机 运行环境 windows 7 下载地址 环境下载 最近开接触Android(安卓)嵌入式开发,首要问题是搭建Andoid开发环境,由于本人用的是windows7的笔记本,也就只能到Windows中搭建Android 开发环境了!

  • 利用docker-compose搭建AspNetCore开发环境

    使用docker-compose搭建AspNetCore开发环境 1 使用docker-compose搭建开发环境 我们的目标很简单:使用docker-compose把若干个docker容器组合起来就成了. 首先使用Nginx代理所有的Web程序,这样只需要在主机上监听一个端口就可以了,不污染主机.再组合各Web程序.Redis/Memcached.SqlServerOnLinux. 新建一个目录sites,所有和集群相关的都放在这里,目录结构如下所示 sites     nginx      

  • 利用Vscode进行Python开发环境配置的步骤

    前言 Vscode是是一个强大的跨平台工具,我自己电脑是mac,公司电脑是win而且是内部环境,导致公司安装软件很费劲.好在vscode许多插件能直接离线安装,省去了很多麻烦. Vscode用来写python其实并不算太友好,它不像Pycharm那样将所有事情都做好,你只需要敲代码就可以.初次使用Vscode可能会对一堆配置文件感到头大,其实仔细阅读官方设置文档,能解决大部分问题.但是官方文档也有说不清的地方,所以在此分享下我自己用Vscode配置Python开发环境的一些心得. 插件 首先,你

随机推荐