激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - 搭建基于Docker的PHP開發(fā)環(huán)境的詳細(xì)教程

搭建基于Docker的PHP開發(fā)環(huán)境的詳細(xì)教程

2020-10-28 00:31PHP教程網(wǎng) PHP教程

這篇文章主要介紹了搭建基于Docker的PHP開發(fā)環(huán)境的詳細(xì)教程,Docker是當(dāng)下虛擬機(jī)技術(shù)的最佳選擇,需要的朋友可以參考下

現(xiàn)在很多開發(fā)者都使用Vagrant來管理他們的虛擬機(jī)開發(fā)環(huán)境,Vagrant確實(shí)很酷, 不過也有不少缺點(diǎn)(最主要的是它占用太多的資源)。在容器技術(shù)、Docker和更多類Docker技術(shù)出現(xiàn)后,解決這個(gè)問題就變得簡(jiǎn)單了。
免責(zé)聲明

由于boot2docker的工作方式,本文所述的方法在你的環(huán)境中可能無法正常運(yùn)行。如果需要在非Linux環(huán)境下共享文件夾到Docker容器,還需要注意更多額外的細(xì)節(jié)。后續(xù)我會(huì)寫篇文章專門來介紹實(shí)際遇到的問題。
怎樣才算是好的開發(fā)環(huán)境

首先,我們得知道什么才是好的開發(fā)環(huán)境, 對(duì)于我而言,一個(gè)好的開發(fā)環(huán)境需要具備以下幾個(gè)特點(diǎn):

  •     可隨意使用。我必須可以隨意刪除和創(chuàng)建新的環(huán)境。
  •     快速啟動(dòng)。我想要用它工作時(shí)候,它立馬就能用。
  •     易于更新。在我們行業(yè)中,事物發(fā)展變化非常快,必須能讓我很容易將我的開發(fā)環(huán)境更新到新的軟件版本。

而Docker都支持以上這些特點(diǎn),甚至更多。你幾乎可以即時(shí)銷毀和重建容器,而更新環(huán)境只需要重建你當(dāng)前使用的鏡像即可。
什么是PHP開發(fā)環(huán)境

目前Web應(yīng)用錯(cuò)綜復(fù)雜,PHP開發(fā)環(huán)境需要很多的東西,為了保證環(huán)境的簡(jiǎn)單性,需要做各種各樣的限制。
我們這次使用Nginx、PHP5-FPM、MySQL來運(yùn)行Synmfony項(xiàng)目。

Pet 與 Cattle

另一個(gè)我們要討論的重點(diǎn)是:我們要把開發(fā)環(huán)境部署在多容器還是單容器中。 兩種方式各有優(yōu)點(diǎn):

  •     單容器易于分發(fā)、維護(hù)。因?yàn)樗鼈兪仟?dú)立的,所有的東西都運(yùn)行在同一個(gè)容器中,這點(diǎn)就像是一個(gè)虛擬機(jī)。但這也意味著,當(dāng)你要升級(jí)其中的某樣?xùn)|西(比如PHP新版本)的時(shí)候, 需要重新構(gòu)建整個(gè)容器。
  •     多容器可以在添加組件時(shí)提供更好的模塊化。因?yàn)槊總€(gè)容器包含了堆棧的一部分:Web、PHP、MySQL等,這樣可以單獨(dú)擴(kuò)展每個(gè)服務(wù)或者添加服務(wù),并且不需要重建所有的東西。

因?yàn)槲冶容^懶,加上我需要在我的筆記本上放點(diǎn)別的內(nèi)容,所以,這里我們只介紹單個(gè)容器的方法。
初始化工程

首先要做的是初始化一個(gè)新的Symfony工程. 推薦的方法是用composer的create-project命令。本來可以在工作站上安裝composer,但是那樣太簡(jiǎn)單了。這次我們通過Docker來使用它。
我之前發(fā)過一篇關(guān)于Docker命令的文章:make docker commands(好吧,我說謊了,我本來把它寫在這篇文章中了,然后覺得把它獨(dú)立出來會(huì)比較好)。

不管怎么樣,你可以讀一下。接下來如果還沒有composer命令的話,你可以創(chuàng)建一個(gè)屬于自己的composer 別名。

?
1
$ alias composer="docker run -i -t -v \$PWD:/srv ubermuda/composer"

現(xiàn)在你可以初始化Symfony工程了:

?
1
$ composer create-project symfony/framwork-standard-edition SomeProject

帥呆了!下面來點(diǎn)實(shí)在的工作。

容器

構(gòu)建一個(gè)運(yùn)行標(biāo)準(zhǔn)Symfony項(xiàng)目且自給自足的容器相當(dāng)容易,只需要安裝好常用的Nginx、PHP5-FPM和MySQL-Server即可,然后把預(yù)先準(zhǔn)備好的Nginx的虛擬主機(jī)配置文件扔進(jìn)去,再?gòu)?fù)制一些配置文件進(jìn)去就完事了。

本容器的源代碼在GitHub上的 ubermuda/docker-symfony倉(cāng)庫(kù)中可以找到。 Dockerfile 是Docker構(gòu)建鏡像要用到的配置文件,我們來看一下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FROM debian:wheezy
 
ENV DEBIAN_FRONTEND noninteractive
 
RUN apt-get update -y
RUN apt-get install -y nginx php5-fpm php5-mysqlnd php5-cli mysql-server supervisor
 
RUN sed -e 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf
RUN sed -e 's/;listen\.owner/listen.owner/' -i /etc/php5/fpm/pool.d/www.conf
RUN sed -e 's/;listen\.group/listen.group/' -i /etc/php5/fpm/pool.d/www.conf
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
 
ADD vhost.conf /etc/nginx/sites-available/default
ADD supervisor.conf /etc/supervisor/conf.d/supervisor.conf
ADD init.sh /init.sh
 
EXPOSE 80 3306
 
VOLUME ["/srv"]
WORKDIR /srv
 
CMD ["/usr/bin/supervisord"]

我們通過擴(kuò)展 debian:wheezy 這個(gè)基礎(chǔ)鏡像開始,然后通過一系列的sed命令來配置Nginx和PHP5-FPM。

 

復(fù)制代碼 代碼如下:
RUN sed -e 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf
RUN sed -e 's/;listen\.owner/listen.owner/' -i /etc/php5/fpm/pool.d/www.conf
RUN sed -e 's/;listen\.group/listen.group/' -i /etc/php5/fpm/pool.d/www.conf
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

 

這里我們要做兩件事。 首先配置PHP5-FPM和Nginx讓他們?cè)谇芭_(tái)運(yùn)行以便supervisord可以追蹤到他們。
然后,配置PHP5-FPM以指定的用戶運(yùn)行Web-Server,并處理好文件權(quán)限。

接下來需要安裝一組配置文件,首先是Nginx的虛擬主機(jī)配置文件vhost.conf:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
  listen 80;
 
  server_name _;
 
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
 
  root /srv/web;
  index app_dev.php;
 
  location / {
    try_files $uri $uri/ /app_dev.php?$query_string;
  }
 
  location ~ [^/]\.php(/|$) {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
  }
}

因?yàn)槲覀儾恍枰蛎园裺erver_name設(shè)成了_(有點(diǎn)像perl的$_占位符變量), 并配置根目錄(document root)為/svr/web, 我們會(huì)把應(yīng)用程序部署在/srv下,剩下的就是標(biāo)準(zhǔn)的Mginx + PHP5-FPM配置.

因?yàn)橐粋€(gè)容器每次只能運(yùn)行一個(gè)程序, 我們需要supervisord(或者任何別的進(jìn)程管理器,不過我比較中意supervisord)。幸運(yùn)的是, 這個(gè)進(jìn)程管理器會(huì)產(chǎn)生我們需要的所有進(jìn)程!下面是一小段supervisord的配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[supervisord]
nodaemon=true
 
[program:nginx]
command=/usr/sbin/nginx
 
[program:php5-fpm]
command=/usr/sbin/php5-fpm
 
[program:mysql]
command=/usr/bin/mysqld_safe
 
[program:init]
command=/init.sh
autorestart=false
redirect_stderr=true
redirect_stdout=/srv/app/logs/init.log

這里我們需要做的是定義所有的服務(wù), 加上一個(gè)特殊的program:init進(jìn)程,它不是一個(gè)實(shí)際的服務(wù),而是一個(gè)獨(dú)創(chuàng)的運(yùn)行啟動(dòng)腳本的方式。

這個(gè)啟動(dòng)腳本的問題在于,它通常需要先啟動(dòng)某些服務(wù)。比如,你可能要初始化一些數(shù)據(jù)庫(kù)表,但前提是你得先把MySQL跑起來,一個(gè)可能的解決辦法 是,在啟動(dòng)腳本中啟動(dòng)MySQL,然后初始化表,然后為了防止影響到supervisord的進(jìn)程管理,需要停掉MySQL,最后再啟動(dòng) supervisord。

這樣的腳本看起來類似下面這樣:

?
1
2
3
4
5
/etc/init.d/mysql start
app/console doctrine:schema:update --force
/etc/init.d/mysql stop
 
exec /usr/bin/supervisord

 

看起來丑爆了有木有,咱換種方式,讓supervisor來運(yùn)行它并且永不重啟。
實(shí)際的init.sh腳本如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
 
RET=1
 
while [[ RET -ne 0 ]]; do
  sleep 1;
  mysql -e 'exit' > /dev/null 2>&1; RET=$?
done
 
DB_NAME=${DB_NAME:-symfony}
 
mysqladmin -u root create $DB_NAME
 
if [ -n "$INIT" ]; then
  /srv/$INIT
fi

腳本先等待MySQL啟動(dòng),然后根據(jù)環(huán)境變量DB_NAME創(chuàng)建DB,默認(rèn)為symfony, 然后在INIT環(huán)境變量中查找要運(yùn)行的腳本,并嘗試運(yùn)行它。本文的結(jié)尾有說明如何使用這些環(huán)境變量。
構(gòu)建并運(yùn)行鏡像

萬事俱備只欠東風(fēng)。我們還要構(gòu)建Symfony Docker鏡像, 使用docker build命令:

?
1
2
$ cd docker-symfony
$ docker build -t symfony .

現(xiàn)在,可以使用它來運(yùn)行你的Symfony工程了:

?
1
2
$ cd SomeProject
$ docker run -i -t -P -v $PWD:/srv symfony

我們來看看這一連串的選項(xiàng)分別是干嘛的:

  •     -i 啟動(dòng)交互(interactive)模式, 也就是說,STDIO(標(biāo)準(zhǔn)輸入輸出)連接到了你當(dāng)前的終端上。當(dāng)你要接收日志或者給進(jìn)程發(fā)送信號(hào)時(shí),它很有用。
  •     -t 為容器創(chuàng)建一個(gè)虛擬TTY, 它跟-i是好基友,通常一起使用。
  •     -P 告訴Docker守護(hù)進(jìn)程發(fā)布所有指定的端口, 本例中為80端口。
  •     -v $PWD:/srv 把當(dāng)前目錄掛載到容器的/srv目錄。掛載一個(gè)目錄使得目錄內(nèi)容對(duì)目標(biāo)掛載點(diǎn)可用。

現(xiàn)在你還記得之前提到的DB_NAME和INIT環(huán)境變量了吧,干嘛用的呢:用于自定義你的環(huán)境。 基本上你可以通過 docker run的-e選項(xiàng)在容器中設(shè)置環(huán)境變量,啟動(dòng)腳本會(huì)拿到環(huán)境變量,因此,如果你的DB名為some_project_dev, 你就可以這么運(yùn)行容器:

?
1
$ docker run -i -t -P -v $PWD:/srv -e DB_NAME=some_project_dev symfony

INIT 環(huán)境變量就更強(qiáng)大了,它允許你啟動(dòng)時(shí)運(yùn)行指定的腳本。比如, 你有一個(gè)bin/setup腳本運(yùn)行composer install命令并且設(shè)置數(shù)據(jù)庫(kù)schema:

?
1
2
3
#!/bin/bash
composer install
app/console doctrine:schema:update --force

用-e來運(yùn)行它:

?
1
2
3
4
$ docker run -i -t -P \
  -v $PWD:/srv \
  -e DB_NAME=some_project_dev \
  -e INIT=bin/setup

注意,-e選項(xiàng)可以在docer run中多次使用,看起來相當(dāng)酷。另外,你的啟動(dòng)腳本需要可執(zhí)行權(quán)限(chmod +x)。

現(xiàn)在我們通過curl發(fā)送請(qǐng)求到容器,來檢查一下是否所有的東西都像預(yù)期一樣工作。首先,我們需要取到Docker映射到容器的80端口的公共端口,用docker port命令:

?
1
2
$ docker port $(docker ps -aql 1) 80
0.0.0.0:49153

docker ps -aql 1 是個(gè)好用的命令,可以方便的檢索到最后一個(gè)容器的id, 在我們的例子中,Docker 把容器的80端口映射到了49153端口。我們 curl 一下看看。

?
1
$ curl http://localhost:49153
?
1
You are not allowed to access this file. Check app_dev.php for more information.

當(dāng)我們不從localhost(譯者注:容器的localhost)訪問dev controller時(shí),得到了Symfony的默認(rèn)錯(cuò)誤消息,這再正常不過了, 因?yàn)槲覀儾皇菑娜萜鲀?nèi)部發(fā)送 curl 請(qǐng)求的, 所以,可以安全的從前端控制器web/app_dev.php中移除這些行。

?
1
2
3
4
5
6
7
8
9
// This check prevents access to debug front controllers that are deployed by accident to production servers.
// Feel free to remove this, extend it, or make something more sophisticated.
if (isset($_SERVER['HTTP_CLIENT_IP'])
  || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
  || !(in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1''fe80::1''::1')) || php_sapi_name() === 'cli-server')
) {
  header('HTTP/1.0 403 Forbidden');
  exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}

這些行阻止了任何從localhost以外的地方訪問dev controller。
現(xiàn)在再curl的時(shí)候就可以正常工作了,或者用瀏覽器訪問 http://localhost:49153/:

搭建基于Docker的PHP開發(fā)環(huán)境的詳細(xì)教程

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 暴力强行进如hdxxx | 福利免费视频 | 国产精品免费麻豆入口 | 亚洲午夜国产 | 日韩av片网站 | 成人久久一区二区 | 免费人成年短视频在线观看网站 | 久久手机在线视频 | 欧美成人理论片乱 | 国产在线午夜 | 免费一级欧美 | 国产精品成人一区二区三区吃奶 | 国产精品成人一区二区三区吃奶 | 欧美日韩中文字幕在线 | 日本欧美中文字幕 | 日日草夜夜操 | 91av爱爱 | 亚洲一区中文字幕 | 免费毛片电影 | 成年性羞羞视频免费观看无限 | 国产精品.com | 成人福利电影在线观看 | 91中文在线 | www.99热视频 | 国产午夜精品理论片a级探花 | 欧美日韩亚洲在线 | 九九热免费精品视频 | 久久艳片 | 99精品视频在线 | 男女生羞羞视频网站在线观看 | 高清视频91 | 在线成人毛片 | 亚洲国产一区二区三区 | 免费看搡女人无遮挡的视频 | 91精品国产综合久久久欧美 | 成人一区二区在线观看视频 | av播播 | 激情在线视频 | 看个毛片| 国产一区二区精品免费 | 久草在线观看首页 |