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教程的已發佈部分
- 設置PHP,PHP-FPM和NGINX以在Docker上進行本地開發 (2018-07-08)
- 使用Xdebug設置PhpStorm以在Docker上進行本地開發 (2018-08-06)
- 為PHP項目構建Docker設置 (2019-05-20)
這是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將立即敦促您這樣做。
如果您同意,則將激活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
讓我們總結一下我們現在要做的一切:
- 啓動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/...