关于docker:设置PHPPHPFPM和NGINX以在Docker上进行本地开发

46次阅读

共计 33750 个字符,预计需要花费 85 分钟才能阅读完成。

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.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。

顺便提一句。在 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:

咱们能够!因而,咱们当初无需再应用带有一堆参数的 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/…

正文完
 0