首頁 後端開發 php教程 避坑!用 Docker 搞定 PHP 開發環境搭建

避坑!用 Docker 搞定 PHP 開發環境搭建

Jul 30, 2019 pm 02:11 PM
docker

避坑!用Docker 搞定PHP 開發環境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)

因為最近換電腦的緣故需要重新部署一下本地的開發環境,之前採用的虛擬機方案,佔用磁碟空間實在太大,心疼SSD 那麼點地方,所以這次採用了Docker 的方案來部署。

關於這次部署的原則,我的想法是盡量使用官方的鏡像來實現,盡量不改動或少改動鏡像。因為是本地的開發環境,所以想多嚐嚐鮮,盡量使用高版本的軟體來實現。

從結果上來說,希望能給同樣有需要搭建環境的同學起到一些幫助,少踩一些坑,如果能按照這篇文章的步驟一次搞定那是最好了。

先來說一下環境:

Docker 18.09.2
Nginx 1.17.1
PHP 7.3.7
XDebug 2.7.2
PhpStorm 2019.1.3
VSCode 1.36.1
登入後複製

1、Docker 的安裝

這裡大家直接在Docker 官網下載Docker for Mac 就好了,直接按照提示操作即可,此處就不贅述了。

2、安裝Nginx

位址:https://hub.docker.com/_/nginx

直接執行docker pull nginx 拉取最新的鏡像;

根據上面的地址我們可以看到官方提供的一些文檔,我們按照操作即可,我個人採用的方案是先將nginx 的整個配置目錄copy 到本地一份,然後在運行的時候將目錄綁定到nginx 容器的配置目錄,這樣修改配置會更加方便。

將nginx 設定目錄copy 到本地:

$ docker run --name tmp-nginx -d nginx
$ docker cp tmp-nginx:/etc/nginx /Users/yourname/Workspace/etc/nginx
$ docker rm -f tmp-nginx
登入後複製

說明:/Users/yourname/Workspace/etc,這個是我個人的工作目錄,到時候根據情況換成自己的就行;指令的作用就是啟動一個後台運行的nginx 容器,將配置目錄copy 出來之後終止運行並刪除容器。

可以先運行看看效果:

$ docker run --name run-nginx -d -p 80:80 -v /Users/yourname/Workspace/www:/usr/share/nginx/html:ro nginx
登入後複製

說明:-v 參數綁定本地的一個目錄到nginx 容器中的web 目錄,這裡面沒有綁定配置目錄,大家可以在web 目錄下建立一個hello.html,透過瀏覽器存取http://localhost/hello.html 看看效果,之後可以大家可以先刪除容器,後面我們改完設定再來啟動它。

刪除方法:

$ docker rm -f run-nginx
登入後複製

3、安裝php-fpm

#網址:https://hub.docker.com/_/php

因為這裡我們需要安裝一些開發時用到的PHP 擴展,所以最好的方法是根據Dockerfile 生成我們自己的鏡像,如下是我的Dockerfile,大家可以參考,可以根據情況刪減不需要的擴展,否則產生的鏡像會比較大。

Dockerfile 內容如下:

# 从官方基础版本构建
FROM php:7.3.7-fpm
# 官方版本默认安装扩展: 
# Core, ctype, curl
# date, dom
# fileinfo, filter, ftp
# hash
# iconv
# json
# libxml
# mbstring, mysqlnd
# openssl
# pcre, PDO, pdo_sqlite, Phar, posix
# readline, Reflection, session, SimpleXML, sodium, SPL, sqlite3, standard
# tokenizer
# xml, xmlreader, xmlwriter
# zlib
# 更新为国内镜像
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \
    && echo 'deb http://mirrors.163.com/debian/ stretch main non-free contrib' > /etc/apt/sources.list \
    && echo 'deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib' >> /etc/apt/sources.list \
    && echo 'deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib' >> /etc/apt/sources.list \
    && apt-get update
# bcmath, calendar, exif, gettext, sockets, dba, 
# mysqli, pcntl, pdo_mysql, shmop, sysvmsg, sysvsem, sysvshm 扩展
RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm iconv
# GD 扩展
RUN apt-get install -y --no-install-recommends libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
    && rm -r /var/lib/apt/lists/* \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd
# imagick 扩展
RUN export CFLAGS="$PHP_CFLAGS" CPPFLAGS="$PHP_CPPFLAGS" LDFLAGS="$PHP_LDFLAGS" \
    && apt-get install -y --no-install-recommends libmagickwand-dev \
    && rm -r /var/lib/apt/lists/* \
    && pecl install imagick-3.4.4 \
    && docker-php-ext-enable imagick
# mcrypt 扩展 
RUN apt-get install -y --no-install-recommends libmcrypt-dev \
    && rm -r /var/lib/apt/lists/* \
    && pecl install mcrypt-1.0.2 \
    && docker-php-ext-enable mcrypt
# Memcached 扩展 
RUN apt-get install -y --no-install-recommends libmemcached-dev zlib1g-dev \
    && rm -r /var/lib/apt/lists/* \
    && pecl install memcached-3.1.3 \
    && docker-php-ext-enable memcached
# redis 扩展
RUN pecl install redis-5.0.0 && docker-php-ext-enable redis
# opcache 扩展 
RUN docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache
# xdebug 扩展
RUN pecl install xdebug-2.7.2 && docker-php-ext-enable xdebug
# swoole 扩展
RUN pecl install swoole-4.4.0 && docker-php-ext-enable swoole
# 镜像信息
LABEL Author="Stone"
LABEL Version="2019.7"
LABEL Description="PHP 7.3.7 开发环境镜像.
登入後複製

說明:這個Dockerfile 我參考了https://www.jianshu.com/p/20fcca06e27e 作者的內容,並做了一些調整,大家可以根據自己情況增減,因為是開發環境所以最好把xdebug 留著,咱們後面也會用到;

下面是將RUN 串聯起來的Dockerfile,這樣生成的鏡像能小一些,但是仍然有636M,官方的php:7.3.7-fpm 的鏡像是371M,如果想優化也可以從官方提供的Alpine 鏡像生成,咱們這裡就先簡單粗暴了。

FROM php:7.3.7-fpm
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \
    && echo 'deb http://mirrors.163.com/debian/ stretch main non-free contrib' > /etc/apt/sources.list \
    && echo 'deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib' >> /etc/apt/sources.list \
    && echo 'deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib' >> /etc/apt/sources.list \
    && apt-get update \
    && export CFLAGS="$PHP_CFLAGS" CPPFLAGS="$PHP_CPPFLAGS" LDFLAGS="$PHP_LDFLAGS" \
    && apt-get install -y --no-install-recommends libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmagickwand-dev libmcrypt-dev libmemcached-dev zlib1g-dev \
    && rm -rf /var/lib/apt/lists/* \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm iconv gd \
    && pecl install imagick-3.4.4 mcrypt-1.0.2 memcached-3.1.3 redis-5.0.0 xdebug-2.7.2 swoole-4.4.0\
    && docker-php-ext-enable imagick mcrypt memcached redis xdebug swoole \
    && docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache
LABEL Author="Stone"
LABEL Version="2019.7"
LABEL Description="PHP 7.3.7 开发环境镜像. "
登入後複製

說一下踩的坑:apt-get 的源最好換成國內的源,否則可能會在構建鏡像的時候卡死;因為默認情況下官方容器是基於Debian 的,查找源的時候很多都是過時的,如當前的Debian 代號是stretch,卻使用了jessie 的包那肯定是會報錯的,“E: Unable to correct problems, you have held broken packages.”;大家直接按照我上面的Dockerfile 產生鏡像即可,測試通過。

在Dockerfile 所在目錄下執行:

docker build -t my-php-fpm:2019.7 .
登入後複製

-t 參數設定鏡像名稱和標籤,請根據自己情況命名,鏡像建立完成之後,可以像上面我們copy 出nginx 配置一樣,將php 的相關配置也copy 到本機。

$ docker run --name tmp-my-php-fpm -d my-php-fpm:2019.7
$ docker cp tmp-my-php-fpm:/usr/local/etc /Users/yourname/Workspace/etc/php
$ docker rm -f tmp-my-php-fpm
登入後複製

4、修改nginx、php-fpm、xdebug 的設定檔

修改nginx 設定文件,開啟/ Users/yourname/Workspace/etc/nginx/default .conf,加入下面的內容:

location ~ \.php$ {
        fastcgi_pass   php-fpm-container:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
        fastcgi_param  SCRIPT_NAME      $fastcgi_script_name;
        include        fastcgi_params;
    }
登入後複製

增加的內容裡面有一處需要說明,「php-fpm-container」 這個是咱們自己創建的php-fpm 容器的別名,具體是在運行時候指定的,之後咱們會提到。

修改 php 相關設定文件,進入 / Users/yourname/Workspace/etc/php 下,將 php.ini-development 複製改名為 php.ini,設定內容依自己狀況修改即可。

修改xdebug 的設定文件,/Users/yourname/Workspace/etc/php/conf.d/docker-php-ext-xdebug.ini,加入以下內容

xdebug.remote_enable = On
xdebug.remote_handler = dbgp
xdebug.remote_host = host.docker.internal 
xdebug.remote_port = 9001
xdebug.remote_log = /var/log/php/xdebug.log
xdebug.idekey = PHPSTOR
登入後複製

以上設定主要是開啟xdebug 的遠端調試模式,因為php-fpm 使用了9000 端口,所以這裡我們把xdebug 的端口改為9001;“host.docker.internal” 是docker 18.03 新加入的,可以解析獲得宿主機的ip 位址,這樣就不用寫死ip 位址了。

5、啟動 php-fpm、nginx 容器

$ docker run --name run-my-php-fpm \
-v /Users/yourname/Workspace/www:/var/www/html \
-v /Users/yourname/Workspace/etc/php:/usr/local/etc \
-v /Users/yourname/Workspace/log/php:/var/log/php \
-d my-php-fpm:2019.7
$ docker run --name run-nginx \
-p 80:80 \
--link run-my-php-fpm:php-fpm-container \
-v /Users/yourname/Workspace/www:/usr/share/nginx/html \
-v /Users/yourname/Workspace/etc/nginx:/etc/nginx \
-v /Users/yourname/Workspace/log/nginx:/var/log/nginx \
-d nginx
登入後複製

说明:我将配置目录、日志目录和 web 目录都分别进行了绑定,方便在本地环境中修改。还记得上面提到的 nginx 中有个配置填写的 “php-fpm-container” 吗?实际上就是在这里指定的,连接两个容器,并给 php-fpm 容器起了个别名,配置中通过别名访问。

在 / Users/yourname/Workspace/www 中创建一个 phpinfo.php 文件,输出 php 信息,通过 http://localhost/phpinfo.php 访问来查看。

避坑!用 Docker 搞定 PHP 開發環境搭建

6、安装 Chrome 浏览器插件 xdebug helper

可能会被墙,请自行解决。

7、PhpStorm 调试环境配置

建立 / Users/yourname/Workspace/www/xdebug/demo.php,php 文件里面随便写点 php 代码,也可以通过 PhpStorm 新建立一个空项目,但是位置要在我们和 php-fpm 容器绑定的目录。

菜单:PhpStorm->Preferences… 进入偏好设置,按照下图进行设置。

避坑!用 Docker 搞定 PHP 開發環境搭建

根据上图提示进入 CLI Interpreter 设置窗口,点 “+” 添加配置。

避坑!用 Docker 搞定 PHP 開發環境搭建

避坑!用 Docker 搞定 PHP 開發環境搭建

继续配置 Debug 相关设置,如下图:

避坑!用 Docker 搞定 PHP 開發環境搭建

进入主界面,选择右上的 “Add Configuration...”

避坑!用 Docker 搞定 PHP 開發環境搭建

进入 debug 配置窗口后选择 “+”,选择 “PHP Web Page“,设置名称后进入 Servers 设置,同时设置 Start URL:“/xdebug/demo.php”

避坑!用 Docker 搞定 PHP 開發環境搭建

避坑!用 Docker 搞定 PHP 開發環境搭建

进入主窗口,在程序中打几个断点,然后点击那个绿色的甲虫就可以了。

避坑!用 Docker 搞定 PHP 開發環境搭建

8、VSCode 调试环境配置

首先安装 PHP Debug 插件,然后打开上面创建的 xdebug 目录。如下图所示,进入调试面板,点齿轮选择 PHP,然后会创建一个 launch.json 文件,修改这个文件加入 pathMappings 配置,这个配置参数用于设置服务器路径与本地路径的对应关系,低版本使用的是 localSourceRoot 和 serverSourceRoot,目前已经被废除。另外记得将端口改为 9001。

避坑!用 Docker 搞定 PHP 開發環境搭建

避坑!用 Docker 搞定 PHP 開發環境搭建

进入 demo.php,随意设置两个断点,然后点左侧的运行按钮,进入调试模式,接下来刷新 http://localhost/xdebug/demo.php 会返回到 VSCode 的调试窗口,左侧已经列出调试信息,可选择单步执行跟踪程序的运行。

避坑!用 Docker 搞定 PHP 開發環境搭建

避坑!用 Docker 搞定 PHP 開發環境搭建

结尾:实际上这次部署环境踩了不少坑,主要原因是网上的资料都比较陈旧,很多文章也没有后续的更新,或者方向和我不太一致,例如 hub 中直接就有 xdebug 的镜像,但是我还是想尽量用官方提供的镜像自己创建,为了避免踩坑,大家最好还是多多参考官方文档,一般都写的比较清楚了。

以上是避坑!用 Docker 搞定 PHP 開發環境搭建的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

docker怎麼退出容器 docker怎麼退出容器 Apr 15, 2025 pm 12:15 PM

退出 Docker 容器的四種方法:容器終端中使用 Ctrl D 快捷鍵容器終端中輸入 exit 命令宿主機終端中使用 docker stop <container_name> 命令宿主機終端中使用 docker kill <container_name> 命令(強制退出)

docker容器名稱怎麼查 docker容器名稱怎麼查 Apr 15, 2025 pm 12:21 PM

可以通過以下步驟查詢 Docker 容器名稱:列出所有容器(docker ps)。篩選容器列表(使用 grep 命令)。獲取容器名稱(位於 "NAMES" 列中)。

docker內的文件怎麼拷貝到外面 docker內的文件怎麼拷貝到外面 Apr 15, 2025 pm 12:12 PM

Docker 中將文件拷貝到外部主機的方法:使用 docker cp 命令:執行 docker cp [選項] <容器路徑> <主機路徑>。使用數據卷:在主機上創建目錄,在創建容器時使用 -v 參數掛載該目錄到容器內,實現文件雙向同步。

docker怎麼重啟 docker怎麼重啟 Apr 15, 2025 pm 12:06 PM

重啟 Docker 容器的方法:獲取容器 ID(docker ps);停止容器(docker stop <container_id>);啟動容器(docker start <container_id>);驗證重啟成功(docker ps)。其他方法:Docker Compose(docker-compose restart)或 Docker API(參考 Docker 文檔)。

docker怎麼啟動mysql docker怎麼啟動mysql Apr 15, 2025 pm 12:09 PM

在 Docker 中啟動 MySQL 的過程包含以下步驟:拉取 MySQL 鏡像創建並啟動容器,設置根用戶密碼並映射端口驗證連接創建數據庫和用戶授予對數據庫的所有權限

docker怎麼更新鏡像 docker怎麼更新鏡像 Apr 15, 2025 pm 12:03 PM

更新 Docker 鏡像的步驟如下:拉取最新鏡像標記新鏡像為特定標籤刪除舊鏡像(可選)重新啟動容器(如果需要)

docker怎麼啟動容器 docker怎麼啟動容器 Apr 15, 2025 pm 12:27 PM

Docker 容器啟動步驟:拉取容器鏡像:運行 "docker pull [鏡像名稱]"。創建容器:使用 "docker create [選項] [鏡像名稱] [命令和參數]"。啟動容器:執行 "docker start [容器名稱或 ID]"。檢查容器狀態:通過 "docker ps" 驗證容器是否正在運行。

docker怎麼創建容器 docker怎麼創建容器 Apr 15, 2025 pm 12:18 PM

在 Docker 中創建容器: 1. 拉取鏡像: docker pull [鏡像名] 2. 創建容器: docker run [選項] [鏡像名] [命令] 3. 啟動容器: docker start [容器名]

See all articles