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, orsudo 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 $USERreboot
准备工作
在 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.7docker run --name mysql-5-7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d -v ~/www/data:/var/lib/mysql mysql:5.7docker 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.7cd ~/www/websudo 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 bashcd /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
管理会比较方便,接下来研究下。
作者:南瓜方糖
链接:https://www.jianshu.com/p/4f3a3fa7bc2e
共同学习,写下你的评论
评论加载中...
作者其他优质文章