Mac环境下Docker运行Laravel项目

Mac环境下Docker运行Laravel项目

      一直拖了好久,昨晚终于有时间开始尝试在自己的工作本部署运行Laravel项目,中间也遇到一些坑,网上也翻看了不少的资料,最终成功运行,并且尝试运行多站点,最终也成功,特意记录下来跟大家分享这个过程。

      一、拉取镜像

      在这里我暂时需要用到mysql、php、nginx,我们根据自己所需版本进行拉取

// 获取mysql镜像
docker pull mysql

// 获取php7.3镜像
docker pull php:7.3-fpm

// 拉取nginx镜像
docker pull nginx

因为Laravel项目对PHP最低要求是7.3,所以我特意指定版本,mysql跟nginx没有指定版本,按最新的拉取。

      二、准备项目代码

      本次要运行的laravel项目是公司的项目,我已经专门创建了一个目录用来存放,目前存放于/word下,大家根据自己项目代码存放目录而定,我在这个目录下放了两个项目,截图如下:

1.png

      三、创建运行容器

      创建3个容器:注意先后顺序,先mysql,再php,最后nginx

# 创建mysql容器
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
/*  参数解释:
-p:端口映射,映射容器的3306. 例如:3307:3306:将容器的3306端口映射到主机的3307端口 
-e:MYSQL_ROOT_PASSWORD=123456 初始化root用户的密码 
-it:运行交互式的容器,让docker运行的容器实现"对话"的能力 
-d:后台运行容器,并返回容器ID 
--name:命名容器
*/
--------------------------------------------------------
# 创建PHPfpm容器
docker run -d -v /word:/var/www/html -p 9000:9000 --link mysql-test:mysql --name dpp-php php:7.3-fpm
/*  参数解释:
-v 前面是主机的目录(刚刚我们准备的laravel项目目录):映射容器的目录,这里需要和nginx容器中一致
--link:挂上msyql。因为php需挂载mysql,所以mysql需要在php之前。
*/
--------------------------------------------------------
# 创建nginx容器
docker run -d -p 9191:80 --name dpp-nginx -v /Users/hongzhuangxian/nginx/conf/conf.d:/etc/nginx/conf.d -v /word:/var/www/html --link dpp-php:phpfpm --name dpp-nginx nginx
/*  参数解释:
-p:映射80端口,这里我映射了9191端口
-v:/word:/var/www/html  这个目录和php容器中一致。
-v /Users/hongzhuangxian/nginx/conf/conf.d:/etc/nginx/conf.d  映射nginx配置目录
--name:容器名
--link:跟PHP关联,所以nginx容器创建要在php容器创建之后。
*/

      四、PHP安装相关扩展 

# 进入到PHP容器 (可以用name也可以用容器id)
docker exec -it dpp-php /bin/bash

# php安装pdo_mysql,不走这一步,laravel会报 can not find driver 错误
docker-php-ext-install pdo_mysql(curl ...)

# 要安装php-redis的话,需要另外下载,执行下面这个命令就可以了,有问就no或者空格就好
pecl install redis && docker-php-ext-enable redis

# 安装后 php-m  发现就都有了哦

      五、配置nginx配置  

      我们在/Users/hongzhuangxian/nginx/conf/conf.d目录下创建一个default.conf文件,内容如下:

server {
    listen       80;
    server_name  dpp.test.com;

    #charset koi8-r;
   
    location / {
       root   /var/www/html/dpp/public;
       index  index.php index.html index.htm;

       # 如果没有以下4行,laravel将只能访问首页,其他页面都是404
       try_files $uri $uri/ /index.php?$query_string;
       if (!-e $request_filename){  
           rewrite ^/(.*) /index.php last;  
       }
       # 如果没有以上4行,laravel将只能访问首页,其他页面都是404

    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    # location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    # }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           /var/www/html/dpp/public;
        index          index.php index.html;
        # 坑在这里,需将原有的127.0.0.1:9000替换成phpfpm:9000
        fastcgi_pass   dpp-php:9000;      
        # 坑在这里,需将原有的127.0.0.1:9000替换成phpfpm:9000
        fastcgi_index  index.php;
        # 下面这行也改了  中间的$document_root
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

server {
    listen       80;
    server_name  portal.test.com;

    #charset koi8-r;
   
    location / {
       root   /var/www/html/portal/public;
       index  index.php index.html index.htm;

       # 如果没有以下4行,laravel将只能访问首页,其他页面都是404
       try_files $uri $uri/ /index.php?$query_string;
       if (!-e $request_filename){  
           rewrite ^/(.*) /index.php last;  
       }
       # 如果没有以上4行,laravel将只能访问首页,其他页面都是404

    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    # location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    # }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           /var/www/html/portal/public;
        index          index.php index.html;
        # 坑在这里,需将原有的127.0.0.1:9000替换成phpfpm:9000
        fastcgi_pass   dpp-php:9000;      
        # 坑在这里,需将原有的127.0.0.1:9000替换成phpfpm:9000
        fastcgi_index  index.php;
        # 下面这行也改了  中间的$document_root
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

保存之后退出,然后输入以下命令进入到nginx容器进行重启

docker exec -it dpp-nginx /bin/bash
nginx -s reload

      六,修改host文件

      由于我在nginx配置文件中使用了dpp.test.com跟portal.test.com来指向不同的项目,所以需要修改host文件,我们直接在终端输入以下命令

sudo vim /etc/hosts

往配置文件添加两条规则

127.0.0.1       portal.test.com
127.0.0.1       dpp.test.com

      七、运行检验效果

      完成以上操作后,我们直接浏览器分别输入以下地址看看是否成功

http://dpp.test.com:9191
http://portal.test.com:9191

如果成功运行项目就可以了。

0条评论

发表评论