laradock 部署laravel php

637 阅读3分钟

1.安装

# cd /usr/local/docker_compose/
#创建文件夹
mkdir myworkspace && cd myworkspace
#下载通用配置
git clone https://github.com/laradock/laradock.git

2.文件结构说明

关键文件

  1. .env 用于系统的所有环境配置,包括对外映射
  2. workspace容器 所有环境命令执行与安装的总入口。
  3. nginx,php-fpm ,mysql 执行php需要的环境

image.png

image.png

3.修改.env

cd laradock
# 复制demo配置
cp .env-example .env 
# vim 
# 往上跳一级,在myworkspace目录下
APP_CODE_PATH_HOST=../

#实际nginx 和 php用到的路径 是相对路径,要加上上面的APP_CODE_PATH_HOST
APP_CODE_PATH_CONTAINER=/var/www

#改数据库版本
- MYSQL_VERSION=latest
+ MYSQL_VERSION=5.7

# 存放数据的目录 
- DATA_PATH_HOST=~/.laradock/data
+ DATA_PATH_HOST=./data

4.执行构建 启动

  1. 建议分开多个远程执行,提供下载速度
docker-compose build nginx
docker-compose build php-fpm
docker-compose build workspace
  1. 直接up 启动+构建
docker-compose up -d nginx mysql redis
# 注意 不要直接 不跟具体的镜像启动,会导致下载所有项目的images

执行中安装下载的问题

参考官方说明 github.com/laradock/la…

1.修改源

# 打开.env 文件
vi .env 
# 开启�ubuntu国内源
CHANGE_SOURCE=true
# composer镜像源
WORKSPACE_COMPOSER_REPO_PACKAGIST=https://mirrors.aliyun.com/composer/
# nvm镜像源
WORKSPACE_NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
# npm镜像源
WORKSPACE_NPM_REGISTRY=https://registry.npmmirror.com 


#  workspace 下载慢
#在 laradock\php-fpm\Dockerfile  RUN 和 apt-get update 中间加入
RUN set -xe; \

find /etc/apt/sources.list.d/ -type f -name "ondrej-ubuntu-php-xenial.list" -exec  sed  -i.bak -r  's#deb(-src)?\s*http(s)?://ppa.launchpad.net#deb\1 https\2://launchpad.proxy.ustclug.org#ig' {} \; && \

apt-get update -yqq && \

2.nvm下载不了

workspace 的 Dockerfile 修改

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
改为
curl -o- https://gitee.com/zhushaolong/zhubook/raw/master/install.sh | bash

5.本地项目上传配置与修改nginx配置

1.本地

cd /usr/local/docker_compose/myworkspace/
# 上传自己的项目如 myproject 到myworkspace
cp -r ./myproject  /usr/local/docker_compose/myworkspace/

2.容器composer 创建测试项目

# 进入工作空间容器
docker-compose exec workspace bash
# 路径默认在 /var/www/

# 修改源
composer config -g repo.packagist composer https://mirrors.cloud.tencent.com/composer/
# 创建项目
composer create-project laravel/laravel demo
# 安装库
composer install
# 如果提示错误 You can also run `php --ini`..  you can run Composer with `--ignore-platform-req=ext-mcrypt` 
composer install --ignore-platform-req=ext-mcrypt #忽略错误

# 生成秘钥
php artisan key:generate # 生成后 .env会自动修改 APP_KEY=base64:OSCiRdGmmeZRDFqlX6D5XdCDbyhRjd4bULF5y8oiGbg=
# 调整app.php里的 key
cd config
vim app.php
'key' => env('APP_KEY'), # APP_KEY改成 生成的key

建议优先修改 .env 中的APP_KEY

composer和 前端node的 npm很类似,也有composer.json,也会下载依赖的库文件放在vendor

composer.json

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.6.4",
        "barryvdh/laravel-cors": "^0.9.2",
        "intervention/image": "^2.3",
        "laravel/framework": "5.4.*",
        "laravel/tinker": "~1.0",
        "mews/captcha": "^2.1",
        "overtrue/laravel-ueditor": "~1.0",
        "qiniu/php-sdk": "^7.1"
    },
    "require-dev": {
        "fzaninotto/faker": "~1.4",
        "mockery/mockery": "0.9.*",
        "phpunit/phpunit": "~5.7"
    },
    "autoload": {
        "classmap": [
            "database",
            "vendor/phptree/PhpTree.php",
            "vendor/verify/Verify.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "post-root-package-install": [
            "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ],
        "post-install-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postInstall",
            "php artisan optimize"
        ],
        "post-update-cmd": [
            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
            "php artisan optimize"
        ]
    },
    "config": {
        "preferred-install": "dist",
        "sort-packages": true
    }
}


vendor生成文件 image.png

6.配置nginx 与相关配置

cd laradock/nginx/sites 
cp laravel.conf.example laravel.conf

laravel.conf

#server {
#    listen 80;
#    server_name laravel.com.co;
#    return 301 https://laravel.com.co$request_uri;
#}

server {

    listen 80;
    listen [::]:80;

    # For https
    # listen 443 ssl;
    # listen [::]:443 ssl ipv6only=on;
    # ssl_certificate /etc/nginx/ssl/default.crt;
    # ssl_certificate_key /etc/nginx/ssl/default.key;

    server_name laravel.test;
    root /var/www/myproject/public; # 主要是修改这里 laravel -> myproject
    index index.php index.html index.htm;

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

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
        log_not_found off;
    }

    error_log /var/log/nginx/laravel_error.log;
    access_log /var/log/nginx/laravel_access.log;
}

修改.env的 mysql 与 redis

redis

REDIS_CLIENT=predis
REDIS_HOST=redis   # 改为link方式
REDIS_PASSWORD=null
REDIS_PORT=6379 

mysql


MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root

8. php打开错误提示 查看配置

数据库连接注意:

默认读取的是.env 里面的配置,不是config/database.php 里面的配置

laravel 打开配置 debug 提示

也是在 .env 中的 APP_DEBUG=true ,不在config/app.php

laravel项目

一般在所在项目的storage/logs、/error.log

普通php项目

修改 php.ini 一般在 /usr/local/php/etc/php.ini 或者 /usr/local/etc/php/php.ini

  1. error_reporting  =  E_ALL    #将会向PHP报告发生的每个错误
  2. display_errors = On  #满足上面条件会显示log
  3. log_errors = On    #开启错误日志
  4. log_errors_max_len = 1024    #设置每个日志项的最大长度
  5. error_log =/usr/local/error.log    #指定产生的 错误报告写入的日志文件位置

查看配置

上传test.php 到public文件夹下

<?php

phpinfo();

访问 http://ip:端口/test.php 下拉会显示已经安装的插件

9.laravel场景异常

1. # Whoops, looks like something went wrong.返回500 ,无其他信息

需要给 storage文件夹开通读写权限

chmod -R 777 storage/

由于日志也在 storage/logs,此时查看日志

cd storage/logs/
tail -f 100 laravel.log 

2.local.ERROR: ErrorException: file_put_contents(...): failed to open stream: No such file or directory

local.ERROR: ErrorException: file_put_contents(/data/php/www/myproject/storage/framework/sessions/mx6z9D0ed1fB7JLoozRVIj9uJNP6e1OZCd1kOguk): failed to open stream: No such file or directory 

这是因为php有缓存机制,所以会直接读取上一次部署的/storage/framework/sessions/文件夹信息

使用命令清空即可

 docker exec -it laradock_workspace_1 bash
 # 进行项目根目录
 cd myproject 
# 清除config  
php artisan config:clear
# 非必要
php artisan cache:clear
php artisan config:cache

注意点

修改源

  • nginx 使用的是 Alpine Linux
  • php-fpm 使用的是 debian
  • workspace 使用的是ubuntu

重新构建

  • 如果你修改docker-compose.yml, .env 或者任何 dockerfile 文件, 你必须重新构建你的容器。

  • 可以单独构建修改对应的镜像

docker-compose build nginx

workspace权限问题,使用laradock用户

docker-compose exec --user=laradock workspace bash
php artisan migrate

nginx reload

docker-compose exec nginx nginx -t
docker-compose exec nginx nginx -s reload

其他

# 完全重新构建
docker-compose build --no-cache {container-name}
# 查看日志
docker-compose logs -f {container-name}

其他异常:

1.Whoops, looks like something went wrong.

第一步把config/app.php文件内'debug' => env('APP_DEBUG', false),改成'debug' => env('APP_DEBUG', true),

2.No supported encrypter found.The cipher

我们注意到No supported encrypter found.The cipher and / or key length are invalid.这句,所以我们把本地.env文件的APP_KEY值复制下来修改config/app.php内
'key' => env('APP_KEY','base64:R+8tyPpcbK6ELMheXa4D8hsxdVvXDilVUSFCFqaH8vY='),
这个APP_KEY也可通过php artisan key:generate生成;

3. 数据库异常

修改数据库配置config/database.php

4.当登录后台总管理员时没有问题,但是登录添加的管理员时又报错

缓存问题,修改config/cache.php文件,

default' => env('CACHE_DRIVER', 'file') 
改为
'default' => env('CACHE_DRIVER', 'array'),