好久沒寫東西,今天說一說怎麼自建一個 Laravel 執行的 Docker 環境。
市面上最出名的莫過於「laradock」https://github.com/laradock/laradock
Docker PHP development environment.
使用參考:http://laradock.io
既然是「自建」,那我們可以參考這個,最小化滿足 Laravel 執行的需要。
下面是我羅列出的基本條件:
- 軟體:PHP 7.2、Nginx、MySQL、Composer、NPM or Yarn 等等;
- 使用國內映象;使用國內映象;使用國內映象;
- 易於擴充套件使用,如隨時可以切換 PHP 版本,或者 Apache 和 Nginx 切換使用。
Docker-Compose
要達到可擴充套件行,和「laradock」一樣,使用 Docker-Compose 編排的方式,將核心的幾個 image 組裝在一起。
php-fpm
這裡我們使用的是「DaoCloud」加速映象 —— 7.2-fpm-alpine
。
該版本既用 PHP 7.2
版本,而且 alpine
最小化系統,可以基於此,安裝環境需要的額外工具:如,composer
、nodejs
、python
、yarn
等。
FROM daocloud.io/php:7.2-fpm-alpine
MAINTAINER coding01 <yemeishu@126.com>
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add --no-cache --virtual .build-deps \
$PHPIZE_DEPS \
curl-dev \
imagemagick-dev \
libtool \
libxml2-dev \
postgresql-dev \
sqlite-dev \
&& apk add --no-cache \
curl \
git \
imagemagick \
mysql-client \
postgresql-libs \
&& pecl install imagick \
&& docker-php-ext-enable imagick \
&& docker-php-ext-install \
curl \
iconv \
mbstring \
pdo \
pdo_mysql \
pdo_pgsql \
pdo_sqlite \
pcntl \
tokenizer \
xml \
zip \
&& curl -s https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer \
&& apk del -f .build-deps
# 修改 composer 為國內映象
RUN composer config -g repo.packagist composer https://packagist.laravel-china.org
# install prestissimo
RUN composer global require "hirak/prestissimo"
# install laravel envoy
RUN composer global require "laravel/envoy"
#install laravel installer
RUN composer global require "laravel/installer"
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk update && apk add -u nodejs libpng-dev python
ENV PATH /root/.yarn/bin:$PATH
RUN apk update \
&& apk add curl bash binutils tar \
&& rm -rf /var/cache/apk/* \
&& /bin/bash \
&& touch ~/.bashrc \
&& curl -o- -L https://yarnpkg.com/install.sh | bash \
&& yarn config set registry 'https://registry.npm.taobao.org' \
&& npm install -g cnpm --registry=https://registry.npm.taobao.org
WORKDIR /var/www
其中安裝 alpine
系統外掛,我們使用 mirrors.aliyun.com
阿里雲映象。
php:7.2-fpm-alpine
具體使用,可以參考:https://dashboard.daocloud.io/packages/019...
nginx
我們使用 nginx
,主要是將網站的配置檔案載入 nginx
中。
FROM daocloud.io/nginx:1.13-alpine
MAINTAINER coding01 <yemeishu@126.com>
ADD vhost.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www
剩下就是連線這些 images。最後看看 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"
- "REDIS_HOST=redis"
- "REDIS_PORT=6379"
# The Web Server
web:
build:
context: ./
dockerfile: web.dockerfile
working_dir: /var/www
volumes_from:
- app
ports:
- 8080:80
# The Database
database:
image: daocloud.io/mysql:5.7.4
volumes:
- dbdata:/var/lib/mysql
environment:
- "MYSQL_DATABASE=homestead"
- "MYSQL_USER=homestead"
- "MYSQL_PASSWORD=secret"
- "MYSQL_ROOT_PASSWORD=secret"
ports:
- "3306:3306"
redis:
image: daocloud.io/library/redis:4.0.10-alpine
command: redis-server --appendonly yes
volumes:
dbdata:
測試一遍
建立 Laravel 專案
composer create-project laravel/laravel demo
注:為了做測試,可以將 vendor
資料夾和 composer.lock
檔案刪除。
git clone
在 demo
專案相同資料夾下,git clone
我們自建的「laraveldocker」:
git clone https://github.com/fanly/laraveldocker.git
修改 docker-compose.yml
將 docker-compose.yml
檔案的路徑執行我們的專案:
app:
build:
context: ./
dockerfile: app.dockerfile
working_dir: /var/www
volumes:
- ../:/var/www
build
在 laraveldocker
下執行構建命令:
docker-compose up
整個速度還是蠻快的
接下來進入容器內
docker exec -it de075c525528 bash
我們看看安裝外掛的效果:
使用的是 https://packagist.laravel-china.org
國內映象。
注:該映象是由 Laravel China 社群聯合 又拍雲 與 優帆遠揚 共同合作推出的公益專案,旨在為廣大 PHP 使用者提供穩定和高速的 Composer 國內映象服務。
值得推薦使用
使用 yarn
或者 cnpm
安裝外掛:
生成 Laravel key secret
:
cp .env.example .env
php artisan key:generate
Application key [base64:4A7VK6MEX7FakPLDSLji97kz/nyWUAWhW4wYn3gefsY=] set successfully.
執行下看看效果吧:
我們接下來看看資料庫連線吧,修改 .env
:
DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
我們使用 php artisan make:auth
來生成佈局、註冊和登入檢視以及所有的認證介面的路由。同時它還會生成 HomeController
來處理應用的登入請求。使用 php artisan migrate
來載入資料。
我們看看資料表:
至此,說明我們連線 MySQL
資料庫 OK.
總結
在學習過程中,使用別人做好的 Dockerfile,雖可以直接拿來使用,但如果能自給自足,那最好不過了。
通過自建 docker 開發環境過程中,也能讓自己學到更多。接下來還會不斷完善,最小化滿足開發需要。
程式碼已放在 github
上,歡迎參考和提出 issue
:
最後也可以看之前對 「Laradock」的使用文章:
本作品採用《CC 協議》,轉載必須註明作者和本文連結