关键词搜索

源码搜索 ×
×

(开包即用,不用看代码!)在 Docker 中用 nginx 和 PHP-fpm 运行来自 Windows 共享文件夹的网站

发布2018-02-04浏览1293次

详情内容

准备

  • PowerShell
  • git
  • docker
  • 使用docker-machine命令可以找到一台可用的Docker主机

开包即用,不用看代码!

初始化

进入一个文件夹。

下载已经写好的开源项目

git clone https://github.com/huzhenghui/Docker-run-nginx-PHP-fpm-web-server-from-Windows-share-folder

    进入开源项目文件夹

    cd Docker-run-nginx-PHP-fpm-web-server-from-Windows-share-folder

      更新子模块代码

      git submodule update --init

        使用管理员权限的PowerShell运行共享文件夹到Docker的脚本。

        .\share-windows-folder-to-docker\share-windows-folder-to-docker.ps1 -workingDir . -volumeName nginx-PHP-fpm-web-server

          查看文件夹是否共享成功

          docker run --rm -v nginx-PHP-fpm-web-server:/share alpine ls /share

            如果成功将看到开源项目的如下文件列表

            LICENSE
            docker-compose.yml
            nginx
            php
            share-windows-folder-to-docker
            • 2
            • 3
            • 4
            • 5

            使用PHP内建的Web Server

            启动PHP内建web server

            docker run -it --rm -v nginx-PHP-fpm-web-server:/nginx-PHP-fpm-web-server -p 80:80 php -S 0.0.0.0:80 -t /nginx-PHP-fpm-web-server/php/public

              正确启动将看到如下信息

              PHP 7.2.1 Development Server started at Sun Feb  4 07:56:32 2018
              Listening on http://0.0.0.0:80
              Document root is /nginx-PHP-fpm-web-server/php/public
              Press Ctrl-C to quit.
              • 2
              • 3
              • 4

              打开新的PowerShell

              访问首页,此处使用环境变量获取Docker主机的IP地址,也可以自行输入。

              Start-Process -FilePath ($env:DOCKER_HOST -replace '^tc(p://[.\d]+):.*', 'htt$1/')

                查看phpinfo页面,此处使用环境变量获取Docker主机的IP地址,也可以自行输入。

                Start-Process -FilePath ($env:DOCKER_HOST -replace '^tc(p://[.\d]+):.*', 'htt$1/phpinfo.php')

                  phpinfo中可以看到这是PHP内建的web server

                  使用nginxPHP-fpm

                  使用docker-compose启动

                  docker-compose up

                    正确启动将看到如下信息

                    Starting dockerrunnginxphpfpmwebserverfromwindowssharefolder_php_1 ... done
                    Recreating dockerrunnginxphpfpmwebserverfromwindowssharefolder_web_1 ... done
                    Attaching to dockerrunnginxphpfpmwebserverfromwindowssharefolder_php_1, dockerrunnginxphpfpmwebserverfromwindowssharefolder_web_1
                    php_1  | [04-Feb-2018 08:05:41] NOTICE: fpm is running, pid 1
                    • 2
                    • 3
                    • 4

                    打开新的PowerShell

                    访问首页,此处使用环境变量获取Docker主机的IP地址,也可以自行输入。

                    Start-Process -FilePath ($env:DOCKER_HOST -replace '^tc(p://[.\d]+):.*', 'htt$1/')

                      查看phpinfo页面,此处使用环境变量获取Docker主机的IP地址,也可以自行输入。

                      Start-Process -FilePath ($env:DOCKER_HOST -replace '^tc(p://[.\d]+):.*', 'htt$1/phpinfo.php')

                        phpinfo中可以看到这是nginx连接PHP-fpm

                        查看一个不存在的页面,此处使用环境变量获取Docker主机的IP地址,也可以自行输入。

                        Start-Process -FilePath ($env:DOCKER_HOST -replace '^tc(p://[.\d]+):.*', 'htt$1/404')

                          可以看到nginx404页面

                          如果想看再看代码

                          项目文件结构如下

                          • docker-compose.yml
                          • nginx\
                            • conf.d\
                            • default.conf
                          • php\
                            • public\
                            • index.html
                            • phpinfo.php
                          • share-windows-folder-to-docker\
                            • share-windows-folder-to-docker.ps1

                          share-windows-folder-to-docker.ps1是一个把Windows中的文件夹共享到Docker的脚本,具体工作原理见注释

                          index.html是一个静态默认页面

                          phpinfo.php中包含phpinfo函数

                          docker-compose.yml是容器编排文件

                          web:
                                  image: nginx
                                  ports:
                                          - "80:80"
                                  volumes:
                                          - nginx-PHP-fpm-web-server:/nginx-PHP-fpm-web-server
                                  command: /bin/bash -c "cp /nginx-PHP-fpm-web-server/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
                                  links:
                                          - php
                          php:
                                  image: php:fpm
                                  volumes:
                                          - nginx-PHP-fpm-web-server:/nginx-PHP-fpm-web-server
                          
                          • 2
                          • 3
                          • 4
                          • 5
                          • 6
                          • 7
                          • 8
                          • 9
                          • 10
                          • 11
                          • 12
                          • 13
                          • 14

                          其中包含两个服务webphp

                          web服务使用nginx镜像,端口从80映射到80,把前面使用脚本共享的nginx-PHP-fpm-web-server卷加载到/nginx-PHP-fpm-web-server路径,关联到php服务。

                          web服务没有使用默认的启动命令,而是包含两部分,首先复制nginx配置文件,配置文件的详细分析见下文。

                          cp /nginx-PHP-fpm-web-server/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf

                            然后启动nginx

                            nginx -g 'daemon off;'

                              php服务使用php:fpm镜像,把前面使用脚本共享的nginx-PHP-fpm-web-server卷加载到/nginx-PHP-fpm-web-server路径,此处注意,Docker中容器之间是隔离的,web服务和php服务都需要访问的卷需要在每个服务中都加载一遍,而且加载的路径应当相同,使得程序按照路径访问的是相同的文件。

                              default.confnginx配置文件

                              server {
                                  listen       80;
                                  server_name  localhost;
                                  root /nginx-PHP-fpm-web-server/php/public;
                                  index index.php index.html;
                              
                                  location ~ \.php$ {
                                      fastcgi_pass php:9000;
                                      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                                      include fastcgi_params;
                                  }
                              }
                              • 2
                              • 3
                              • 4
                              • 5
                              • 6
                              • 7
                              • 8
                              • 9
                              • 10
                              • 11
                              • 12

                              设置监听80端口

                              listen       80;

                                设置服务器名

                                server_name  localhost;

                                  设置网站的根路径

                                  root /nginx-PHP-fpm-web-server/php/public;

                                    设置索引文件名称

                                    index index.php index.html;

                                      .php后缀的文件传输到php服务。

                                          location ~ \.php$ {
                                              fastcgi_pass php:9000;
                                              fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                                              include fastcgi_params;
                                          }
                                      • 2
                                      • 3
                                      • 4
                                      • 5

                                      相关技术文章

                                      点击QQ咨询
                                      开通会员
                                      返回顶部
                                      ×
                                      微信扫码支付
                                      微信扫码支付
                                      确定支付下载
                                      请使用微信描二维码支付
                                      ×

                                      提示信息

                                      ×

                                      选择支付方式

                                      • 微信支付
                                      • 支付宝付款
                                      确定支付下载