[docker部署php环境]


apache模式

docker run -it --rm --name my-apache-php-app  -p 8000:80 -v "$PWD":/var/www/html php:5.4-apache


fpm模式配置过程

docker run -it --rm --name my-fpm-php-app  -p 9000:9000 -v "$PWD":/var/www/html php:5.4-fpm


配置nginx(物理机部署)

编辑/etc/nginx/sites-available/default ,添加如下行

location ~* \.php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}

nginx -s reload


nginx container + fpm模式

1.启动fpm容器

docker run -d --name my-fpm-php-app  -v /root/src:/var/www/html php:5.4-fpm


2.启动nginx服务器并link到fpm

docker run --name my-nginx -d -p 8080:80 --link my-fpm-php-app:fpm nginx


3.查看fpm的ip地址及端口号

docker exec -it my-nginx "/bin/bash"

进入后使用env命令查看环境变量,输出如下,可以看到fpm对应的ip及端口号

root@05cb669a483f:/# envFPM_PORT_9000_TCP_ADDR=172.17.0.20HOSTNAME=05cb669a483fFPM_PORT_9000_TCP_PORT=9000FPM_NAME=/my-nginx/fpmFPM_PORT_9000_TCP_PROTO=tcpFPM_ENV_PHP_INI_DIR=/usr/local/etc/phpFPM_ENV_PHP_VERSION=5.4.45PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binPWD=/NGINX_VERSION=1.9.5-1~jessieFPM_ENV_GPG_KEYS=F38252826ACD957EF380D39F2F7956BC5DA04B5DFPM_PORT=tcp://172.17.0.20:9000SHLVL=1HOME=/rootFPM_PORT_9000_TCP=tcp://172.17.0.20:9000FPM_ENV_PHP_EXTRA_CONFIGURE_ARGS=--enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data_=/usr/bin/env




4.修改容器中/etc/nginx/conf.d/default.conf文件,在容器内不能修改,先复制到本地后修改

docker cp my-nginx:/etc/nginx/conf.d/default.conf ./default.conf


修改内容如下


location ~* \.php$ {    fastcgi_index   index.php;    fastcgi_pass    172.17.0.20:9000;    include         fastcgi_params;    fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;}


docker cp  ./default.conf  my-nginx:/etc/nginx/conf.d/default.conf


5.reload 容器中的nginx 

docker exec -it my-nginx "/bin/bash"

在容器中执行nginx -s reload



备注:访问过程中可能会报错:”File not found“,解决办法是吧default.conf 文件中


fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;

替换为绝对路径

fastcgi_param   SCRIPT_FILENAME    /var/www/html$fastcgi_script_name;




思路一:link时 nignx容器内会有fpm相关的环境变量,如何利用环境变量?sed 控制变量值读取环境变量


思路二:以fpm为baseimage,集成nginx,使用Supervisor或CFEngine同时吊起多个进程


使用Supervisor,容器内同时启动nginx以及fpm

root用户下新建目录

mkdir nginx-fpm
cd nginx-fpm

创建文件default.conf用来取代nginx默认配置文件


server {    listen       80;    server_name  localhost;    #charset koi8-r;    #access_log  /var/log/nginx/log/host.access.log  main;    location / {        root   /usr/share/nginx/html;        index  index.html index.htm;    }    #error_page  404              /404.html;    # redirect server error pages to the static page /50x.html    #    error_page   500 502 503 504  /50x.html;    location = /50x.html {        root   /usr/share/nginx/html;    }    # proxy the PHP scripts to Apache listening on 127.0.0.1:80    #    #location ~ \.php$ {    #    proxy_pass   http://127.0.0.1;    #}    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000    #    #location ~ \.php$ {    #    root           html;    #    fastcgi_pass   127.0.0.1:9000;    #    fastcgi_index  index.php;    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;    #    include        fastcgi_params;    #}     location ~* \.php$ {         fastcgi_index   index.php;         fastcgi_pass    127.0.0.1:9000;         include         fastcgi_params;         fastcgi_param   SCRIPT_FILENAME    /var/www/html$fastcgi_script_name;         fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;     }    # deny access to .htaccess files, if Apache's document root    # concurs with nginx's one    #    #location ~ /\.ht {    #    deny  all;    #}}

创建文件supervisord.conf


[supervisord]nodaemon=true[program:sshd]user=rootcommand=/usr/sbin/sshd -D[program:php]user=rootcommand=/usr/local/sbin/php-fpm[program:nginx]user=rootcommand=/usr/sbin/nginx -g "daemon off;"



创建文件Dockerfile  


FROM php:5.4-fpmMAINTAINER Jiashiwen "shiwen4@leju.com"#Install NginxRUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62RUN echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.listENV NGINX_VERSION 1.9.5-1~jessieRUN apt-get update && \    apt-get install -y ca-certificates nginx=${NGINX_VERSION} # forward request and error logs to docker log collectorRUN ln -sf /dev/stdout /var/log/nginx/access.logRUN ln -sf /dev/stderr /var/log/nginx/error.logCOPY  default.conf /etc/nginx/conf.d/default.confVOLUME ["/var/cache/nginx"]#Install SupervisorRUN apt-get update && apt-get install -y openssh-server supervisor && \    rm -rf /var/lib/apt/lists/*RUN mkdir -p /var/run/sshd /var/run/nginx /var/log/supervisor /var/run/php-fpmCOPY supervisord.conf /etc/supervisor/conf.d/supervisord.confEXPOSE 80 443 9000 22CMD ["/usr/bin/supervisord"]



构建docker image


docker build -t nginx-fpm .


启动docker 容器

docker run --rm -p 8888:80 -v /home/develop/Desktop:/var/www/html --name mynginxfpm nginx-fpm

-p参数用于映射端口号,格式为localport:containerport;-v用于映射目录,格式为localvolume:containervolume


nginx-fpm与mysql集成

root用户下新建目录

mkdir nginx-fpm
cd nginx-fpm

创建文件default.conf用来取代nginx默认配置文件


server {    listen       80;    server_name  localhost;    #charset koi8-r;    #access_log  /var/log/nginx/log/host.access.log  main;    location / {        root   /usr/share/nginx/html;        index  index.html index.htm;    }    #error_page  404              /404.html;    # redirect server error pages to the static page /50x.html    #    error_page   500 502 503 504  /50x.html;    location = /50x.html {        root   /usr/share/nginx/html;    }    # proxy the PHP scripts to Apache listening on 127.0.0.1:80    #    #location ~ \.php$ {    #    proxy_pass   http://127.0.0.1;    #}    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000    #    #location ~ \.php$ {    #    root           html;    #    fastcgi_pass   127.0.0.1:9000;    #    fastcgi_index  index.php;    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;    #    include        fastcgi_params;    #}     location ~* \.php$ {         fastcgi_index   index.php;         fastcgi_pass    127.0.0.1:9000;         include         fastcgi_params;         fastcgi_param   SCRIPT_FILENAME    /var/www/html$fastcgi_script_name;         fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;     }    # deny access to .htaccess files, if Apache's document root    # concurs with nginx's one    #    #location ~ /\.ht {    #    deny  all;    #}}

创建文件supervisord.conf


[supervisord]nodaemon=true[program:sshd]user=rootcommand=/usr/sbin/sshd -D[program:php]user=rootcommand=/usr/local/sbin/php-fpm[program:nginx]user=rootcommand=/usr/sbin/nginx -g "daemon off;"


创建文件Dockerfile  

在其中添加php mysql扩展包

FROM php:5.4-fpmMAINTAINER Jiashiwen "shiwen4@leju.com"#Install mysql moduleRUN apt-get update && apt-get install -y \        libfreetype6-dev \        libjpeg62-turbo-dev \        libmcrypt-dev \        libpng12-dev \    && docker-php-ext-install iconv mcrypt \    && docker-php-ext-configure mysql \    && docker-php-ext-install mysql#Install NginxRUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62RUN echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.listENV NGINX_VERSION 1.9.5-1~jessieRUN apt-get update && \    apt-get install -y ca-certificates nginx=${NGINX_VERSION} # forward request and error logs to docker log collectorRUN ln -sf /dev/stdout /var/log/nginx/access.logRUN ln -sf /dev/stderr /var/log/nginx/error.logCOPY  default.conf /etc/nginx/conf.d/default.confVOLUME ["/var/cache/nginx"]#Install SupervisorRUN apt-get update && apt-get install -y openssh-server supervisor && \    rm -rf /var/lib/apt/lists/*RUN mkdir -p /var/run/sshd /var/run/nginx /var/log/supervisor /var/run/php-fpmCOPY supervisord.conf /etc/supervisor/conf.d/supervisord.confEXPOSE 80 443 9000 22CMD ["/usr/bin/supervisord"]



构建docker image


docker build -t nginx-fpm .


root用户下载官方mysql镜像

docker pull mysql



启动mysql container

docker run  -p 3306:3306  -v /my/own/datadir:/var/lib/mysql --name mydb -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.6

-p参数映射mysql端口号以便再外部通过GUI客户端操作mysql数据库;-v参数映射数据文件到本地目录;-e参数制定mysql数据库root用户的口令。


创建相应的数据库、表并添加数据


create database yueche_leju_com;use yueche_leju_com;CREATE TABLE `yueche_log` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `admin_id` int(11) DEFAULT NULL COMMENT '管理员ID',  `type` varchar(50) DEFAULT NULL COMMENT '操作标识',  `info` text COMMENT '内容',  `create_time` datetime DEFAULT NULL COMMENT '记录时间',  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;SELECT * FROM yueche_leju_com.yueche_log;insert into yueche_leju_com.yueche_log values(123,344,"fds","fds","20150509104509");commit;



编写测试代码dbtest.php

<?php$dbhost = getenv('MYDB_PORT_3306_TCP_ADDR');$username = 'root';$userpass = getenv('MYDB_ENV_MYSQL_ROOT_PASSWORD');$dbdatabase = 'yueche_leju_com';//生成一个连接$db_connect=mysql_connect($dbhost, $username, $userpass) or die("Unable to connect to the MySQL!"); //选择一个需要操作的数据库mysql_select_db($dbdatabase,$db_connect); //执行MySQL语句$result=mysql_query("SELECT * FROM yueche_log");//提取数据while($row = mysql_fetch_row($result)) {  echo '<pre>'; var_dump($row);}?>


启动nginx-fpm container


docker run --rm --link mydb -p 8888:80 -v /home/develop/Desktop:/var/www/html  -e MYSQL_DBNAME=testdb --name mynginxfpm nginx-fpm


通过浏览器验证

​ http://localhost:8888/dbtest.php​



nginx-fpm+mysql+redis集成

root用户下新建目录

mkdir nginx-fpm
cd nginx-fpm

创建文件default.conf用来取代nginx默认配置文件


server {    listen       80;    server_name  localhost;    #charset koi8-r;    #access_log  /var/log/nginx/log/host.access.log  main;    location / {        root   /usr/share/nginx/html;        index  index.html index.htm;    }    #error_page  404              /404.html;    # redirect server error pages to the static page /50x.html    #    error_page   500 502 503 504  /50x.html;    location = /50x.html {        root   /usr/share/nginx/html;    }    # proxy the PHP scripts to Apache listening on 127.0.0.1:80    #    #location ~ \.php$ {    #    proxy_pass   http://127.0.0.1;    #}    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000    #    #location ~ \.php$ {    #    root           html;    #    fastcgi_pass   127.0.0.1:9000;    #    fastcgi_index  index.php;    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;    #    include        fastcgi_params;    #}     location ~* \.php$ {         fastcgi_index   index.php;         fastcgi_pass    127.0.0.1:9000;         include         fastcgi_params;         fastcgi_param   SCRIPT_FILENAME    /var/www/html$fastcgi_script_name;         fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;     }    # deny access to .htaccess files, if Apache's document root    # concurs with nginx's one    #    #location ~ /\.ht {    #    deny  all;    #}}

创建文件supervisord.conf


[supervisord]nodaemon=true[program:sshd]user=rootcommand=/usr/sbin/sshd -D[program:php]user=rootcommand=/usr/local/sbin/php-fpm[program:nginx]user=rootcommand=/usr/sbin/nginx -g "daemon off;"


创建文件Dockerfile  

在其中添加php mysql扩展包以及redis扩展包


FROM php:5.4-fpmMAINTAINER Jiashiwen "shiwen4@leju.com"#Install mysql moduleRUN apt-get update && apt-get install -y \        libfreetype6-dev \        libjpeg62-turbo-dev \        libmcrypt-dev \        libpng12-dev \    && docker-php-ext-install iconv mcrypt \    && docker-php-ext-configure mysql \    && docker-php-ext-install mysql#Install redis moduleRUN curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/2.2.7.tar.gz \    && tar xfz /tmp/redis.tar.gz \    && rm -r /tmp/redis.tar.gz \    && mv phpredis-2.2.7 /usr/src/php/ext/redis \    && docker-php-ext-install redis#Install NginxRUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62RUN echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> /etc/apt/sources.listENV NGINX_VERSION 1.9.5-1~jessieRUN apt-get update && \    apt-get install -y ca-certificates nginx=${NGINX_VERSION} # forward request and error logs to docker log collectorRUN ln -sf /dev/stdout /var/log/nginx/access.logRUN ln -sf /dev/stderr /var/log/nginx/error.logCOPY  default.conf /etc/nginx/conf.d/default.confVOLUME ["/var/cache/nginx"]#Install SupervisorRUN apt-get update && apt-get install -y openssh-server supervisor && \    rm -rf /var/lib/apt/lists/*RUN mkdir -p /var/run/sshd /var/run/nginx /var/log/supervisor /var/run/php-fpmCOPY supervisord.conf /etc/supervisor/conf.d/supervisord.confEXPOSE 80 443 9000 22CMD ["/usr/bin/supervisord"]



构建docker image


docker build -t nginx-fpm .


root用户下载官方mysql镜像

docker pull mysql


启动mysql container

docker run  -p 3306:3306  -v /my/own/datadir:/var/lib/mysql --name mydb -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.6

-p参数映射mysql端口号以便再外部通过GUI客户端操作mysql数据库;-v参数映射数据文件到本地目录;-e参数制定mysql数据库root用户的口令。


创建相应的数据库、表并添加数据


create database yueche_leju_com;use yueche_leju_com;CREATE TABLE `yueche_log` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `admin_id` int(11) DEFAULT NULL COMMENT '管理员ID',  `type` varchar(50) DEFAULT NULL COMMENT '操作标识',  `info` text COMMENT '内容',  `create_time` datetime DEFAULT NULL COMMENT '记录时间',  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;SELECT * FROM yueche_leju_com.yueche_log;insert into yueche_leju_com.yueche_log values(123,344,"fds","fds","20150509104509");commit;



编写测试代码dbtest.php


<?php//-------------------数据库测试----------------------$dbhost = getenv('MYDB_PORT_3306_TCP_ADDR');$username = 'root';$userpass = getenv('MYDB_ENV_MYSQL_ROOT_PASSWORD');$dbdatabase = 'yueche_leju_com';//生成一个连接$db_connect=mysql_connect($dbhost, $username, $userpass) or die("Unable to connect to the MySQL!"); //选择一个需要操作的数据库mysql_select_db($dbdatabase,$db_connect); //执行MySQL语句$result=mysql_query("SELECT * FROM yueche_log");//提取数据while($row = mysql_fetch_row($result)) {  echo '<pre>'; var_dump($row);}//-----------------------redis测试---------------------//$redis_config = getenv('SINASRV_CACHE_REDIS_HOST');  //形如 127.0.0.1:6379//list($host, $port) = explode(":", $redis_config);$config = array(   'host' => getenv('MYREDIS_PORT_6379_TCP_ADDR'),                 'port' => getenv('MYREDIS_PORT_6379_TCP_PORT'));var_dump($config);if(class_exists('Redis')){ try{    $redis  = new Redis();    $redis->connect($config['host'], $config['port']);    $redis->ping(); }catch(Exception $e){   $redis = NULL;  }}else{ die('can not to initial Redis!'); }//设置$redis->setex('test_key', 60, 'hello world!');//获取$test_value = $redis->get('test_key');if($test_value){ echo 'The Redis is running! and the value of "test_key" is : "'.$test_value.'"';}?>


下载redis镜像


docker pull redis



启动redis container


docker run -d -p 6379:6379  --name myredis redis



启动nginx-fpm container


docker run --rm --link mydb --link myredis -p 8888:80 -v /home/develop/Desktop:/var/www/html  -e MYSQL_DBNAME=testdb --name mynginxfpm nginx-fpm



通过浏览器验证

​ http://localhost:8888/dbtest.php​