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

准备

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

开包即用,不用看代码!

初始化

进入一个文件夹。

下载已经写好的开源项目

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

进入开源项目文件夹

cd Docker-run-nginx-PHP-fpm-web-server-router-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-router

查看文件夹是否共享成功

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

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

LICENSE
docker-compose.yml
nginx
php
share-windows-folder-to-docker

使用PHP内建的Web Server的路由方式

启动PHP内建web server

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

正确启动将看到如下信息

PHP 7.2.1 Development Server started at Sun Feb  4 12:34:23 2018
Listening on http://0.0.0.0:80
Document root is /nginx-PHP-fpm-web-server-router/php/public
Press Ctrl-C to quit.

打开新的PowerShell

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

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

index.php中的内容为phpinfo,从phpinfo中可以看到这是PHP内建的web server

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

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

可以看到仍旧是phpinfo,区别在于其中的路径不同了,说明请求都被路由到index.php文件了。

使用nginxPHP-fpm的路由方式

使用docker-compose启动

docker-compose up

正确启动将看到如下信息

Starting dockerrunnginxphpfpmwebserverrouterfromwindowssharefolder_php_1 ... done
Starting dockerrunnginxphpfpmwebserverrouterfromwindowssharefolder_web_1 ... done
Attaching to dockerrunnginxphpfpmwebserverrouterfromwindowssharefolder_php_1, dockerrunnginxphpfpmwebserverrouterfromwindowssharefolder_web_1
php_1  | [04-Feb-2018 12:38:42] NOTICE: fpm is running, pid 1

打开新的PowerShell

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

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

index.php中的内容为phpinfo,从phpinfo中可以看到这是nginx连接PHP-fpm

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

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

可以看到仍旧是phpinfo,区别在于其中的路径不同了,说明请求都被路由到index.php文件了。

如果想看再看代码

项目文件结构如下

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

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

index.php中包含phpinfo函数

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

web:
        image: nginx
        ports:
                - "80:80"
        volumes:
                - nginx-PHP-fpm-web-server-router:/nginx-PHP-fpm-web-server-router
        command: /bin/bash -c "cp /nginx-PHP-fpm-web-server-router/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-router:/nginx-PHP-fpm-web-server-router

其中包含两个服务webphp

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

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

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

然后启动nginx

nginx -g 'daemon off;'

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

default.confnginx配置文件

server {
	listen       80;
	server_name  localhost;
	root /nginx-PHP-fpm-web-server-router/php/public;

	location / {
		try_files $uri $uri/ /index.php$is_args$args;
	}

	location ~ \.php$ {
		fastcgi_pass php:9000;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
	}
}

设置监听80端口

listen       80;

设置服务器名

server_name  localhost;

设置路由

	location / {
		try_files $uri $uri/ /index.php$is_args$args;
	}

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

	location ~ \.php$ {
		fastcgi_pass php:9000;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
	}
发布了1058 篇原创文章 · 获赞 107 · 访问量 290万+
展开阅读全文

Docker nginx + php-fpm配置主机?

08-12

<div class="post-text" itemprop="text"> <p>I am trying to set up a work environment for myself. I can’t get to the server through the name specified in hosts file.</p> <p>docker-compose.yml:</p> <pre><code>version: '2' services: nginx: image: nginx:latest ports: - "80:80" - "443:443" volumes: - ./hosts:/etc/nginx/conf.d - ./www:/var/www - ./logs:/var/log/nginx links: - php php: build: ./images/php links: - mysql volumes: - ./www:/var/www mysql: image: mysql:8 ports: - "3306:3306" volumes: - ./mysql:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret </code></pre> <p>php dockerfile:</p> <pre><code>FROM php:7.1-fpm RUN apt-get update && apt-get install -y \ curl \ wget \ git \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev \ && docker-php-ext-install -j$(nproc) iconv mcrypt mbstring mysqli pdo_mysql zip \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer ADD php.ini /usr/local/etc/php/conf.d/40-custom.ini WORKDIR /var/www CMD ["php-fpm"] </code></pre> <p>./hosts/hello-dev.conf:</p> <pre><code>server { server_name hello.dev; listen 80; index index.php; set $MAGE_ROOT /var/www/hello.dev; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root $MAGE_ROOT; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } </code></pre> <p>hosts: <code>127.0.0.1 hello.dev</code></p> <p>Tell me what you can try to do in this situation? If I go to the address <a href="http://127.0.0.1" rel="nofollow noreferrer">http://127.0.0.1</a> it opens the site, but I need to be able to create several configs with different names.</p> </div> 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 撸撸猫 设计师: 设计师小姐姐

分享到微信朋友圈

×

扫一扫,手机浏览