大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

Ubuntu18.10中使用Docker搭建LNMP环境-多容器基础版

docker

使用命令行逐个搭建的,因为觉得这样搞一遍对于新手来说更有助于理解。
最好到 [ docker hub ] 注册一个账号,里边可以查看都有哪些镜像可以使用,也能把自己的镜像存过去。

另外,这里还是有几个坑需要注意一下:

  • 挂载文件夹的创建:也就是执行 docker run -v /xxx:/xxx 这种命令的时候,如果宿主机并没有创建这些文件夹,那么执行后文件夹也会被创建,但是属于 root ,需要改下用户 chown -R wu.wu www

  • 挂载文件夹:文件夹挂载后宿主机的目录也就和容器的目录关联到了一起,但是如果 php 和 nginx 挂载目录不一致时会遇到 404 或者下载 php 文件等一系列错误。改正方法是把 nginx 和 php 文件夹挂载成一样的,或者在 nginx 的配置中,把 fastcgi_param SCRIPT_FILENAME *****$fastcgi_script_name; 中*****的地方改成 php 的挂载目录。比如创建 php 容器时,运行 -v ~/www/web:/var/www/html ,那么 nginx 中 ***** 的地址应该是 /var/www/html/,然后配置 laravel 时需要把两个地址都加上 laravel/public/

  • composer 的安装:composer是需要 php 支持的,如果宿主机没有 php 环境,就需要使用 composer 镜像来处理,或者在 php 的容器内安装。

  • 7 .* 版本的 php 是没有 pdo_mysql 驱动的,需要手动装。

  • laravel 的 artisan 创建出来的文件权限也是属于 root 的,解决办法待研究。

  • laravel 配置中的 mysql host 要填写 mysql 的容器名称,否则会无法连接。具体报错如下:


127.0.0.1:  could not find driver 
localhost:  no such file


docker 安装

进入系统后,打开终端执行下 docker,然后根据返回信息安装。
不是最新版,不过也没关系,只差几个小版本号。

Command 'docker' not found, but can be installed with:

sudo snap install docker     # version 18.06.1-ce, or
sudo apt  install docker.io

See 'snap info docker' for additional versions.


docker.io 是没有 docker-compose 的,不方便接下来的学习,而且单独安装后版本跟 docker 也对不上,所以还是直接安装第一个吧。

介意的去这里下载。

在 ubuntu 系统中,docker 被添加了 masked,也就是被禁止建立启动链接。
所以安装完成后不需要启动,直接执行下 docker --version 看看是否安装成功。


wu@ubuntu:~$ docker --version
Docker version 18.06.1-ce, build e68fc7a

非 root 用户使用 docker

docker 安装后,很多命令需要 root 用户才能执行,太烦,看到官网有说明,所以放心改。

官网截图

sudo groupadd docker
sudo usermod -aG docker $USER
reboot


准备工作

在 home/用户名/ 文件夹下创建以下文件夹和内容:


wu@ubuntu:~/www
├── data
├── nginx
│   └── conf.d
│       └── default.conf
└── web
    ├── index.html
    └── index.php

这几个文件夹要做挂载用,然后 nginx 的 default.conf 内容如下:


server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        try_files $uri $uri/ /index.php?$query_string; #添加伪静态支持
        index  index.php  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
    fastcgi_pass   php-fpm-7-3:9000;  #php 地址直接填容器名
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
        include        fastcgi_params;
    }
}


mysql 安装

下载 mysql 5.7 镜像,然后进入容器配置下远程访问权限。


docker pull mysql:5.7
docker run --name mysql-5-7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d -v ~/www/data:/var/lib/mysql mysql:5.7

docker exec -it mysql-5-7 bash
mysql -uroot -p
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;
exit

php 安装

下载 php-fpm:7.3 和 扩展程序。


docker pull php:7.3-fpm 
docker run --name php-fpm-7-3 -d -v ~/www/web:/var/www/html --link mysql-5-7:mysql php:7.3-fpm 


#进入 php 容器后执行安装 mysql 扩展
docker exec -it php-fpm-7-3 bash
apt-get update 
apt-get install -y libfreetype6 libfreetype6-dev libmcrypt-dev libmcrypt4 libcurl3-dev
apt install build-essential libprotobuf-dev libboost-dev openssl protobuf-compiler
docker-php-ext-install pdo pdo_mysql 
docker restart php-fpm-7-3


nginx 安装


docker pull nginx
docker run -d --name nginx -p 80:80 -v ~/www/web/:/usr/share/nginx/html  -v ~/www/nginx/conf.d:/etc/nginx/conf.d  --link php-fpm-7-3:php-fpm nginx  

打开浏览器访问 localhost :


phpinfo

composer 安装

本地没有 php 就装不上 composer, 又不想进 php 容器去装,查了一圈资料也没个详细点的说明,还是用镜像吧。镜像唯二的缺点就是 命令太长不能更换 composer 源

获取 composer 镜像,然后挂载到本地目录创建 laravel 5.7 的新项目。


docker pull composer
docker run --rm -it  --volume ~/www/web:/app  composer create-project  laravel/laravel laravel 5.7
cd ~/www/web
sudo chown -R wu.wu laravel/
sudo chmod -R +777 laravel/storage 

加上 --rm ,每次运行完删掉容器避免堆积,反正这个容器也不能复用。
然后再修改 nginx 配个域名,加下 hosts,打开浏览器,完美。


image.png

artisan 使用

有了 composer 的经验,artisan 想必也是一个镜像。但是这里还是不挣扎了,没看明白到底怎么用……囧

为了顺利运行 artisan 和 migrate ,这里还需要做些配置:

datagrip

datagrip 是跟 PHPstorm 一家的数据库管理工具,snap 商店直接可以下载到最新版,下载后建立连接和新数据库:


datagrip

laravel 配置:

laravel 配置中,数据库连接的 host 应该填写 mysql 的容器名称,刚开始我在这里写 127.0.0.1 和 localhost 结果一直都在报错,改了以后顺利连接:


DB_CONNECTION=mysql
DB_HOST=mysql-5-7
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root

执行 artisan:


docker exec -it php-fpm-7-3 bash
cd /usr/share/nginx/html/laravel
php artisan make:auth #生成 laravel 的权限验证模块
php artisan migrate #生成权限模块数据表

创建 seeder:


php artisan make:seed UsersTableSeeder

在 run 方法中添加用户信息:
$user = new App\User;
$user->name = 'wu';
$user->email = 'yf-wu@qq.com';
$user->password = Hash::make('111111');
$user->save();

再去 DatabaseSeeder 中打开 run 中的注释,接着往下执行:
php artisan migrate
php artisan db:seed

seed 如果报错就执行下 dump-autoload

docker run --rm -it  --volume ~/www/web/laravel:/app  composer  dump-autoload
php artisan db:seed

刷新后可以看到数据表中已经有东西了,通过页面也能够登录成功。ok,到这里也就大功告成。


user
logged

结尾

多容器的手工搭建就先到这里吧,最后的 artisan 实在是太不方便,听说用 docker-compose 管理会比较方便,接下来研究下。