在 Docker 中运行 Laravel 项目

本篇承接 使用 Docker 构建 LNMP 环境,介绍如何在该文所用的容器中运行 Laravel 项目。主要步骤为:转移 Laravel 项目到数据卷 => 配置数据库 => 配置 Nginx => 配置 Laravel 的 .env 文件。

布置 Laravel 项目

由于我们将 Git、Composer 等工具统一管理于 Console 容器,所以,首先需要进入这一容器。当然,在这之前,要确保容器已经启动,在 docker-compose.yml 所在路径下执行:

docker-compose up -d

然后查看容器是否启动以及启动后的名字:

docker ps

之后进入 Console 容器,注意替换容器名字:

docker exec -it $console_container_name bash

接下来,可以通过 Composer 新建一个 Laravel 项目,也可以将本地已经完成的项目通过 Git 同步到服务器中。

注意,由于我们在 docker-compose.yml 中对数据卷进行了配置,因而项目文件的路径需要放置于 apps/ 目录之下,该目录会在执行 docker-compose up -d 之后生成在 .yml 文件的同级目录中。

接下来可以新建一个 Laravel 项目或是通过 Git 转移项目。

安装 Laravel

执行:

composer create-project laravel/laravel=5.4 $project_name --prefer-dist

可以按照需要更换版本和项目名。

从 Git 上同步项目

一般服务器中运行的项目都是在本地开发完成后同步上去的。可以通过在本地添加远程 Git 地址后 push 到服务器中,也可以通过克隆的方式从代码仓库(Github、Coding.net 等)中得到项目。

git clone ${your_project_address}

Install

为了保证 Laravel 项目中 vendor 的版本与本地完全一致,需要在 Laravel 项目下执行:

composer install

这一步会根据 composer.lock 文件中记录的版本号进行安装。

生成 .env 文件

.env 文件含有项目所需的配置以及用于加密解密的随机字符串。为了安全,一般不会将该文件与本地同步。但会保留一个 .env.example 作为副本,此时我们需要先复制一份该文件并命名为 .env

cp .env.example .env

然后生成随机字符串,该字符串会自动写入 .env 文件中:

php artisan key:generate

修改权限

部分 Laravel 文件夹需要更多的权限,执行:

chmod -R 777 storage
chmod -R 777 bootstrap/cache

注意,这些路径均是相对于 Laravel 项目而言。

数据库配置

基本配置

执行 exit; 从 Console 容器中退出,然后进入数据库容器,同样注意容器名字:

docker exec -it $database_container_name bash

根据 docker-compose.yml 中的设置,通过 root 进入数据库服务:

mysql -uroot -proot

由于多个 Docker 容器间的关系类似于依赖网络进行连接的主机,要想通过 PHP 容器中的脚本访问 MySQL 容器的数据库服务,需要具有远程连接的数据库用户,执行以下命令进行创建:

GRANT ALL PRIVILEGES ON *.* TO username@'%' IDENTIFIED BY 'password';

注意以下几点:

  1. *.* 表示对所有数据库的所有表都具有权限;

  2. % 表示不限制连接的主机 IP,为了安全起见,这里可以把 % 改为 php。注意,这里的 php 其实相当于一个域名,Docker 的内置 DNS 会将其解析为 PHP 容器的地址;

  3. 修改 username 和 password 为自定义的用户名和密码。

远程连接

若想要在本地(非 Docker 宿主机)连接到数据库容器,需要利用端口映射,将数据库 Docker 的 3306 端口映射到主机的某个端口(如:12345),然后在本地通过访问服务器的 $server_ip:12345 并附带具有远程访问权限的用户名和密码进行远程连接(注意 % 的问题)。

在本文所用的 docker-compose.yml 中已经默认打开了 3306:3306 的端口映射,大家可以根据需要进行设置。

创建数据库

通过以下方式创建一个数据库并设置字符集:

CREATE DATABASE `database_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

执行 SQL 文件

我们可以把本地的数据库导出为 .sql 文件,然后在上传到数据库容器中并执行,首先在本地将 SQL 文件上传到宿主服务器:

scp xxx.sql root@your_server_ip:/

然后在宿主服务器中将该文件转移到数据库容器中的共享数据卷中,执行:

mv /xxx.sql path/to/docker-compose.yml/database

最后进入数据库容器并进入 MySQL 数据库服务,执行:

source /path/to/xxx.sql

Nginx 虚拟主机配置

由于 Laravel 的请求依赖重写规则,在 Nginx 服务器中需要使用虚拟主机,将某一域名映射到 Laravel 项目根目录以实现正确的请求重写(若为 Apache 则不需要)。

执行 exit; 退出上一个容器,然后进入 images/nginx/config 中,该路径相对于 docker-compose.yml 文件。

由于 Nginx 容器中 nginx.conf 的配置以及数据卷的设置,在该路径下的所有 *.conf 文件都会起到作用。下面我们新建一个 myweb.comf 文件,内容如下:

server{

    listen         80;
    server_name my.app.dev;
    root         /mnt/apps/laravel/public;
    index         index.php index.html index.htm;

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

    location ~ \.php$ {
        fastcgi_pass     php:9000;
        fastcgi_index     index.php;
        fastcgi_param     SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }

}

注意以下两行需要根据具体情况进行修改,其中 my.app.dev 为域名,laravel/public 部分要修改为 Laravel 的项目名。注意这里是 /mnt/apps/xxx,路径为 Nginx 服务器的项目路径,注意分清共享数据卷和配置文件的作用位置。:

server_name my.app.dev;
root         /mnt/apps/laravel/public;

Laravel 中 .env 文件配置

需要根据之前的配置修改 .env 文件,主要修改如下:

DB_HOST=database
DB_DATABASE=database_name
DB_USERNAME=remote
DB_PASSWORD=remote
  1. DB_HOST=database 中的 database 同样是指数据库容器,相当于 Docker 内部 DNS 的一个标识(该标识由 docker-compose.yml 进行设置)。

  2. DB_DATABASE=database_name 为该项目所用的数据库名;

  3. DB_USERNAME=remoteDB_PASSWORD=remote 为之前设置的可以进行远程连接的数据库用户;

参考

  1. MySQL 下执行 sql 脚本 – 博客园

  2. MySQL 创建数据库指定字符集 – 163 博客

  3. MySQL 开启远程连接

  4. Linux 查看服务器开放的端口号 – 博客园

  5. 上传文件到远程服务器 – CSDN

    原文作者:dailybird
    原文地址: https://segmentfault.com/a/1190000009135383
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞