這篇文章介紹的內容是關於Mac上透過docker配置PHP開發環境,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
安裝docker
關於MAC上安裝docker網路上有很多文章介紹,這裡我就不在做描述了,順便提一句,建議使用阿里雲或Daocloud提供的加速器。
本文推薦參考這篇文章:https://blog.csdn.net/jiang_x...
這篇文章相當於官方文件的中文版翻譯
使用docker-compose配置開發環境
一般基本的PHP開發環境包括PHP、PHP-FPM、WEB伺服器、MySQL資料庫,另外還會有Redis或memcache等相關NoSQL服務。我主要是透過docker-compose來配置服務。
什麼是docker-compose
docker-compose是一個透過YAML檔案來定義項目,項目中包含單一或多個容器服務。一般設定檔名為:docker-compose.yml。
目錄架構
你可以依照自己的喜好組織項目,以下是我用的方法,app 目錄放的是應用的程式碼,services 下面是建立服務需要用的東西,有些服務需要我們自己去建立映像,在一個Dockerfile 檔案裡說明一下你想要的映像是什麼樣的。在創建自訂鏡像的時候也可能需要用到一些額外的文件,例如一些配置文件,一般在創建鏡像的時候會把這些配置文件複製到鏡像裡。
MySQL
mysql是資料服務,先去為這個服務新增一個資料卷,然後在這個服務裡使用一下這個資料卷,把資料庫產生的資料放到這裡,這樣即使我們刪除容器,資料服務裡的資料也會保留在主機上,下回創建容器的時候,可以繼續使用已有的資料。在volumes 下面,加入一個名字是mysql 的資料卷:
volumes: mysql: driver: local
然後再去加入一個名字是MySQL的服務,指定一下服務使用的映像,這個映像我們也可以用自己建立的Dockerfile 去創建一下,或是你不打算訂製鏡像,也可以直接使用現成的,這裡我用了mysql:5.7 這個鏡像。注意最好設定具體要使用的版本。
這個鏡像裡有一些環境變量,我們可以在定義服務的時候去設定一下它們的值,這裡我設定了root 用戶的密碼,要創建的資料庫,用戶名,還有密碼,你可以根據自己的需求去修改這些變數的值。
在 mysql 服務上我用了 volumes 為它指定了一個 MySQL 資料卷,掛載的位置是容器的 /var/lib/mysql ,這是儲存資料庫的預設的地方。因為我本機安裝了MySQL服務,3306埠被佔用了,所以指定6306埠映射到容器的3306
version: "3"services: mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: "root" MYSQL_DATABASE: "app" MYSQL_USER: "app" MYSQL_PASSWORD: "123456" volumes: - ./services/mysql/data:/var/lib/mysql ports: - "6306:3306"
測試
在我們的compose 檔案現在已經有了一個叫mysql 的服務,在命令列工具下,進入到專案所在的目錄,執行:
docker-compose up
然後你會在終端機上看到安裝鏡像和啟動容器的過程,然後另開一個命令終端,執行:
docker-compose exec mysql bash
進入mysql容器中,然後進入資料庫檢查一下:
mysql -uroot -pshow databases; +--------------------+| Database | +--------------------+| information_schema | | app | | mysql | | performance_schema || sys | +--------------------+5 rows in set (0.03 sec)
这个时候我们发现mysql容器已经可用了
php
定义一个解释 php 的服务,我打算自己创建这个服务用的镜像,所以用了 build,而不是 image 。我告诉了 docker 自己要创建的这个镜像要使用的那个 Dockerfile 文件的位置(./services/php/Dockerfile)。
volumes 下面是服务用的数据卷,我把 compose 文件所在目录下的 app 这个目录,挂载到了容器的 /www/html/app 这个位置上了。这样我可以直接修改项目的代码,然后立即看到结果;同时由于本机9000端口被占用,指定9090端口映射到容器的9000端口
php: build: context: ./services/php dockerfile: Dockerfile volumes: - ./app:/www/html/app ports: - "9090:9000"
Dockerfile
构建 php 服务的镜像用的 Dockerfile 是 ./services/php/Dockerfile。FROM,设置了一下这个镜像要基于哪个镜像去创建,我用了 php:7.1-fpm 这个官方提供的镜像。RUN 了几行命令,主要是去安装一些软件包,比如一些额外的 php 扩展。在安装这些扩展之前 ,你需要先安装扩展依赖的一些其它的软件包,这里的 libpng12-dev,libjpeg-dev,就是 gd 这个 php 扩展需要的软件包。然后我又 COPY 了配置文件到镜像里面。
FROM php:7.1-fpm RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev \ && rm -rf /var/lib/apt/lists/* \ && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \ && docker-php-ext-install gd mysqli pdo_mysql zip opcache COPY ./config/php.ini /usr/local/etc/php/conf.d/php.ini
php服务中遇到的坑
PHP这个镜像中软件是使用的Debian的源,因为众所周知的缘故会导致镜像安装不成功,如图所示:
这个时候我们就需要更换源了,第一次换成了中科大的源,然后发现不行,第二次更换成了阿里云的源,完美完成镜像安装,修改过后的Dockerfile如下:
FROM php:7.1-fpm RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list \ && apt-get update && apt-get install -y libpng12-dev libjpeg-dev \ && rm -rf /var/lib/apt/lists/* \ && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \ && docker-php-ext-install gd mysqli pdo_mysql zip opcache COPY ./config/php.ini /usr/local/etc/php/conf.d/php.ini
使用sed命令搜索软件源文件,把Debian域名修改为阿里云域名
php.ini
自定义的 php 配置。把你想要的 php 配置放到这个文件里,重新 build 镜像,然后再次启动 php 服务的时候会用新的镜像重新创建容器,这样配置就会生效了。
memory_limit = 256Mpost_max_size = 100Mupload_max_filesize = 100M
Nginx
用 image 指定了要使用的镜像,ports 设置了发布的端口号,让主机上的 8000 对应容器的 80 。depends_on 可以设置服务的依赖,我让 nginx 服务依赖之前定义的 php ,这样会先启动 php ,然后再启动 nginx 。
另外我又用了 volumes 自己设置了一个数据卷,让主机上包含 nginx 配置文件的目录,对应容器里的 nginx 服务的配置文件目录,这样我就可以直接在本机上修改 nginx 的配置文件,然后重新启动一下 nginx 服务,配置就可以生效了。这种方法适用在开发环境上,因为修改了配置不需要重新 build 镜像,在生产环境中,你需要自己 build 这个 nginx 镜像,把想要的配置直接复制到镜像里去。在开发阶段有的时候我们需要查看nginx的日志,然后我配置了日志目录映射到容器,最后一个地址是代码目录
nginx: image: nginx:1.12.2 ports: - "8000:80" depends_on: - php volumes: - ./services/nginx/config:/etc/nginx/conf.d - ./services/nginx/logs:/etc/nginx/logs/ - ./app:/www/html/app
app.conf
./services/nginx/config/app.conf,这是一个最基本的 nginx 配置文件,设置了应用的 root 是在 /www/html/app 这里,我们已经把主机上的 app 目录挂载到了容器里的 /www/html/app 这个地方。
注意这条指令:fastcgi_pass php:9000; 这里的 php 是我们定义的 php 这个服务的名字,在 compose 文件里定义的服务,它们之间可以使用服务的名字相互进行沟通,因为 docker 内置了 DNS 功能。
server { listen 80; server_name localhost; root /www/html/app; # access_log /etc/nginx/logs/app.access.log main; location / { index index.html index.htm index.php; autoindex on; # include /usr/local/etc/nginx/conf.d/php-fpm;# include /usr/local/etc/nginx/conf.d/pathinfo.conf; if (!-e $request_filename) { ###一级目录下 rewrite ^/(.*)$ /index.php/$1 last; ###域名下的二级目录 #rewrite ^/html/(.*)$ /uuabc_home/index.php/$1 last; } } location = /info { allow 127.0.0.1; deny all; } location ~ \.php(.*)$ { # comment try_files $uri =404; to enable pathinfo # try_files $uri =404; fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include /etc/nginx/fastcgi_params; } # error_page 404 /404.html; # error_page 403 /403.html;}
启动
经过上面几个步骤,我们已经把PHP开发最基本的搞好了,下面我们准备看下成果。
在 app 目录下创建一个 index.php ,内容是:
<?php phpinfo();
进入到项目下面,执行:
docker-compose up
打开浏览器访问 http://localhost:8000/
,结果如图所示:
连接数据库
在app目录有一个adminer.php文件,这个文件是一个类似于PHPmyadmin的数据库管理工具,比较轻量级,访问http://localhost:8000/adminer.php
,如图所示:
在表单服务器选项中填写mysql,用户名root,密码填写安装MySQL服务时的root密码,然后登陆进去,如图所示:
然后我们就可以愉快的管理数据库了。
總結
至此,我們對PHP基本開發環境已經安裝好了,如果需要安裝比如Redis或memcache等服務的話,可以自行度娘,自己動手。
以下是我這個專案的原始碼,希望可以幫助到你,git位址:https://github.com/xiaodingchen/docker-lnmp
相關推薦:
以上是Mac上透過docker配置PHP開發環境的詳細內容。更多資訊請關注PHP中文網其他相關文章!

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 Linux新版
SublimeText3 Linux最新版

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。