Docker 快速搭建 Lnmp 开发环境

头条 Sparkfly ⋅ 于 3周前 ⋅ 最后回复由 Sparkfly 5小时前 ⋅ 1122 阅读

分享链接:https://github.com/helingfeng/Docker-LNMP
使用Docker搭建一个简洁高效的LNMP开发环境

  • 支持多平台
  • PHP5 和 PHP7 同时支持
  • 支持 HTTPS 配置
  • 日志文件本地映射
  • 通过.env可以区分生产与测试环境

file

本文章首发在 Laravel China 社区
本帖已被设为精华帖!
本帖由系统于 2周前 自动加精
回复数量: 12
  • Sparkfly
    3周前

    Docker 快速搭建 Lnmp 开发环境

    只要你敢尝试一次,就再也不会拒绝它

    如何使用?

    1. 安装工具

    2. 下载代码

    $ git clone https://github.com/helingfeng/Docker-LNMP.git

    4. 启动服务

    $ cd Docker-LNMP
    $ docker-compose up -d

    第一次启用服务,需要下载并编译各种工具,请耐心等待一段时间

    demo

    表示成功启动服务

    5. 访问 Demo

    打开浏览器访问:

    demo

    问题与解答 ?

    1. workspace工作目录映射

    volumes:
          - ./www/:/var/www/html/:rw

    ./www/ 修改为你的 workspace 工作目录,注意 nginx php-fpm 两个应用都需要修改

    2. 多个项目系统,采用虚拟域名,如何相互之间访问

    php-fpm 应用添加 extra_hosts 指向 nginx 应用

    extra_hosts:
          - www.demo1.com:172.100.0.2

    这里的 172.100.0.2 表示 nginx 应用ip

    3. 如何切换php版本

    nginx 配置文件 .conf 选项 fastcgi_pass 参数定义

    fastcgi_pass   fpm56:9000;
    或者
    fastcgi_pass   fpm72:9000;
    

    4. PhpStorm 安装 xdebug 调试

    添加扩展

    php72 应用为例,首先需要修改 Dockerfile 文件,安装 xdebug 扩展;

    PECL extensions 安装说明可以在官网找到:
    https://hub.docker.com/_/php/

    RUN pecl install xdebug-2.6.0 \
        && docker-php-ext-enable xdebug

    重新构建 php72 镜像(删除镜像,启动docker-compose

    配置 xdebug

    修改 php72.ini 文件追加

    xdebug.auto_trace = on
    xdebug.default_enable = on
    xdebug.auto_profile = on
    xdebug.collect_params = on
    xdebug.collect_return = on
    xdebug.profiler_enable = on
    xdebug.remote_enable = on
    xdebug.remote_port = 9005
    xdebug.remote_handler = dbgp
    xdebug.remote_autostart = on
    xdebug.remote_connect_back = on
    ; 配置这个可以查看调试日志
    xdebug.remote_log = /var/log/php-fpm/xdebug_remote.log
    ;xdebug.trace_output_dir = "/var/log/php-fpm/xdebug/"
    ;xdebug.profiler_output_dir = "/var/log/php-fpm/xdebug/"
    xdebug.idekey = PHPSTORM
    配置 PhpStorm

    端口一致即可,上述我配置的是9005端口

    参看一下这个文档:https://www.jianshu.com/p/e9ad4c99d118

    开启调试,出现异常

    设置断点,点击开始调试时,并没有成功进入调试模式。

    查看 xdebug_remote.log 日志,报错如下

    Log opened at 2018-06-01 13:51:09
    I: Checking remote connect back address.
    I: Checking header 'HTTP_X_FORWARDED_FOR'.
    I: Checking header 'REMOTE_ADDR'.
    I: Remote address found, connecting to 172.100.0.1:9005.
    W: Creating socket for '172.100.0.1:9005', poll success, but error: Operation now in progress (29).
    E: Could not connect to client. :-(
    Log closed at 2018-06-01 13:51:09
    修改 php72.ini 文件配置

    根据下面资料:

    ; 这个地址为主机ip,通过`ifconfig`查看
    xdebug.remote_host = 192.168.1.123
    xdebug.remote_connect_back = 0
    成功进入调试界面

    注意:配置远程目录映射

  • ucmir
    2周前

    楼主请问一下如何关闭https跳转呀,我把本地conf/conf.d/demo.conf配置修改之后还是会有跳转
    下面是我的配置

    server {
        listen       80;
        server_name  127.0.0.1 localhost www.demo.com;
        root   /var/www/html/demo;
    
        location ~ .*$ {
            fastcgi_pass   fpm:9000;
            fastcgi_index  index.php;
            include        fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        }
    
    }
    
  • Sparkfly
    2周前

    @ucmir 修改后,需重启服务才能生效,,,

    docker-compose down
    docker-compose up -d
  • ucmir
    2周前

    楼主我这边处理好了,是因为我将如下代码修改导致的

    include /etc/nginx/conf.d/*.conf;

    我之前看这个目录我是不对的,因为我本地并没有这个目录,所以就设置了一个我本地的绝对路径导致的问题。后来我又对照了你原来的代码讲这里的配置改回来就可以了,我想问一下这里为什么是这个地址,我本地没有的地址,是怎么样的一个引用机制可以正常的引入虚拟机的配置文件?
    是因为虽然配置文件虽然在我本地,其实引用目录其实还是docker里的目录吗?

  • Sparkfly
    2周前

    @ucmir 可以这样理解,是有目录映射配置,你可以看 docker-compose.yml 文件中 volumes 参数

      nginx:
        image: nginx:alpine
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./www/:/var/www/html/:rw
          - ./conf/nginx/conf.d:/etc/nginx/conf.d/:ro
          - ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
          - ./log/nginx/:/var/log/nginx/:rw
    ...

    /etc/nginx/conf.d/ 相当于 ./conf/nginx/conf.d
    ./conf/nginx/conf.d 就是本项目的相对路径

    所有的相对路径,是相对于docker-compose.yml文件的目录

  • ucmir
    2周前

    @Sparkfly 很透彻,我这边已经了解了,整个的运行机制,谢谢你的耐心解答 :+1:

  • ThinkCsly 努力、坚持、学习、进步!
    2周前

    很好

  • Cody
    2周前

    80端口下 如何配置多个站点

  • Sparkfly
    2周前

    @Cody nginx 配置虚拟域名,如,www.demo1.com www.demo2.com 对应不同的站点
    然后本地加 hosts

    127.0.0.1 www.demo1.com
    127.0.0.1 www.demo2.com 
  • Sparkfly
    1周前
    networks:
      docker_net:
        driver: bridge
        ipam:
          driver: default
          config:
            -
              subnet: "172.100.0.0/16"
  • ucmir
    1周前

    这边记录一下我自己遇到的一个小问题的解决方法,我这边跑程序的时候抛出

    SQLSTATE[HY000] [2002] Connection refused

    后来发现原因是我把数据库地址写成了127.0.0.1,实际上的数据库地址应该是docker-compose.yml文件中配置ipv4_address的ip地址

      mysql:
        image: mysql:5.6
        ports:
          - "3306:3306"
        volumes:
          - ./conf/mysql/my.cnf:/etc/mysql/my.cnf:ro
          - ./mysql/:/var/lib/mysql/:rw
          - ./log/mysql/:/var/log/mysql/:rw
        environment:
          MYSQL_ROOT_PASSWORD: "123456"
        networks:
          docker_net:
            ipv4_address: 172.100.0.5
  • Sparkfly
    5小时前

    更多优化更新,可以访问github

暂无评论~~
您需要登陆以后才能留下评论!

Composer 中国全量镜像

Top 100 扩展包

Lumen 中文文档

Laravel 速查表

Laravel 中文文档

Laravel 项目开发规范

Laravel 开发环境部署

GraphQL PHP 中文文档

社区文档撰写指南

TDD 构建 Laravel 论坛笔记

PHP PSR 标准规范

PHP 设计模式全集

Dingo API 中文文档