[Docker實踐系列-01]利用Docker搭建PHP開發環境

Docker 重要性不用多作解釋,咱們每天吵着雲原生,最重要的一門技術,你是否掌握了呢?從今天,一塊兒來docker吧! php

工具準備

VSCode請先確認是否安裝了Docker插件,若是沒有能夠安裝,這個是可視化的工具,用起來比較方便
html

image.png


安裝後就能看到Docker全部鏡像、容器、網絡、數據卷等的狀況
image.png

基礎環境跑起來

目標

nginx  和 php-fpm  的兩個docker可以互聯,讀取同一份代碼 mysql

步驟

拉取 nginx 基礎鏡像

docker pull nginx
nginx

image.png

快速啓動 nginx 容器

docker run --rm --name test-nginx -p 8080:80  nginxgit

參數解讀面試

docker run \    啓動容器 --rm \ 容器終中止後能夠自動清理容器和相關文件系統,方便調試,也避免每次都手動刪除而後重啓 --name test-nginx \  命名容器 -p 8080:80 \  開放端口 宿主機8080的請求映射到容器的80端口 nginx 基於的鏡像sql

如今能看到已經有一個 nginx 容器在運行
docker

image.png


請求瀏覽器,能看到咱們熟悉的頁面
image.png

指定宿主機目錄

藉助 -v 參數
爲了演示,在系統根目錄新建了一個 docker-server 目錄,文件和文件夾以下,本身實現的時候大可在 home 目錄下作數據庫

image.png


image.png

咱們把以前的容器刪除,從新執行命令windows

docker run
--rm
--name test-nginx
-p 8080:80
-v /docker-server/www:/usr/share/nginx/html
nginx

刷新頁面

image.png

若是嘗試修改宿主機的代碼內容,刷新頁面也能夠及時的展現,就再也不贅述

nginx 配置掛載宿主機文件

藉助 -v 參數,咱們在宿主機新增一個目錄存放 nginx 配置,而後指定容器 nginx 配置目錄掛載到宿主機
在執行命令以前,咱們先寫好一個配置

server {
    root /usr/share/nginx/html;
    index  index.html index.php;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
 
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
複製代碼

在 www 新增一個 php 文件

<?php

phpinfo();

複製代碼

此時咱們的目錄結構以下

image.png

執行命令

docker run
--rm
--name test-nginx
-p 8080:80
-v /docker-server/www:/usr/share/nginx/html
-v /docker-server/nginx:/etc/nginx/conf.d
nginx


刷新頁面

image.png


請求PHP頁面試試
image.png

又是一個熟悉的頁面
這種狀況第一感受是fpm處理php出錯了
咱們剛剛執行啓動nginx容器的命令是在前臺運行,能夠動態的看到nginx的請求日誌,以下
image.png


關鍵詞:connect() failed ??意思是鏈接失敗?在鏈接上游的時候鏈接被拒絕?
嗯!咱們好像還沒製做 fpm 的容器。如今動手

拉取 PHP-FPM鏡像

docker pull php:fpm

image.png

快速啓動PHP-FPM容器

docker run
--rm
--name php-app
php:fpm

如今咱們兩個容器都啓動了

image.png

刷新頁面
image.png

仍是老樣子,而且看到nginx的日誌以下
image.png


鏈接不上?就是說咱們請求 php 文件把這個請求交給 php-fpm 處理,可是nginx請求fpm的時候請求不了。由於在以前的同一臺機器裏,一個機器的各個端口只要處理好能夠容易的互通,如今跨容器如何鏈接呢?

容器的互聯

關於容器間的網絡,建議後續瞭解下文檔中 使用網絡 一節。容器是一個虛擬出來的盒子,每一個容器都至關於一個進程級別的虛擬環境,跨容器的互聯,這裏先介紹兩種方式,能夠用過幾個參數便可。

互聯方案一:使用 --link 參數指定鏈接容器

當你執行 docker run --help 能夠很清楚的看到全部可用命令參數
-l  分類處 有一個 --link

image.png

--link list      鏈接另一個容器

這就明白了。
一、咱們剛啓動的 fpm 容器不動,先修改 nginx 配置

server {
    root /usr/share/nginx/html;
    index  index.html index.php;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
 
    location ~ \.php$ {
        fastcgi_pass php-app:9000; # php-app就是咱們剛剛啓動的fpm的容器名字 9000也是它的默認監聽端口
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
複製代碼

二、增長 --link php-app 參數 以下從新啓動

docker run  
--rm --name test-nginx
-p 8080:80
-v /docker-server/www:/usr/share/nginx/html
-v /docker-server/nginx:/etc/nginx/conf.d
--link php-app
nginx

三、刷新頁面

image.png

沒有502,可是好像這個 php 文件沒找到?對了,咱們好像還指定fpm掛載項目代碼

四、咱們修改下 nginx 配置,指定 php 腳本查找的根目錄

server {
    root /usr/share/nginx/html;
    index  index.html index.php;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
 
    location ~ \.php$ {
         root /var/www/html; # PHP-FPM默認的根目錄
        fastcgi_pass php-app:9000; 
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
複製代碼

五、指定 fpm 掛載的項目根目錄,啓動 fpm 容器

docker run
--rm
--name php-app
-v /docker-server/www:/var/www/html
php:fpm


六、刷新頁面

image.png

互聯方案二:使用 --network 指定使用的容器網絡實現互聯

docker run --help  能看到對--network 的解釋

--network network                Connect a container to a network

在VSCode可視化窗口也能看到當前的網絡

image.png

一、爲了打通容器,咱們先要手動建立一個網絡
docker network create my-php-network

執行完就能夠在VSCode裏看到新建立的網絡
image.png

咱們接着上邊設置,換另一種方式連接容器

二、 重啓 fpm,用--network 顯式聲明使用的網絡

docker run
--rm
--name php-app
--network my-php-network
-v /docker-server/www:/var/www/html
php:fpm

三、 重啓 nginx,用--network 顯式聲明使用的網絡

docker run  
--rm --name test-nginx
-p 8080:80
-v /docker-server/www:/usr/share/nginx/html
-v /docker-server/nginx:/etc/nginx/conf.d
--network my-php-network
nginx

四、刷新頁面,仍舊是咱們熟悉的頁面

image.png

互聯方案三:Docker Compose

多個容器構建還有另一種方案,不過打算在另一節中單獨講。

遺留問題

一、鏈接數據庫
二、安裝php擴展

下篇預告

下一篇主要圍繞 Docker Compose 來編排一個項目,用 nginx php mysql 等作演示,一塊兒編寫一個 docker-compose.yml 文件,一鍵啓動項目。

參考

相關文章
相關標籤/搜索