本篇承接 使用 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';
注意以下几点:
*.*
表示对所有数据库的所有表都具有权限;%
表示不限制连接的主机 IP,为了安全起见,这里可以把%
改为php
。注意,这里的php
其实相当于一个域名,Docker 的内置 DNS 会将其解析为 PHP 容器的地址;修改 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
DB_HOST=database
中的database
同样是指数据库容器,相当于 Docker 内部 DNS 的一个标识(该标识由docker-compose.yml
进行设置)。DB_DATABASE=database_name
为该项目所用的数据库名;DB_USERNAME=remote
和DB_PASSWORD=remote
为之前设置的可以进行远程连接的数据库用户;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。