使用命令行逐个搭建的,因为觉得这样搞一遍对于新手来说更有助于理解。
最好到 [ 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 :
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,打开浏览器,完美。
artisan 使用
有了 composer 的经验,artisan 想必也是一个镜像。但是这里还是不挣扎了,没看明白到底怎么用……囧
为了顺利运行 artisan 和 migrate ,这里还需要做些配置:
datagrip
datagrip 是跟 PHPstorm 一家的数据库管理工具,snap 商店直接可以下载到最新版,下载后建立连接和新数据库:
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,到这里也就大功告成。
结尾
多容器的手工搭建就先到这里吧,最后的 artisan 实在是太不方便,听说用 docker-compose
管理会比较方便,接下来研究下。