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 管理会比较方便,接下来研究下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容