# lnmp容器环境 **Repository Path**: marx88/lnmp-docker ## Basic Information - **Project Name**: lnmp容器环境 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-01 - **Last Updated**: 2021-12-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LNMP开发环境 前排提醒:**开发环境,不可用于生成环境** ### 启动 - 先在本项目同级目录创建`app`目录,然后移动`test`项目:`cp -r app/test ../app` - 忽略追踪日志文件: `git update-index --assume-unchanged nginx/log/access.log` `git update-index --assume-unchanged nginx/log/error.log` - 第一次启动容器:`docker-compose up` - 开启容器:`docker-compose start` - 关闭容器:`docker-compose stop` - 关闭并移除容器:`docker-compose down` ### 难忘的历史 1. 指令`docker exec -i -t 容器名 /bin/bash`报错: - 错误:`OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown` - 解决:指令改为`docker exec -i -t 容器名 /bin/sh`,或者`docker exec -i -t 容器名 sh`,可能某些镜像没有安装`bash`工具 2. 配置`nginx`代理: - Nginx容器不可能每次单独`export`一个端口给某个项目,太麻烦,所以只`export`一个,使用反代 - 由于win系统的host不支持泛域名,所以只能把项目KEY放到一级路径,用规则解析一级路径代理到对应的服务 - 当前反代规则是`http://127.0.0.1/port/uri`代理到`http://127.0.0.1:port/uri`。如何给容器一个域名,这样的话,被代理的服务可配置成`listen 80;server_name key.host.com`,这样反代规则可以把`http://127.0.0.1/key/uri`代理到`http://key.host.com/uri`,目前还没有百度到。。。 3. `nginx`日志不提交git - 因为要挂载日志文件,所以把空文件提交到git - 后来发现无法忽略之前追踪过的文件,于是开始百度 - 最后发现可以本地忽略,`git update-index --assume-unchanged 文件名`,不过这样每次clone后还得运行该指令 4. 找`php`镜像: - 太难了,要不就是太大不够精简,要不`alpine`太精简,扩展都不知道怎么安装,因为都没有类似`apt-get`的安装工具,没有一件趁手的兵器啊。。 - 本来想自己构建一个,想着再看看`hub`里有没有这类镜像,于是发现了`bitnami`,该组织下的镜像都是相对精简,完全可作为开发版镜像 5. php缓存: - php服务启动后,能运行thinkphp项目,但是改动代码,没反应,打日志也没反应 - 打日志没反应,肯定是权限不够,分配好权限`sudo chmod -R 777 runtime`,就可以打印了 - 改动代码没反应,可能是nginx缓存了脚本文件请求,也可能是php的opcache,先是通过`phpinfo`找到`php.ini`,关闭opcache,就正常了,就没管nginx的缓存 6. 桥接三个服务: - 三个镜像都单独启动了,然后就是`link`了,虽然中间发现了`network`,但是目前用不到 - 桥接服务的资料,网上都有,按照资料布置一番,可以了 - 但是看配置,感觉`php`服务容器中不需要挂载项目目录,因为当时理解的是nginx读取php文件给fpm,于是注释掉,发现报错`找不到php文件`。于是去看了nginx搭配fpm的运作流程,发现,nginx只是匹配的php规则就直接把请求丢给fpm,fpm负责找文件并解析内容返给nginx。所以还是要挂载项目目录。 - 后来又想去掉nginx挂载的项目目录,仔细一想,这样搞的话,静态资源就又找不到了,所以还是老实挂载项目目录