centos7,docker版本搭建lnmp环境,部署laravel项目,解决大坑,新手教学

Posted 黄昏单车

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了centos7,docker版本搭建lnmp环境,部署laravel项目,解决大坑,新手教学相关的知识,希望对你有一定的参考价值。

1、安装mysql

//拉取镜像
docker pull mysql:5.7
//运行容器
docker run -d --name mysql-service -v ~/mysql/conf:/etc/mysql/conf.d -v 
~/mysql/logs:/logs -v ~/mysql/data:/var/run/mysqld -p 3306:3306 -e 
MYSQL_ROOT_PASSWORD=123456 mysql:5.7

# -d 容器后台守护形式运行 
# –name mysql-service 指定容器名称
# -v ~/mysql/conf:/etc/mysql/conf.d 挂载指定配置目录
# -v ~/mysql/logs:/logs 挂载指定日志目录
# -v ~/mysql/data:/var/run/mysqld 挂载指定sock文件目录,这个必不可少
# -e MYSQL_ROOT_PASSWORD=123456 初始化 root 用户的密码为 123456
# -p 3306:3306 将容器的 3306 端口映射到主机的 3306 端口

//查看运行的容器id
docker ps

//进入容器
docker exec -it e6075befb022[容器id] /bin/bash

//登入mysql
mysql -h localhost -u root -p (回车输入密码123456即可)

//使用mysql库
use mysql;

#mysql5.7及以下版本命令
//创建远程登录用户
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

#mysql8版本命令
//创建远程登录用户
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
//设置允许查看数据库权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

#ALL PRIVILEGES:当前用户的所有权限
#第一个*是数据库,可以改成允许访问的数据库名称
#第二个*是数据库的表名称,代表允许访问任意的表
#‘root’@’%’:创建root用户,%代表任意ip连接,可以写成允许的ip
#IDENTIFIED BY ‘root’ 创建root用户的连接密码
#WITH GRANT OPTION:允许级联赋权
//刷新权限
flush privileges;
#连接之后创建laravel数据库,创建一个用户表,以待后面使用

# 清空命令行
system clear
sytem reset


2、安装php

//拉取镜像
docker pull php:7.3-fpm
//运行容器
docker run -d --name myphp-fpm -v ~/nginx/www:/www -v ~/mysql/data:/var/run/mysqld --link mysql-service:mysql php:7.3-fpm
# -d 容器后台守护形式运行 
# –name myphp-fpm 指定容器名称
# -v ~/nginx/www:/www 挂载指定php访问目录
# -v ~/mysql/data:/var/run/mysqld 挂载指定sock目录,跟上面的mysql对应,必不可少,否则访问不了mysql的mysqld.sock文件,导致连接mysql错误
# -e MYSQL_ROOT_PASSWORD=123456 初始化 root 用户的密码为 123456
# --link mysql-service:mysql 将 mysql 容器的网络并入 php 容器,实现容器间的通信
//查看容器id
docker ps
//进入容器
docker exec -it 59399784f201[容器id] bash
//安装vim,出现提示输入y,回车即可
apt-get update && apt-get install vim
//安装pdo_mysql
docker-php-ext-install pdo pdo_mysql
//复制一份php.ini文件
cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
//进入编辑
vim /usr/local/etc/php/php.ini
//修改sock文件指定路径,shift+zz保存
pdo_mysql.default=/var/run/mysqld/mysqld.sock
//退出容器
ctrl + p + q
//重启容器
docker restart 59399784f201

3、安装Nginx

//拉取容器
docker pull nginx
//运行容器
docker run --name nginx-php -p 8080:80 \\
-v ~/nginx/www:/usr/share/nginx/html:ro \\
-v ~/nginx/conf:/etc/nginx/conf.d:ro \\
-d --link myphp-fpm:php nginx
# -p 8083:80: 端口映射,把 nginx 中的 80 映射到本地的 8083 端口。
# ~/nginx/www: 是本地 html 文件的存储目录,~/nginx/html 是容器内 html 文件的存储目录。
# ~/nginx/conf/: 是本地 nginx 配置文件的存储目录,/etc/nginx/conf.d 是容器内 nginx 配置文件的存储目录
# --link myphp-fpm:php: 把 myphp-fpm 的网络并入 nginx,并通过修改 nginx 的 /etc/hosts,把域名 php 映射成 127.0.0.1,让 nginx 通过 php:9000 访问 php-fpm。
//在/usr/share/nginx/conf/目录下创建nginx配置文件
vim ~/nginx/conf/nginx-php.conf
//加入下面代码

server 
    listen       80;
    server_name  192.168.1.107;

    location / 
        root   /usr/share/nginx/html;
        index  index.html index.htm index.php;
    

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

    location ~ \\.php$ 
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /www/$fastcgi_script_name;
        include        fastcgi_params;
    


//在 ~/nginx/www 目录下创建 index.php,访问如下:
<?php
	echo phpinfo();
?>


部署laravel项目

//拉取composer镜像
docker pull composer
//下载laravel项目,这里会把项目下载到~/nginx/www
docker run -it --name composer -v ~/nginx/www:/app --privileged=true \\
composer composer create-project --prefer-dist laravel/laravel laravel
//修改上面的配置文件
vim ~/nginx/conf/nginx-php.conf
#nginx配置访问路径改到/usr/share/nginx/html/laravel/public
#由于共享数据,所以nginx容器是有laravel项目的
#php默认访问目录以这里的/www/$fastcgi_script_name为根目录
#如果不改的话,系统默认找文件会以www为起点找文件,结果会找不到
#有兴趣的可以试下,这个问题我自己搞了两天了

server 
    listen       80;
    server_name  192.168.1.107;

    location / 
        root   /usr/share/nginx/html/laravel/public;
        index  index.html index.htm index.php;
    

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

    location ~ \\.php$ 
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /www/laravel/public/$fastcgi_script_name;
        include        fastcgi_params;
    

//查看运行的nginx容器id
docker ps
//重启nginx容器
docker restart 2304b231470d[容器id]
//访问会出现下面图问题,只需要执行下面命令设置下权限即可,刷新即可看到laravel欢迎界面
chmod -R 777 www/laravel/storage


测试连接使用mysql

//修改.env配置文件,相关mysql连接参数
DB_HOST=mysql-service	这个填上面mysql容器的名称
DB_PORT=3306
DB_DATABASE=laravel		上面创建好的数据库
DB_USERNAME=root
DB_PASSWORD=root
//编辑routes/web.php文件,查询数据
Route::get('/', function () 
    return DB::table('users')->get();
);

laravel项目访问正常过程中报错解决

1、缺少pdo扩展

//编辑laravel/public目录下的index.php,刷新并查看,ctrl+f搜索pdo_mysql,现在搜索是搜不到的
echo phpinfo();exit;
//进入php容器
docker exec -it 9beb60dcf821 bash
//安装mysql pdo
docker-php-ext-install pdo pdo_mysql
//安装好pdo_mysql,重启php容器,并刷新页面,再次搜索pdo_mysql即可搜到
docker restart cb986f6520f3


2、mysql连接相关配置

DB_HOST=mysql-service	这个填上面mysql容器的名称
DB_PORT=3306
DB_DATABASE=laravel		上面创建好的数据库
DB_USERNAME=root
DB_PASSWORD=root


3、mysql容器自动停止问题

#原因:目录拥有者不一样导致的
# /var/run/mysqld属于mysql用户组,而在宿主机上,~/mysql/data目录却属于root用户组
//查看容器中/var/lib/mysql的所有者,可以看到mysql属于mysql用户组
docker run -ti --rm --entrypoint="/bin/bash" mysql:5.7 -c "ls -la /var/lib/mysql"
//查出来容器里的mysql用户组id
docker run -ti --rm --entrypoint="/bin/bash" mysql:5.7 -c "cat /etc/group"
//修改用户组权限
chown -R 999 ~/mysql/data

ps:整个过程花费了两个星期左右的时间吧,痛并快乐着,如果有不懂的,留言给我,我会及时回复的

以上是关于centos7,docker版本搭建lnmp环境,部署laravel项目,解决大坑,新手教学的主要内容,如果未能解决你的问题,请参考以下文章

一、Centos7 docker 环境搭建

docker搭建lnmp环境

如何搭建 LNMP环境

centos怎么搭建lnmp环境

腾讯云手动搭建LNMP环境(CentOS 7)

window 10系统 在docker里搭建lnmp环境