美文网首页
基于docker-compose跑起一个php网站

基于docker-compose跑起一个php网站

作者: 血之君殇 | 来源:发表于2021-08-31 11:31 被阅读0次

    昨天拿到一个用thinkphp开发的网站,需要跑起来看看效果,但苦于自己好久不开发PHP了,手里已经没有集成环境,便想着用docker搭一套环境,本以为可以信手拈来,没想到还踩了不少坑,也对之前一知半解的东西加深了一下理解,故在这里记录一下

    准备镜像

    这个没有多大问题,去hub.docker.com找些官方的镜像就可以了,我这儿用到了nginx,php-fpm,mysql,获取命令放在这儿,方便大家直接使用

    docker pull nginx

    docker pull bitnami/php-fpm

    docker pull mysql

    编写docker-compose.yml

    version: "3"
    services:
      nginx:
        image: nginx
        ports:
          - 80:80
        volumes:
          - ./default.conf:/etc/nginx/conf.d/default.conf ##配置文件位置映射
          - .:/usr/share/nginx/html     ##网页文件位置映射
        depends_on:
          - php
      php:
        image: bitnami/php-fpm
        volumes:
          - .:/app ##网页文件位置映射
        depends_on:
          - mysql
        links: 
          - mysql
      mysql:
        image: mysql
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_PASSWORD: EisBzdye6adiJHHj ##数据库用户密码
          MYSQL_DATABASE: www_ammopic_com
          MYSQL_USER: www_ammopic_com
        ports: 
          - 3306:3306
        volumes:
          - ./www_ammopic_com.sql:/docker-entrypoint-initdb.d/db.sql
    

    问题1:依赖启动

    nginx依赖于php-fpm,php-fpm又依赖于mysql,depends_on很好的解决了这个问题

    问题2:mysql自动填充创建数据库以及填充数据

    虽然可以把mysql先运行起来,然后把sql文件拷贝进去,然后进入容器执行导入脚本,但总觉得这样操作很low,都想好了要做一条命令启动一个环境了,如果还有这么多操作就违背初衷了。
    查了一下,mysql有个机制,可以从/docker-entrypoint-initdb.d/这个路径下检查sql文件,sh脚本等,从而实现自动导入数据的功能,非常好用,完美的解决了这个问题

    问题3:各容器之间如何通信,统一端口映射到主机非常不优雅

    之前操作的时候因为经常开发,所以像nginx,mysql这些都是把端口直接映射到主机的,这样方便了开发,但又违背了初衷。所幸links完美的解决了这个问题,这样在代码里连接mysql,在nginx里连接php-fpm都很方便了,而且不会对外暴露,非常好用

    编写nginx配置文件

    server {
        listen       80;
        listen  [::]:80;
        server_name  localhost;
        root   /usr/share/nginx/html/public;
    
        location / {
            if (!-e $request_filename){
                rewrite  ^(.*)$  /index.php?s=$1  last;   break;
            }
            index  index.html index.php index.htm;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    
        location ~ \.php$ {
            root           /app/public;
            fastcgi_pass   php:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
    

    这种写了不知道多少遍的配置文件,居然也出现了翻船的时候,正应了那句话,拳不离手曲不离口。

    问题1:root目录

    thinkphp和laravel一样,是需要将根目录映射到public目录的,这该死的记性

    问题2:连接到php-fpm应该如何写

    以前写配置的时候nginx和php-fpm都是在同一台机器上,所以代码位置也放在了一起,这一次代码分别在nginx容器和php-fpm容器里,一时还写不对了。最后测试发现,在连接php-fpm的配置里,需要写的文件位置是php-fpm容器里的代码路径,如上述文件的/app/public

    最后执行

    docker compose up,镜像没有问题,但网站依旧访问不了,究其原因,是因为奇葩的开发者写的奇葩的逻辑,与本文想讲的技术无关了,但依然忍不住想在这里吐槽,这种不靠谱的程序员什么时候能少一点……

    相关文章

      网友评论

          本文标题:基于docker-compose跑起一个php网站

          本文链接:https://www.haomeiwen.com/subject/hwcziltx.html