国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

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

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

2020-10-28 00:31PHP教程網 PHP教程

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

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

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

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

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

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

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

Pet 與 Cattle

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

  •     單容器易于分發(fā)、維護。因為它們是獨立的,所有的東西都運行在同一個容器中,這點就像是一個虛擬機。但這也意味著,當你要升級其中的某樣東西(比如PHP新版本)的時候, 需要重新構建整個容器。
  •     多容器可以在添加組件時提供更好的模塊化。因為每個容器包含了堆棧的一部分:Web、PHP、MySQL等,這樣可以單獨擴展每個服務或者添加服務,并且不需要重建所有的東西。

因為我比較懶,加上我需要在我的筆記本上放點別的內容,所以,這里我們只介紹單個容器的方法。
初始化工程

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

不管怎么樣,你可以讀一下。接下來如果還沒有composer命令的話,你可以創(chuàng)建一個屬于自己的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

帥呆了!下面來點實在的工作。

容器

構建一個運行標準Symfony項目且自給自足的容器相當容易,只需要安裝好常用的Nginx、PHP5-FPM和MySQL-Server即可,然后把預先準備好的Nginx的虛擬主機配置文件扔進去,再復制一些配置文件進去就完事了。

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

?
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"]

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

 

復制代碼 代碼如下:
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讓他們在前臺運行以便supervisord可以追蹤到他們。
然后,配置PHP5-FPM以指定的用戶運行Web-Server,并處理好文件權限。

接下來需要安裝一組配置文件,首先是Nginx的虛擬主機配置文件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;
  }
}

因為我們不需要域名,所以把server_name設成了_(有點像perl的$_占位符變量), 并配置根目錄(document root)為/svr/web, 我們會把應用程序部署在/srv下,剩下的就是標準的Mginx + PHP5-FPM配置.

因為一個容器每次只能運行一個程序, 我們需要supervisord(或者任何別的進程管理器,不過我比較中意supervisord)。幸運的是, 這個進程管理器會產生我們需要的所有進程!下面是一小段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

這里我們需要做的是定義所有的服務, 加上一個特殊的program:init進程,它不是一個實際的服務,而是一個獨創(chuàng)的運行啟動腳本的方式。

這個啟動腳本的問題在于,它通常需要先啟動某些服務。比如,你可能要初始化一些數據庫表,但前提是你得先把MySQL跑起來,一個可能的解決辦法 是,在啟動腳本中啟動MySQL,然后初始化表,然后為了防止影響到supervisord的進程管理,需要停掉MySQL,最后再啟動 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來運行它并且永不重啟。
實際的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啟動,然后根據環(huán)境變量DB_NAME創(chuàng)建DB,默認為symfony, 然后在INIT環(huán)境變量中查找要運行的腳本,并嘗試運行它。本文的結尾有說明如何使用這些環(huán)境變量。
構建并運行鏡像

萬事俱備只欠東風。我們還要構建Symfony Docker鏡像, 使用docker build命令:

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

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

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

我們來看看這一連串的選項分別是干嘛的:

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

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

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

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

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

用-e來運行它:

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

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

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

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

docker ps -aql 1 是個好用的命令,可以方便的檢索到最后一個容器的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.

當我們不從localhost(譯者注:容器的localhost)訪問dev controller時,得到了Symfony的默認錯誤消息,這再正常不過了, 因為我們不是從容器內部發(fā)送 curl 請求的, 所以,可以安全的從前端控制器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的時候就可以正常工作了,或者用瀏覽器訪問 http://localhost:49153/:

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

延伸 · 閱讀

精彩推薦
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 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日本在线不卡视频 | 97色伦97色伦国产欧美空 | 亚洲欧美日韩精品久久亚洲区 | 亚洲成人第一网站 | 亚洲精品视频观看 | 午夜日韩 | 99久久免费看视频 | 国产精品一区二区三区在线播放 | 不卡二区| 中文字幕一二三区 | 日日骚av | 91大全| 久久精品2019中文字幕 | 日韩三级 | 久久久久久中文字幕 | 成人精品一区二区 | 成年女人在线观看 | 欧美国产在线观看 | 黄色精品在线 | 欧美日韩国产在线 | 国产www视频 | 久久午夜剧场 | 日韩精品区 | 黄瓜av| 超级碰在线视频 | 免费又黄又爽又色的视频 | 免费网站在线 | 黄色免费网站观看 | 国产亚洲综合一区二区 | 午夜国产| 日韩一区二区三区视频 | 国户精品久久久久久久久久久不卡 | 国产精久久久 | 激情欧美一区二区免费视频 | 日日久| 欧美成人影院 | 亚洲激情精品 | 亚洲激情综合 | 欧美影视一区二区三区 | 国产日韩一区二区在线 | 日韩成人 |