设置PHP,PHP-FPM和NGINX以在Docker上进行本地开发

pascallandau.com

设置PHP,PHP-FPM和NGINX以在Docker上进行本地开发

Windows 10下Docker上PHP入门。

帕斯卡·兰道Pascal Landau)发表于2018-07-08 22:00:00

您可能从新来的孩子那里听到了一个叫做“ Docker”的消息?您是一名PHP开发人员,并且愿意参与其中,但是您没有时间研究它吗?然后,本教程适合您!到最后,您应该知道:

  • 如何在Windows 10计算机上“本地”设置Docker
  • 如何从命令行构建和运行容器
  • 如何登录容器并浏览它们以获取信息
  • 什么是Dockerfile以及如何使用它
  • 容器如何互相交谈
  • 如何docker-compose将所有东西很好地融合在一起

注意:在本教程中,我不仅会走上快乐的路。这意味着我将深入研究与docker并不完全相关的某些事物(例如,如何找出php-fpm的配置文件位于何处),但这些知识是我理解的重要内容,因为它们使您能够解决以后自己解决问题。

但是,如果您时间不多,还可以直接跳到tl; dr

Docker PHP教程的已发布部分

这是Docker上(可能)多部分系列的第一部分。第二部分介绍了如何在Docker容器中设置PHP,以便在使用XDebug时与PHPStorm良好配合

目录

介绍

前提条件

我假设您已经为Windows安装了Git bash。如果不是,请在执行此操作之前,请参阅设置软件:Git和Git Bash

为什么要使用Docker?

我不会详细介绍Docker是什么以及为什么要使用它,因为 其他 已经 对此进行了广泛讨论。

对于我来说,我的主要原因是

  • 流浪汉中的符号链接无法正常工作
  • 随着时间的流逝,虚拟机变得肿且难以管理
  • 团队中的设置涉及很多工作
  • 我想学习Docker很长时间了,因为您听说了很多

通常,Docker有点像虚拟机,因此它允许我们在自己选择的操作系统(例如Windows)中进行开发,但可以在与生产环境相同的环境中(例如,在Linux服务器上)运行代码。归功于其核心原理,它使服务分离变得非常容易(例如,为数据库配备专用服务器),这同样也是生产中应该发生的事情。

从无业游民过渡

在Windows上,您可以使用Docker Toolbox (本质上是具有Docker安装程序的VM),也可以使用基于Hyper-V的Windows Docker。本教程仅讨论后者。

请注意:不幸的是,除了Docker(在Windows上)之外,我们再也没有其他神灵。本机Docker客户端要求激活Hyper-V,这又将导致Virtualbox不再工作。因此,我们将无法同时使用Vagrant和Docker。这实际上是我花了很长时间才开始使用Docker的主要原因。

设置Docker

首先,下载适用于Windows的Docker (需要Microsoft Windows 10 Professional或Enterprise 64位)。我在本教程中使用的版本是18.03.1-ce-win65。在安装过程中,请不要勾选“使用Windows容器而不是Linux容器”选项,因为我们打算在linux容器上进行开发(您以后可以随时对其进行更改)。

安装泊坞窗

安装完成后,我们需要注销Windows并再次登录。Docker应该自动启动。如果没有,应该在桌面上放置一个“ Docker for Windows”图标。如果尚未激活Hyper-V,则Docker将立即敦促您这样做。

激活Hype-V

如果您同意,则将激活Hyper-V和容器功能,并启动重新启动。请参阅在Windows 10上安装Hyper-V 以再次将其停用。

注意:VirtualBox之后将停止工作!从VirtualBox界面或通过启动我的一台以前的机器vagrant up失败,并显示错误消息

VT-x不可用(VERR_VMX_NO_VMX)

虚拟盒子错误 流浪错误

重新启动后,Docker将自动启动,并出现一个欢迎屏幕。

Docker欢迎画面

我们可以忽略它(关闭窗口)。此外,新图标将添加到系统托盘中。右键单击将显示上下文菜单。

系统任务栏中的Docker设置

打开选项卡“ Shared Devices”,然后在您要与Docker容器共享的主机上勾选硬盘。

注意:稍后,我们仍然需要为实际的容器定义显式的路径映射,但是必须在此处提供该路径所属的硬盘驱动器。单击“应用”后,将提示您输入凭据

Docker设置:共享设备 Docker设置:凭据提示

接下来,打开选项卡“高级”。实际上,您不必更改任何设置,但是,如果您(像我一样)没有C:/设置为最大分区,则可能需要更改“磁盘映像位置”。我把我放在C:Hyper-VVirtual Hard DisksMobyLinuxVM.vhdx。Docker可能需要花费几分钟来处理更改。

Docker“物理地”将容器映像存储在该位置。

Docker设置:高级

恭喜,您的计算机上现已设置了Docker

设置PHP cli容器

现在我们已经掌握了一般的东西,让我们设置我们的第一个容器。我已经创建了目录C:/codebase/docker-php/,并将在其中运行其余示例。

首先,让我们为源代码创建一个目录:

mkdir -p "C:/codebase/docker-php/app"

为了简单起见,我们将坚持使用官方的PHP映像并运行:

docker run -d --name docker-php -v "C:/codebase/docker-php/app":/var/www php:7.0-cli

意思是:

docker run                               // run a container
-d                                       // in the background (detached)
--name docker-php                        // named docker-php
-v "C:/codebase/docker-php/app":/var/www // sync the directory C:/codebase/docker-php/app on the 
                                         // windows host with /var/www in the container
php:7.0-cli                              // use this image to build the container

结果看起来像这样:

$ docker run -d --name docker-php -v "C:/codebase/docker-php/app":/var/www php:7.0-cli
Unable to find image 'php:7.0-cli' locally
7.0-cli: Pulling from library/php
f2aa67a397c4: Pulling fs layer
c533bdb78a46: Pulling fs layer
65a7293804ac: Pulling fs layer
35a9c1f94aea: Pulling fs layer
54cffc62e1c2: Pulling fs layer
153ff2f4c2af: Pulling fs layer
96d392f71f56: Pulling fs layer
e8c43e665458: Pulling fs layer
35a9c1f94aea: Waiting
54cffc62e1c2: Waiting
153ff2f4c2af: Waiting
96d392f71f56: Waiting
e8c43e665458: Waiting
c533bdb78a46: Verifying Checksum
c533bdb78a46: Download complete
35a9c1f94aea: Verifying Checksum
35a9c1f94aea: Download complete
f2aa67a397c4: Verifying Checksum
f2aa67a397c4: Download complete
153ff2f4c2af: Verifying Checksum
153ff2f4c2af: Download complete
54cffc62e1c2: Verifying Checksum
54cffc62e1c2: Download complete
e8c43e665458: Verifying Checksum
e8c43e665458: Download complete
96d392f71f56: Verifying Checksum
96d392f71f56: Download complete
f2aa67a397c4: Pull complete
65a7293804ac: Verifying Checksum
65a7293804ac: Download complete
c533bdb78a46: Pull complete
65a7293804ac: Pull complete
35a9c1f94aea: Pull complete
54cffc62e1c2: Pull complete
153ff2f4c2af: Pull complete
96d392f71f56: Pull complete
e8c43e665458: Pull complete
Digest: sha256:ff6c5e695a931f18a5b59c82b1045edea42203a299e89a554ebcd723df8b9014
Status: Downloaded newer image for php:7.0-cli
56af890e1a61f8ffa5528b040756dc62a94c0b929c29df82b9bf5dec6255321f

由于我们的计算机上没有该映像(请参阅Unable to find image 'php:7.0-cli' locally参考资料),因此Docker尝试从https://hub.docker.com/的官方注册表中提取该映像。我们特别选择了PHP映像的“ 7.0-cli”版本(这意味着:仅PHP 7.0 CLI)。有关所有可用标签/图像的列表,请参见https://hub.docker.com/_/php/

现在,让我们看看容器是否实际通过运行 docker ps

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

奇怪的。由于某些原因,我们在此处看不到我们新创建的容器。让我们用该-a标志进行检查以列出所有容器,甚至是未运行的容器。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS                      PORTS               NAMES
56af890e1a61        php:7.0-cli         "docker-php-entrypoi…"   27 seconds ago     Exited (0) 25 seconds ago                       docker-php

啊哈 这样便创建了容器,但是立即停止了该容器(请参阅参考资料Created 27 seconds ago; Exited (0) 25 seconds ago)。这是因为容器仅在其主进程正在运行时才存在。根据文档

容器的主要运行过程是Dockerfile末尾的ENTRYPOINT和/或CMD。”

这个答案很好地解释了CMD和ENTRYPOINT之间的区别。由于我们没有定义Dockerfile,因此我们需要查看 正在使用的基本映像Dockerfile,但是我现在暂时不想钻这个兔子洞。基本上,“问题”是容器没有定义长时间运行的进程/服务(如php-fpm或nginx容器稍后所做的那样)。为了使容器保持活动状态,我们需要将-i标志添加到docker run命令中:

docker run -di --name docker-php -v "C:/codebase/docker-php/app":/var/www php:7.0-cli

但是,这发生了:

Pascal@Landau-Laptop MINGW64 /
$ docker run -di --name docker-php -v "C:/codebase/docker-php/app":/var/www php:7.0-cli
C:Program FilesDockerDockerResourcesbindocker.exe: Error response from daemon: Conflict. The container name "/docker-php" is already in use by container "56af890e1a61f8ffa5528b040756dc62a94c0b929c29df82b9bf5dec6255321f". You have to remove (or rename) that container to be able to reuse that name.
See 'C:Program FilesDockerDockerResourcesbindocker.exe run --help'.

显然,我们不能再使用相同的名称(docker-php)。笨蛋 因此,让我们先通过以下方式删除之前的容器

docker rm docker-php

然后再试一次:

Pascal@Landau-Laptop MINGW64 /
$ docker rm docker-php
docker-php
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
docker run -di --name docker-php -v "C:/codebase/docker-php/app":/var/www php:7.0-cli
7b3024a542a2d25fd36cef96f4ea689ec7ebb758818758300097a7be3ad2c2f6
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ docker ps
CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS              PORTS               NAMES
7b3024a542a2        php:7.0-cli         "docker-php-entrypoi…"   5 seconds ago      Up 4 seconds                            docker-php

亲爱的,现在容器已启动并正在运行,让我们通过以下方式“登录

docker exec -it docker-php bash

您可能会收到以下错误消息

Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ docker exec -it docker-php bash
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'

如果是这样,在命令前加上前缀winpty应该会有所帮助:

winpty docker exec -it docker-php bash
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ winpty docker exec -it docker-php bash
root@7b3024a542a2:/#

php -v在容器中快速验证,我们实际上可以在其中运行php脚本:

root@7b3024a542a2:/# php -v
PHP 7.0.30 (cli) (built: May 23 2018 23:04:32) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

还记得我们指定的路径映射吗?让我们在Windows 10主机上创建一个简单的“ hello world”脚本 ,C:codebasedocker-phpapphello-world.php以确保其正常工作:

cd "C:codebasedocker-phpapp"
echo '' > hello-world.php

在主机上应如下所示:

Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ ls -alh app
total 1,0K
drwxr-xr-x 1 Pascal 197121  0 Mai 28 12:29 ./
drwxr-xr-x 1 Pascal 197121  0 Mai 28 11:46 ../
-rw-r--r-- 1 Pascal 197121 49 Mai 28 12:30 hello-world.php

并从容器中像这样:

root@7b3024a542a2:/# ls -alh /var/www
total 4.5K
drwxr-xr-x 2 root root  0 May 28 10:29 .
drwxr-xr-x 1 root root 4.0K May 28 10:00 ..
-rwxr-xr-x 1 root root   31 May 28 10:31 hello-world.php

让我们通过以下方式在容器中运行脚本

php /var/www/hello-world.php
root@7b3024a542a2:/# php /var/www/hello-world.php
Hello World

完美无瑕。我们在主机系统上创建了文件,该文件在容器中自动可用。

在PHP容器中安装Xdebug

由于我们打算将Docker用于我们的本地开发设置,因此调试功能是必不可少的。因此,让我们使用xdebug扩展名扩展图像。官方Docker PHP存储库的自述文件很好地解释了 如何安装扩展。对于xdebug,我们将使用PECL。要安装扩展,请确保登录到容器并运行

pecl install xdebug-2.6.0

您应该看到类似以下的输出:

root@7b3024a542a2:/# pecl install xdebug-2.6.0
[...]
Build process completed successfully
Installing '/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so'
install ok: channel://pecl.php.net/xdebug-2.6.0
configuration option "php_ini" is not set to php.ini location
You should add "zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so" to php.ini

xdebug扩展已构建并保存在中/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so。要实际激活它,请运行

docker-php-ext-enable xdebug

该帮助程序命令会将文件docker-php-ext-xdebug.ini放置在目录中,用于包含内容的其他php ini文件

zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so

启用扩展。顺便提一句。您可以通过运行找到其他php ini文件文件夹

php -i | grep "additional .ini"

结果:

root@7b3024a542a2:/# php -i | grep "additional .ini"
Scan this dir for additional .ini files => /usr/local/etc/php/conf.d

当我们检查该文件夹的内容时,我们确实会找到xdebug.ini具有前面提到的内容的文件并php -m显示xdebug实际上是活动的。

root@7b3024a542a2:/# ls -alh /usr/local/etc/php/conf.d
total 12K
drwxr-sr-x 1 root staff 4.0K May 28 13:30 .
drwxr-sr-x 1 root staff 4.0K Apr 30 20:34 ..
-rw-r--r-- 1 root staff   81 May 28 13:30 docker-php-ext-xdebug.ini
root@7b3024a542a2:/# cat /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so
root@7b3024a542a2:/# php -m | grep xdebug
xdebug

现在,我们将退出容器(输入“ exit”或点击CTRL+ D),然后通过停止容器

docker stop docker-php
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ docker stop docker-php
docker-php
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS                      PORTS               NAMES
7b3024a542a2        php:7.0-cli         "docker-php-entrypoi…"   2 hours ago        Exited (137) 7 seconds ago                      docker-php

现在,我们通过重新启动容器

docker start docker-php

重新登录并检查xdebug是否仍然存在:

Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ docker start docker-php
docker-php
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ winpty docker exec -it docker-php bash
root@7b3024a542a2:/# php -m | grep xdebug
xdebug

而且...是的!因此,我们所做的更改使容器重新启动“得以幸存”。但是:它们将无法在容器的“重建”中幸存下来。首先,我们停止并通过以下方式删除容器

docker rm -f docker-php

-f标志迫使容器停止。否则我们将需要一个额外的docker stop docker-php

然后我们重建它,登录

docker run -di --name docker-php -v "C:/codebase/docker-php/":/codebase php:7.0-cli
inpty docker exec -it docker-php bash

并检查xdebug:

php -m | grep xdebug

...将不再存在。

Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ docker rm -f docker-php
docker-php
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ docker run -di --name docker-php -v "C:/codebase/docker-php/":/codebase php:7.0-cli
1da17524418f5327760eb113904b7ceec30f22b41e4b4bd77f9fa2f7b92b4ead
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ winpty docker exec -it docker-php bash
root@1da17524418f:/# php -m | grep xdebug
root@1da17524418f:/#

注意新的容器ID(之前:7b3024a542a2;现在:)1da17524418f,但这php -m | grep xdebug不会产生任何结果。

使用Dockerfile持久保留映像更改

简而言之,Dockerfile描述了我们对基本映像所做的更改,因此我们(以及其他所有人)可以轻松地重新创建相同的环境。在我们的案例中,我们需要定义我们使用的PHP基本映像以及安装和启用xdebug的说明。为了清楚地将基础结构与代码区分开,我们将在创建一个新目录C:/codebase/docker-php/php-cli/Dockerfile在此目录中创建一个命名文件

mkdir "C:/codebase/docker-php/php-cli/"
touch "C:/codebase/docker-php/php-cli/Dockerfile"

并提供以下内容:

FROM php:7.0-cli
RUN pecl install xdebug-2.6.0 
    && docker-php-ext-enable xdebug

转到C:/codebase/docker-php/php-cli/目录并基于该Dockerfile构建映像

cd "C:/codebase/docker-php/php-cli/"
docker build -t docker-php-image -f Dockerfile .

-f Dockerfile实际上是可选的,因为这是默认的反正。“ docker-php-image”是我们新映像的名称。

如果遇到以下错误

"docker build" requires exactly 1 argument.
See 'docker build --help'.
Usage:  docker build [OPTIONS] PATH | URL | - [flags]
Build an image from a Dockerfile

您可能错过了结尾.的结尾docker build -t docker-php-image -f Dockerfile .;)

Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php/php-cli
$ docker build -t docker-php-image -f Dockerfile .
Sending build context to Docker daemon   5.12kB
Step 1/2 : FROM php:7.0-cli
 ---> da771ba4e565
Step 2/2 : RUN pecl install xdebug-2.6.0    && docker-php-ext-enable xdebug
 ---> Running in ff16ef56e648
downloading xdebug-2.6.0.tgz ...
Starting to download xdebug-2.6.0.tgz (283,644 bytes)
[...]
You should add "zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so" to php.ini
Removing intermediate container ff16ef56e648
 ---> 12be27256b12
Successfully built 12be27256b12
Successfully tagged docker-php-image:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

请注意,构建所需的时间比以前更长,因为Docker现在需要完成安装xdebug的额外工作。php:7.0-cli现在,我们将使用新的闪亮docker-php-image图像代替容器来使用基本图像来启动容器并检查xdebug。

docker run -di --name docker-php -v "C:/codebase/docker-php/app":/var/www docker-php-image
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php/php-cli
$ docker run -di --name docker-php -v "C:/codebase/docker-php/app":/var/www docker-php-image
C:Program FilesDockerDockerResourcesbindocker.exe: Error response from daemon: Conflict. The container name "/docker-php" is already in use by container "2e84cb536fc573142a9951331b16393e3028d9c6eff87f89cfda682279634a2b". You have to remove (or rename) that container to be able to reuse that name.
See 'C:Program FilesDockerDockerResourcesbindocker.exe run --help'.

Aaaand我们收到一个错误,因为我们尝试使用与先前仍在运行的容器相同的名称(“ docker-php”)。igh ..幸运的是,我们已经知道如何通过

docker rm -f docker-php

重试

docker run -di --name docker-php -v "C:/codebase/docker-php/app":/var/www docker-php-image
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php/php-cli
$ docker rm -f docker-php
docker-php
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php/php-cli
$ docker run -di --name docker-php -v "C:/codebase/docker-php/app":/var/www docker-php-image
f27cc1310c836b15b7062e1fd381f283250a85133fb379c4cf1f891dec63770b
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php/php-cli
$ winpty docker exec -it docker-php bash
root@f27cc1310c83:/# php -m | grep xdebug
xdebug

是的,一切都很好。顺便提一句。因为我们“仅”要检查是否已安装xdebug,所以我们也可以简单地传递-m给以下docker run命令:

Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php/php-cli
$ docker run docker-php-image php -m | grep xdebug
xdebug

请注意,这将在每次运行时创建一个新容器(请注意,第一个条目的名称为“ distracted_mclean”):

Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php/php-cli
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS                      PORTS               NAMES
abc9fec8a88b        docker-php-image    "docker-php-entrypoi…"   4 minutes ago      Exited (0) 4 minutes ago                        distracted_mclean
f27cc1310c83        docker-php-image    "docker-php-entrypoi…"   10 minutes ago     Exited (137) 6 minutes ago                      docker-php

在继续之前,让我们[]通过](https://coderwall.com/p/ewk0mq/stop-remove-all-docker-containers)停止并删除所有容器。

docker rm -f $(docker ps -aq)

$(docker ps -aq)部件仅返回所有容器的数字ID,并将它们传递给docker rm -f命令。

Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php/php-cli
$ docker rm -f $(docker ps -aq)
abc9fec8a88b
f27cc1310c83

使用php-fpm和nginx设置Web堆栈

由于大多数人可能不仅在CLI脚本上工作,而且在Web页面上工作,因此本教程的下一步是设置nginx Web服务器并将其连接到php-fpm。

设置nginx

我们将使用官方的nginx图像,并且由于我们对该图像一无所知,因此让我们运行并对其进行一些探索:

docker run -di nginx:latest

产量

Pascal@Landau-Laptop MINGW64 /
$ docker run -di nginx:latest
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
[...]
Status: Downloaded newer image for nginx:latest
15c6b8d8a2bff873f353d24dc9c40d3008da9396029b3f1d9db7caeebedd3f50

请注意,此处我们仅使用了最少数量的参数。由于未指定名称,因此我们将仅使用ID代替登录(因此请确保使用您的shell返回的名称-不要仅复制:P下方的行)

$ winpty docker exec -it 15c6b8d8a2bff873f353d24dc9c40d3008da9396029b3f1d9db7caeebedd3f50 bash
root@15c6b8d8a2bf:/#

我们希望有一个正在运行的nginx进程,但是经过检查,ps aux我们得到了

bash: ps: command not found" as a response. 

这在使用docker映像时很常见,因为它们通常保持尽可能小。尽管这是生产中的好习惯,但在开发中却很麻烦。所以,让我们ps通过安装

apt-get update && apt-get install -y procps

然后再试一次:

root@15c6b8d8a2bf:/# apt-get update && apt-get install -y procps
Get:1 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
[...] 
associated file /usr/share/man/man1/w.procps.1.gz (of link group w) doesn't exist
Processing triggers for libc-bin (2.24-11+deb9u3) ...
root@15c6b8d8a2bf:/# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.2  32608  5148 ?        Ss   06:46   0:00 nginx: master process nginx -g daemon off;
nginx         5  0.0  0.1  33084  2388 ?        S    06:46   0:00 nginx: worker process
root         14  0.0  0.1  18132  3272 pts/0    Ss   06:50   0:00 bash
root        259  0.0  0.1  36636  2844 pts/0    R+   06:53   0:00 ps aux
root@15c6b8d8a2bf:/#

啊。好多了。让我们更深入地了解一下如何通过来配置流程nginx -V

root@15c6b8d8a2bf:/# nginx -V
nginx version: nginx/1.13.12
built by gcc 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
built with OpenSSL 1.1.0f  25 May 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/ng
inx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path
=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-
http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module
 --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_
module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.13.12/debian/debuild-base/nginx-
1.13.12=. -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-specs=/usr/share/dpkg/no-pie-link.specs -Wl,-z,relr
o -Wl,-z,now -Wl,--as-needed -pie'

亲爱的,因此将配置文件放置在默认位置/etc/nginx/nginx.conf (请参阅--conf-path=/etc/nginx/nginx.conf)。检查该文件将向我们显示我们需要在何处放置其他配置文件(例如,用于配置我们的网站)。跑

cat /etc/nginx/nginx.conf

...看

root@15c6b8d8a2bf:/# cat /etc/nginx/nginx.conf
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

请注意include /etc/nginx/conf.d/*.conf文件末尾的行。在此目录中,我们将找到默认的nginx配置:

ls -alh /etc/nginx/conf.d/
cat /etc/nginx/conf.d/default.conf
root@15c6b8d8a2bf:/# ls -alh /etc/nginx/conf.d/
total 12K
drwxr-xr-x 2 root root 4.0K Apr 30 13:55 .
drwxr-xr-x 3 root root 4.0K Apr 30 13:55 ..
-rw-r--r-- 1 root root 1.1K Apr  9 16:01 default.conf
root@15c6b8d8a2bf:/# cat /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ .php$ {
    #    proxy_pass   http://127.0.0.1;
    #}
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ .php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /.ht {
    #    deny  all;
    #}
}

因此服务器正在侦听端口80。不幸的是,我们无法从Windows主机访问Web服务器,因为当前(2018-05-31)存在一个开放的错误,可以从Windows主机访问容器IP (请放心) ,我们将在一秒钟内通过端口映射解决此问题)。因此,为了验证服务器是否正常工作,我们将安装curl在nginx容器内并提取127.0.0.1:80

apt-get install curl -y
curl localhost:80

看起来像这样:

root@15c6b8d8a2bf:/# apt-get install curl -y
Reading package lists... Done
Building dependency tree
[...]
Running hooks in /etc/ca-certificates/update.d...
done.
root@15c6b8d8a2bf:/# curl localhost:80



Welcome to nginx!



Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

看起来不错!现在让我们自定义一些内容:

  • 将根指向 /var/www
  • 在其中放置一个“ Hello world”索引文件 /var/www/index.html
sed -i "s#/usr/share/nginx/html#/var/www#" /etc/nginx/conf.d/default.conf
mkdir -p /var/www
echo "Hello world!" > /var/www/index.html

为了使更改生效,需要重新加载nginx的

nginx -s reload
root@15c6b8d8a2bf:/# nginx -s reload
2018/05/29 09:22:54 [notice] 351#351: signal process started

检查是否卷曲,等等:

root@15c6b8d8a2bf:/# curl 127.0.0.1:80
Hello world!

有了所有这些新信息,我们就可以在主机上使用以下文件夹结构来设置我们的nginx映像:

C:codebasedocker-php
+ nginx
  + conf.d
    - site.conf
  - Dockerfile
+ app
  - index.html
  - hello-world.php

nginxDockerfile

FROM nginx:latest

nginxconf.dsite.conf

server {
    listen      80;
    server_name localhost;
    root        /var/www;
}

appindex.html

Hello World

清理“探索” nginx的容器,cd/c/codebase/docker-php/nginx并建立新的形象:

docker rm -f $(docker ps -aq)
cd /c/codebase/docker-php/nginx
docker build -t docker-nginx-image .
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ docker rm -f $(docker ps -aq)
15c6b8d8a2bf
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ cd nginx
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php/nginx
$ docker build -t docker-nginx-image .
Sending build context to Docker daemon  3.584kB
Step 1/1 : FROM nginx:latest
 ---> ae513a47849c
Successfully built ae513a47849c
Successfully tagged docker-nginx-image:latest
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

然后通过运行“新”容器

docker run -di --name docker-nginx -p 8080:80 -v "C:codebasedocker-phpnginxconf.d":/etc/nginx/conf.d/ -v "C:codebasedocker-phpapp":/var/www docker-nginx-image

在哪里

-p 8080:80                                                  // maps port 8080 on the windows host to port 80 in the container
-v "C:codebasedocker-phpnginxconf.d":/etc/nginx/conf.d/ // mounts the conf.d folder on the host to the correct directory in the container
-v "C:codebasedocker-phpapp":/var/www                    // mounts the "code" directory in the correct place

由于有了端口映射,我们现在可以在主机上的浏览器中简单地打开http://127.0.0.1:8080/并查看appindex.html文件的内容。

nginx索引文件

如果您想了解有关在Docker上运行nginx的更多信息,请查看 本教程

在继续之前,让我们清理一下

docker stop docker-nginx

设置php-fpm

我们已经熟悉了官方的docker PHP映像,但是到目前为止仅使用了cli-only版本。可以通过使用-fpm标签(例如php:7.0-fpm)来拉入FPM 。与nginx一样,让我们​​首先探讨php-fpm图像:

docker run -di --name php-fpm-test php:7.0-fpm

首先要注意的是,该映像会自动docker ps显示端口9000,以显示以下内容:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                  NAMES
c5d23b694563        php:7.0-fpm         "docker-php-entrypoi…"   4 hours ago         Up 4 hours                  9000/tcp               php-fpm-test

当我们检查用于构建映像的Dockerfile(单击此处并搜索当前(2018-05-31)此处链接的“ 7.0-fpm”标签)时,我们可以看到它EXPOSE 9000的底部包含一个。

我们还能找出什么...

winpty docker exec -it php-fpm-test bash

首先,将通过以下命令检查配置文件的位置php-fpm -i | grep config

root@c5d23b694563:/var/www/html# php-fpm -i | grep config
Configure Command =>  './configure'  '--build=x86_64-linux-gnu' '--with-config-file-path=/usr/local/etc/php' '--with-config-file-scan-dir=/usr/local/etc/php/conf.d' '--enable-option-checking=fatal' '--disable-c
gi' '--with-mhash' '--enable-ftp' '--enable-mbstring' '--enable-mysqlnd' '--with-curl' '--with-libedit' '--with-openssl' '--with-zlib' '--with-libdir=lib/x86_64-linux-gnu' '--enable-fpm' '--with-fpm-user=www-da
ta' '--with-fpm-group=www-data' 'build_alias=x86_64-linux-gnu'
fpm.config => no value => no value
[...] 

--with-config-file-path=/usr/local/etc/php是我们的嫌疑人。因此很有可能在 以下位置找到全局指令配置文件/usr/local/etc/php-fpm.conf(不幸的是,我们无法直接解析该位置)。 grep将此文件include=显示为可显示池指令config的位置 :

grep "include=" /usr/local/etc/php-fpm.conf
root@c5d23b694563:/var/www/html# grep "include=" /usr/local/etc/php-fpm.conf
include=etc/php-fpm.d/*.conf

嗯-相对路径。看起来有点奇怪?让我们通过以下-C选项获得更多背景信息grep

grep -C 6 "include=" /usr/local/etc/php-fpm.conf
root@c5d23b694563:/var/www/html# grep -C 6 "include=" /usr/local/etc/php-fpm.conf
; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
;  - the global prefix if it's been set (-p argument)
;  - /usr/local otherwise
include=etc/php-fpm.d/*.conf

啊-更有道理。因此,我们需要etc/php-fpm.d/*.conf相对于解决/usr/local。结果/usr/local/etc/php-fpm.d/*.conf(通常您至少会在其中找到一个www.conf文件)。池配置决定了php-fpm如何侦听连接(例如,通过Unix套接字或通过TCP IP:port)。

cat /usr/local/etc/php-fpm.d/www.conf
root@c5d23b694563:/var/www/html# cat /usr/local/etc/php-fpm.d/www.conf
[...]
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9000
[...]

php-fpm ist侦听127.0.0.1(localhost)上的端口9000。因此,公开端口9000是完全有意义的。

安装xdebug

由于我们可能还想调试php-fpm,因此还需要设置xdebug。该过程与cli映像几乎相同:

pecl install xdebug-2.6.0
docker-php-ext-enable xdebug
php-fpm -m | grep xdebug

当然,我们还将其放入自己的Dockerfile中:

C:codebasedocker-php
+ php-fpm
  - Dockerfile

php-fpmDockerfile

FROM php:7.0-fpm
RUN pecl install xdebug-2.6.0 
    && docker-php-ext-enable xdebug

清理测试容器并构建新映像

docker rm -f php-fpm-test
cd /c/codebase/docker-php/php-fpm
docker build -t docker-php-fpm-image .

连接nginx和php-fpm

现在我们有了用于nginx和php-fpm的容器,我们需要连接它们。为此,我们必须确保两个容器都在同一个网络中并且可以互相通信(这是一个常见问题)。Docker提供了所谓的 用户定义的桥接网络, 可以自动发现服务。这基本上意味着,我们的nginx容器可以使用php-fpm容器_的名称_来连接到它。否则,每次启动容器时,我们都必须找出默认网络中的容器_IP地址_。

docker network ls

显示当前网络的列表

Pascal@Landau-Laptop MINGW64 /
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
7019b0b37ba7        bridge              bridge              local
3820ad97cc92        host                host                local
03fecefbe8c9        none                null                loca

现在web-network,我们通过添加一个新的名称,作为我们的网络堆栈

docker network create --driver bridge web-network
Pascal@Landau-Laptop MINGW64 /
$ docker network create --driver bridge web-network
20966495e04e9f9df9fd64fb6035a9e9bc3aa6d83186dcd23454e085a0d97648
Pascal@Landau-Laptop MINGW64 /
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
7019b0b37ba7        bridge              bridge              local
3820ad97cc92        host                host                local
03fecefbe8c9        none                null                local
20966495e04e        web-network         bridge              local

启动Nginx容器并通过以下方式将其连接到新网络

docker start docker-nginx
docker network connect web-network docker-nginx

最后,我们需要 在相同位置的php-fpm容器中挂载app我们挂载到nginx容器的本地代码文件夹/var/www

docker run -di --name docker-php-fpm -v "C:codebasedocker-phpapp":/var/www --network web-network docker-php-fpm-image

请注意,我们通过该--network选项在run命令中指定了网络。我们可以web-network通过运行来验证两个容器都已连接到

docker network inspect web-network
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php/php-fpm
$ docker network inspect web-network
[
    {
        "Name": "web-network",
        "Id": "20966495e04e9f9df9fd64fb6035a9e9bc3aa6d83186dcd23454e085a0d97648",
        "Created": "2018-05-30T06:39:44.3107066Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "3358e813423165880d59c8ebc2cb4c563ee8ad1d401595f8bfcf763ff5db8f4a": {
                "Name": "docker-php-fpm",
                "EndpointID": "d2f1d6285a0932817e1fb8839bef3a6d178f5306a2116307dba200038ea2a3a3",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "eaa5c05942788985e90a80fa000723286e9b4e7179d0f6f431c0f5109e012764": {
                "Name": "docker-nginx",
                "EndpointID": "274fa9a6868aff656078a72e19c05fb87e4e86b83aaf12be9b943890140a421d",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

“容器”键显示该docker-php-fpm容器的IP地址为172.18.0.3,并且可以通过172.18.0.2访问docker-nginx容器。但是我们实际上可以从Nginx连接到php-fpm吗?让我们找出:

登录到Nginx容器

winpty docker exec -ti docker-nginx bash

并ping IP

ping 172.18.0.3 -c 2
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php/php-fpm
$ winpty docker exec -ti docker-nginx bash
root@eaa5c0594278:/# ping 172.18.0.3 -c 2
bash: ping: command not found

..好吧,我们通过安装iputils-ping以下命令使该命令可用:

apt-get update && apt-get install iputils-ping -y
ping 172.18.0.3 -c 2
root@eaa5c0594278:/# apt-get update && apt-get install iputils-ping -y
root@eaa5c0594278:/# ping 172.18.0.3 -c 2
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.142 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.162 ms
--- 172.18.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1071ms
rtt min/avg/max/mdev = 0.142/0.152/0.162/0.010 ms

我们可以ping容器-很好。但是我们也被保证可以通过它的名字到达容器docker-php-fpm

ping docker-php-fpm -c 2
root@eaa5c0594278:/# ping docker-php-fpm -c 2
PING docker-php-fpm (172.18.0.3) 56(84) bytes of data.
64 bytes from docker-php-fpm.web-network (172.18.0.3): icmp_seq=1 ttl=64 time=0.080 ms
64 bytes from docker-php-fpm.web-network (172.18.0.3): icmp_seq=2 ttl=64 time=0.131 ms
--- docker-php-fpm ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1045ms
rtt min/avg/max/mdev = 0.080/0.105/0.131/0.027 ms

我们可以-太棒了!现在我们需要告诉nginx,将nginxconf.dsite.confWindows主机上的文件更改为将所有与PHP相关的请求传递给php-fpm。

server {
    listen      80;
    server_name localhost;
    root        /var/www;
   location ~ .php$ {
        try_files $uri =404;
        fastcgi_pass docker-php-fpm:9000;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

请注意fastcgi_pass docker-php-fpm:9000;告诉nginx如何到达我们的php-fpm服务的行。因为我们已经安装了nginxconf.d文件夹,所以我们只需要重新加载nginx即可:

nginx -s reload

并在主机上的浏览器中打开http://127.0.0.1:8080/hello-world.php

php-fpm你好世界

顺便提一句。在geekyplatypus.com上还有一个很好的教程,介绍如何使用Nginx和PHP7-FPM您的PHP应用程序进行Docker化。但由于它使用的是docker-compose,因此您可能需要先阅读下一章:)

放在一起:认识docker-compose

让我们总结一下我们现在要做的一切:

  1. 启动php-cli
  2. 启动nginx
  3. 启动php-fpm
docker run -di --name docker-php -v "C:codebasedocker-phpapp":/var/www --network web-network docker-php-image
docker run -di --name docker-nginx -p 8080:80 -v "C:codebasedocker-phpnginxconf.d":/etc/nginx/conf.d/ -v "C:codebasedocker-phpapp":/var/www  --network web-network docker-nginx-image
docker run -di --name docker-php-fpm -v "C:codebasedocker-phpapp":/var/www --network web-network docker-php-fpm-image

嗯 没关系,我想...但是感觉也很“丰富”。将所有内容整齐地定义在一个地方会更好吗?我敢打赌!让我向您介绍docker-compose

Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。

让我们从php-cli容器开始逐步进行此操作。创建文件C:codebasedocker-phpdocker-compose.yml

# tell docker what version of the docker-compose.yml we're using
version: '3'
# define the network
networks:
  web-network:
# start the services section
services:
  # define the name of our service
  # corresponds to the "--name" parameter
  docker-php-cli:
    # define the directory where the build should happened,
    # i.e. where the Dockerfile of the service is located
    # all paths are relative to the location of docker-compose.yml
    build: 
      context: ./php-cli
    # reserve a tty - otherwise the container shuts down immediately
    # corresponds to the "-i" flag
    tty: true
    # mount the app directory of the host to /var/www in the container
    # corresponds to the "-v" option
    volumes:
      - ./app:/var/www
    # connect to the network
    # corresponds to the "--network" option
    networks:
      - web-network

在开始之前,我们将清理旧的容器:

docker rm -f $(docker ps -aq)

要测试docker-compose.yml,我们需要docker-compose up -dC:codebasedocker-php

cd "C:codebasedocker-php"
docker-compose up -d
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ docker-compose up -d
Creating network "docker-php_web-network" with the default driver
Building docker-php-cli
Step 1/2 : FROM php:7.0-cli
 ---> da771ba4e565
Step 2/2 : RUN pecl install xdebug-2.6.0     && docker-php-ext-enable xdebug
 ---> Using cache
 ---> 12be27256b12
Successfully built 12be27256b12
Successfully tagged docker-php_docker-php-cli:latest
Image for service docker-php-cli was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating docker-php_docker-php-cli_1 ... done

请注意,当我们docker-compose up第一次运行时,该图像是从头开始构建的。Adocker ps -a显示容器运行良好,我们可以从主机登录并执行源代码。

Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS               NAMES
adf794f27315        docker-php_docker-php-cli   "docker-php-entrypoi…"   3 minutes ago       Up 2 minutes                            docker-php_docker-php-cli_1

在登录

winpty docker exec -it docker-php_docker-php-cli_1 bash

并运行

php /var/www/hello-world.php

像以前一样工作

root@adf794f27315:/# php /var/www/hello-world.php
Hello World (php)

现在退出容器并运行

docker-compose down 

再次关闭容器:

Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ docker-compose down
Stopping docker-php_docker-php-cli_1 ... done
Removing docker-php_docker-php-cli_1 ... done
Removing network docker-php_web-network

将其余服务添加到docker-compose.yml文件中:

# tell docker what version of the docker-compose.yml we're using
version: '3'
# define the network
networks:
  web-network:
# start the services section
services:
  # define the name of our service
  # corresponds to the "--name" parameter
  docker-php-cli:
    # define the directory where the build should happened,
    # i.e. where the Dockerfile of the service is located
    # all paths are relative to the location of docker-compose.yml
    build: 
      context: ./php-cli
    # reserve a tty - otherwise the container shuts down immediately
    # corresponds to the "-i" flag
    tty: true
    # mount the app directory of the host to /var/www in the container
    # corresponds to the "-v" option
    volumes:
      - ./app:/var/www
    # connect to the network
    # corresponds to the "--network" option
    networks:
      - web-network
  docker-nginx:
    build: 
      context: ./nginx
    # defines the port mapping
    # corresponds to the "-p" flag
    ports:
      - "8080:80"
    tty: true
    volumes:
      - ./app:/var/www
      - ./nginx/conf.d:/etc/nginx/conf.d
    networks:
      - web-network
  docker-php-fpm:
    build: 
      context: ./php-fpm
    tty: true
    volumes:
      - ./app:/var/www
    networks:
      - web-network

再来...

docker-compose up -d
Pascal@Landau-Laptop MINGW64 /c/codebase/docker-php
$ docker-compose up -d
Building docker-nginx
Step 1/1 : FROM nginx:latest
 ---> ae513a47849c
Successfully built ae513a47849c
Successfully tagged docker-php_docker-nginx:latest
Image for service docker-nginx was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Building docker-php-fpm
Step 1/2 : FROM php:7.0-fpm
 ---> a637000da5a3
Step 2/2 : RUN pecl install xdebug-2.6.0     && docker-php-ext-enable xdebug
 ---> Running in 4ec27516df54
downloading xdebug-2.6.0.tgz ...
Starting to download xdebug-2.6.0.tgz (283,644 bytes)
[...]
---> 120c8472b4f3
Successfully built 120c8472b4f3
Successfully tagged docker-php_docker-php-fpm:latest
Image for service docker-php-fpm was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating docker-php_docker-nginx_1   ... done
Creating docker-php_docker-php-cli_1 ... done
Creating docker-php_docker-php-fpm_1 ... done

只需要构建nginx和php-fpm,因为php-cli已经存在。让我们检查是否仍可以在主机上的浏览器中打开http://127.0.0.1:8080/hello-world.php

php-fpm你好世界

我们可以!因此,我们现在无需再使用带有一堆参数的3个不同的命令了 docker-compose up -d。对我来说似乎是一种进步;)

tl;博士

整篇文章都有很多内容,当您“只是想开始”时,它很可能不是最有效的方法。因此,在本节中,我们将其简化为必要的步骤,而无需进行深入说明。

  • 下载适用于Windows的Docker
  • 安装Docker

    • 激活Hyper-V(Virtual Box将停止工作)
    • 在设置中启用磁盘共享
  • 设置以下文件夹结构

    C:codebasedocker-php
    + nginx
      + conf.d
        - site.conf
      - Dockerfile
    + php-cli
      - Dockerfile
    + php-fpm
      - Dockerfile
    + app
      - index.html
      - hello-world.html
    - docker-compose.yml
    • 或简单地 git clone [email protected]:paslandau/docker-php-tutorial.git docker-php && git checkout part_1_setting-up-php-php-fpm-and-nginx-for-local-development-on-docker
  • 在打开外壳 C:codebasedocker-php
  • docker-compose up -d
  • 通过浏览器签入

    • 127.0.0.1:8080
    • 127.0.0.1:8080/hello-world.php
  • docker-compose down

您的应用程序代码位于该app文件夹中,并且更改将自动对容器可用。此设置表示第一个教程的结尾。在下一部分中,我们将学习如何在PHPStorm中设置Docker,尤其是与xdebug结合使用时。


想保持联系吗?

自从您结束本博客以来,您从事软件开发(可能是PHP,Laravel,Docker或Google Big Query)的机会非常高,我非常喜欢反馈和网络。

所以-如果您想保持联系,请随时给我发送一封有关您自己的单词的电子邮件,并且/或者在LinkedInTwitter上与我联系, 或者只是订阅我的RSS feed, 或者走疯狂的路线并订阅通过邮件,别忘了发表评论:)

通过邮件订阅帖子

电子邮件地址

我们使用Mailchimp作为新闻通讯提供商。通过单击订阅,您确认您的信息将被传输到Mailchimp进行处理。 在此处了解有关Mailchimp的隐私惯例的更多信息。

挥舞着熊

评论


© www.pascallandau.com 2020年使用拼图构建[](https://github.com/tightenco/...

你可能感兴趣的:(设置PHP,PHP-FPM和NGINX以在Docker上进行本地开发)