设置PHP,PHP-FPM和NGINX以在Docker上进行本地开发
2021/3/18 14:11:32
本文主要是介绍设置PHP,PHP-FPM和NGINX以在Docker上进行本地开发,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
pascallandau.com
- 家
- 关于
- 博客
- BIGQUERY片段
- 个人财务
设置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教程的已发布部分
- 设置PHP,PHP-FPM和NGINX以在Docker上进行本地开发 (2018-07-08)
- 使用Xdebug设置PhpStorm以在Docker上进行本地开发 (2018-08-06)
- 为PHP项目构建Docker设置 (2019-05-20)
这是Docker上(可能)多部分系列的第一部分。第二部分介绍了如何在Docker容器中设置PHP,以便在使用XDebug时与PHPStorm良好配合。
目录
介绍
- 前提条件
- 为什么要使用Docker?
- 从无业游民过渡
- 设置Docker
设置PHP cli容器
- 在PHP容器中安装Xdebug
- 使用Dockerfile持久保留映像更改
使用php-fpm和nginx设置Web堆栈
- 设置nginx
设置php-fpm
- 安装xdebug
- 连接nginx和php-fpm
- 放在一起:认识docker-compose
- tl;博士
介绍
前提条件
我假设您已经为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将立即敦促您这样做。
如果您同意,则将激活Hyper-V和容器功能,并启动重新启动。请参阅在Windows 10上安装Hyper-V 以再次将其停用。
注意:VirtualBox之后将停止工作!从VirtualBox界面或通过启动我的一台以前的机器vagrant up
失败,并显示错误消息
VT-x不可用(VERR_VMX_NO_VMX)
重新启动后,Docker将自动启动,并出现一个欢迎屏幕。
我们可以忽略它(关闭窗口)。此外,新图标将添加到系统托盘中。右键单击将显示上下文菜单。
打开选项卡“ Shared Devices”,然后在您要与Docker容器共享的主机上勾选硬盘。
注意:稍后,我们仍然需要为实际的容器定义显式的路径映射,但是必须在此处提供该路径所属的硬盘驱动器。单击“应用”后,将提示您输入凭据
接下来,打开选项卡“高级”。实际上,您不必更改任何设置,但是,如果您(像我一样)没有C:/
设置为最大分区,则可能需要更改“磁盘映像位置”。我把我放在C:Hyper-VVirtual Hard DisksMobyLinuxVM.vhdx
。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 '<?php echo "Hello World (php)n"; ?>' > 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 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
看起来不错!现在让我们自定义一些内容:
- 将根指向
/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
文件的内容。
如果您想了解有关在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.conf
Windows主机上的文件更改为将所有与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。
顺便提一句。在geekyplatypus.com上还有一个很好的教程,介绍如何使用Nginx和PHP7-FPM对 您的PHP应用程序进行Docker化。但由于它使用的是docker-compose,因此您可能需要先阅读下一章:)
放在一起:认识docker-compose
让我们总结一下我们现在要做的一切:
- 启动php-cli
- 启动nginx
- 启动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 -d
从C: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:
我们可以!因此,我们现在无需再使用带有一堆参数的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 git@github.com: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)的机会非常高,我非常喜欢反馈和网络。
所以-如果您想保持联系,请随时给我发送一封有关您自己的单词的电子邮件,并且/或者在LinkedIn或 Twitter上与我联系, 或者只是订阅我的RSS feed, 或者走疯狂的路线并订阅通过邮件,别忘了发表评论:)
通过邮件订阅帖子
电子邮件地址
名
我们使用Mailchimp作为新闻通讯提供商。通过单击订阅,您确认您的信息将被传输到Mailchimp进行处理。 在此处了解有关Mailchimp的隐私惯例的更多信息。
评论
[](https://twitter.com/PascalLan...
- [](https://de.linkedin.com/in/pa...
- [](https://github.com/paslandau/)
- [](https://www.pascallandau.com/...
© www.pascallandau.com 2020年使用拼图构建[](https://github.com/tightenco/...
这篇关于设置PHP,PHP-FPM和NGINX以在Docker上进行本地开发的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23怎么实现安卓+php 热更新方案?-icode9专业技术文章分享
- 2024-11-22PHP 中怎么实现判断多个值是否为空、null 或者为 false?-icode9专业技术文章分享
- 2024-11-11开源 PHP 商城项目 CRMEB 二次开发和部署教程
- 2024-11-09怎么使用php在kaufland平台刊登商品?-icode9专业技术文章分享
- 2024-11-05PHP的抽象类和接口是什么,有什么区别-icode9专业技术文章分享
- 2024-11-01开源 PHP 商城项目 CRMEB 安装和使用教程
- 2024-11-01用php和mysql写无限分类,有哪几种方法-icode9专业技术文章分享
- 2024-10-31php数据分表导出时部分数据无法导出什么原因-icode9专业技术文章分享
- 2024-10-30有经验的 PHP 开发者学习一门新的编程语言,有哪些推荐的有前景的语言-icode9专业技术文章分享
- 2024-10-21php 检测图片是否篡改过-icode9专业技术文章分享