centos docker容器化部署nginx php項(xiàng)目實(shí)踐
一、nginx和php的一些原理
1、nginx 是一個(gè) web 服務(wù)器,它只能處理靜態(tài)文件,無(wú)法處理 PHP Python 等具體程序語(yǔ)言的請(qǐng)求。所以,原理是這樣,用戶統(tǒng)一先請(qǐng)求到 nginx,nginx 會(huì)再把請(qǐng)求轉(zhuǎn)發(fā)給 php-fpm。
2、php-fpm是處理 PHP 請(qǐng)求的一個(gè)東西,實(shí)現(xiàn)了 FastCGI 協(xié)議的一個(gè)東西,它叫PHP FastCGI 管理器。
3、 FastCGI 是什么?是一種與 Web 服務(wù)器通信的協(xié)議,規(guī)定了要傳什么數(shù)據(jù),具體什么格式。
二、前提條件
centos,安裝了docker環(huán)境,當(dāng)然你也可以安裝寶塔,他倆不沖突,寶塔里可以方便的看到docker的一些東西。
php 鏡像有fpm和cli兩個(gè)版本。php-cli是命令行版本,而php-fpm是作為apache或者nginx等服務(wù)器軟件處理PHP文件的擴(kuò)展。這里選擇fpm。
三、下載php和nginx鏡像
docker pull nginx docker pull php:8.0-fpm
四、創(chuàng)建并運(yùn)行PHP容器
mkdir -p /docker/www docker run --name php8.0 -p 9000:9000 -v /docker/www:/www -d php:8.0-fpm
--name php8.0
給容器取個(gè)名字-p 9000:9000
php容器的端口默認(rèn)是9000,映射到宿主機(jī)的9000端口-v /docker/www:/www
把宿主機(jī)的PHP源代碼目錄/docker/www
掛載到容器內(nèi)的/www
。未來(lái)在容器內(nèi)訪問(wèn)/www
就相當(dāng)于訪問(wèn)宿主機(jī)的/docker/www
,容器的刪除不會(huì)影響到源代碼。-d
后臺(tái)靜默運(yùn)行php:8.0-fpm
鏡像名
如:報(bào)錯(cuò)
Error response from daemon: driver failed programming external connectivity on endpoint XXX(端口映射或啟動(dòng)容器時(shí)報(bào)錯(cuò))
解決方法:輸入指令 systemctl restart docker 重啟docker服務(wù)及可重新生成自定義鏈DOCKER
查php容器在docker的內(nèi)網(wǎng)地址
docker inspect 獲取Docker容器或者Docker鏡像的元數(shù)據(jù)
docker inspect --format='{{.NetworkSettings.IPAddress}}' php8.0
我的是172.17.0.2
,這個(gè)如果你安裝了寶塔的話也可以再寶塔里看到,這個(gè)ip下邊要用。
也可以直接通過(guò)查看元數(shù)據(jù)里的IPAddress
字段來(lái)獲取ip
docker inspect php8.0
五、創(chuàng)建并運(yùn)行nginx容器
1、 創(chuàng)建一個(gè)存放配置文件的目錄。這個(gè)目錄等下要掛載到容器里。
mkdir -p /docker/nginx/conf.d
2、 進(jìn)入目錄并創(chuàng)建一個(gè)配置文件,并在里面填入如下內(nèi)容。比如 vim siyucms.com.conf
,一個(gè)站點(diǎn)一個(gè)配置文件。
# 服務(wù)端配置節(jié)點(diǎn) server { # 監(jiān)聽(tīng)端口。此端口不能被占用了 listen 80; # 此站點(diǎn)的域名,多個(gè)用空格隔開(kāi)(注意localhost是本機(jī)的意思,你可以刪掉) server_name www.siyucms.com siyucms.com localhost; # 此站點(diǎn)的入口目錄。這里要注意,這是當(dāng)前容器內(nèi)的路徑。訪問(wèn) /www就相當(dāng)于訪問(wèn)宿主機(jī)的項(xiàng)目路徑/docker/www。 root /www/01_siyucms_com/public; # 入口目錄里可識(shí)別的入口文件 index index.php index.html index.htm default.php default.htm default.html; # Thinkphp的偽靜態(tài)設(shè)置 location / { #訪問(wèn)路徑的文件不存在則重寫(xiě)URL轉(zhuǎn)交給ThinkPHP處理 if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } } # 配置url,圖片等資源文件 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { # 緩存100天 expires 100d; # 不寫(xiě)日志 error_log /dev/null; access_log off; } # 配置url,前端的js css資源文件 location ~ .*\.(js|css)?$ { expires 12h; error_log /dev/null; access_log off; } # 配置url,處理及轉(zhuǎn)發(fā)PHP請(qǐng)求 location ~ \.php(/|$) { # 入口文件 fastcgi_index index.php; # PHP項(xiàng)目的IP和端口。這是php-fpm的地址。由于nginx處理不了PHP代碼,所以需要把請(qǐng)求轉(zhuǎn)發(fā)給php-fpm進(jìn)行處理。 fastcgi_pass 172.17.0.2:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 用戶的訪問(wèn)日志。注意,這目錄必須存在,否則nginx將啟動(dòng)不了。由于我把宿主機(jī)的項(xiàng)目路徑www掛載到了容器內(nèi)的/www目錄,所以宿主機(jī)的項(xiàng)目路徑www里需要有wwwlogs目錄。 access_log /www/wwwlogs/siyucms.com.log; # 錯(cuò)誤日志 error_log /www/wwwlogs/siyucms.com.error.log; }
創(chuàng)建并啟動(dòng) nginx 容器
docker run --name nginx -p 80:80 -d -v /docker/www:/www -v /docker/nginx/conf.d:/etc/nginx/conf.d nginx
- -v /docker/www:/www 把宿主機(jī)的源碼目錄 /docker/www 掛載到容器內(nèi)的 /www 目錄。容器內(nèi)訪問(wèn) /www 就相當(dāng)于訪問(wèn) /docker/www
- -v /docker/nginx/conf.d:/etc/nginx/conf.d 把宿主機(jī)的配置目錄,掛載到容器內(nèi)nginx的配置目錄。nginx 會(huì)自動(dòng)去加載這目錄內(nèi)所有的配置文件。/opt/docker/nginx/conf.d 里建議每個(gè)站點(diǎn)對(duì)應(yīng)一個(gè)配置文件。
六、驗(yàn)證
1、docker ps -a
看是否運(yùn)行了剛才的兩個(gè)容器
2、/docker/www/01_siyucms_com
目錄里上傳ThinkPHP的最新代碼
3、訪問(wèn)你的域名或IP看是否可以訪問(wèn)。注意我綁定了三個(gè)域名,localhost可以讓我通過(guò)ip直接訪問(wèn)到
七、鏈接宿主機(jī)mysql
只需要注意ip不是127.0.0.1就可以了,ip為172.17.0.1
感興趣的可以了解另一篇文章:Docker容器的程序連接宿主機(jī)的MySQL
八、安全
9000端口暴露很危險(xiǎn),需要修改為不暴露到公網(wǎng)上,只暴露內(nèi)網(wǎng)就可以了
宿主機(jī)nginx鏈接docker的php
當(dāng)前為寶塔面板安裝了php和nginx,現(xiàn)在需要docker安裝新的php環(huán)境
1、首先通過(guò)寶塔面板添加一個(gè)網(wǎng)站,并測(cè)試是否可訪問(wèn),網(wǎng)站目錄為
www/wwwroot/www_siyucms_com
可通過(guò)docker里添加容器,也可直接命令行里添加容器,這里為了方便把網(wǎng)站目錄掛載到docker同目錄
docker run --name php8.0 -p 9000:9000 -v /www/wwwroot/www_siyucms_com:/www/wwwroot/www_siyucms_com -d php:8.0-fpm
2、找到docker容器的局域網(wǎng)IP,參考上邊,也可直接通過(guò)寶塔面板看到
3、寶塔中設(shè)置這個(gè)網(wǎng)站的php版本為自定義并修改鏈接配置為 172.18.0.2:9000
或者 127.0.0.1:9001
,這里需要注意,如果寫(xiě)127.0.0.1則是你當(dāng)前宿主機(jī)鏈接到docker的端口,也可以直接寫(xiě)docker的局域網(wǎng)ip和開(kāi)放的端口
4、通過(guò)ifconfig命令獲取到宿主機(jī)mysql的ip并修改鏈接mysql的地址為172.18.0.1
5、設(shè)置一下mysql的訪問(wèn)權(quán)限,寶塔面板中設(shè)置mysql這個(gè)數(shù)據(jù)的權(quán)限,為指定ip,通過(guò)逗號(hào)分割
172.18.0.3,1270.0.1
6、設(shè)置runtime unplad目錄等的權(quán)限為777
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
ssh 直接登錄docker容器的操作方法(不用通過(guò)宿主機(jī)進(jìn)入)
這篇文章主要介紹了ssh 直接登錄docker容器的操作方法(不用通過(guò)宿主機(jī)進(jìn)入),本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06docker安裝nginx之后無(wú)法訪問(wèn)的解決
這篇文章主要介紹了docker安裝nginx之后無(wú)法訪問(wèn)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Docker容器添加映射端口的兩種實(shí)現(xiàn)方法
本文主要介紹了Docker容器添加映射端口的兩種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07修改Docker容器內(nèi)文件的三種實(shí)現(xiàn)方式
這篇文章主要介紹了修改Docker容器內(nèi)文件的三種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08