CentOS7 Docker配合宿主机nginx运行多版本php环境

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 

PHP Docker 镜像

主机一般都是直接yum配置好的Nginx+PHP-FPM+Mysql,由于业务需要,原本环境里面的php7,不能兼容遗留的php5.x的老程序了,但是又想在同一主机上跑起来,问题来了:

  1. 现有直接安装的Nginx、php7-fpm、mysql
  2. A 程序php 5.6编写 需要fpm
  3. B 程序php 5.3 ,而且是用apache做的url rewrite
  4. A、B程序还要链接本机mysql数据库

所以我的想法,看图:

Dokcer 安装

前置任务配置启动docker,请参考以下内容

选择php

在docker hub上PHP官方镜像,提供的docker image系列有

  • php:<version>-cli命令行版本,单独的php
  • php:<version>-apache 和apache打包的php
  • php:<version>-fpm 提供PHP-FPM服务的php

因为本机已经安装了nginx, 所以只需要用php:5.3-apachephp:5.6-fpm就可以了。

链接Nginx

配置 php5.3+Apache

启动 php5.3-apache

docker run --name php53apache -v /srv/www/apache:/var/www/html -v /srv/www/apache/php.ini:/usr/local/lib/php.ini -p 127.0.0.1:8080:80 -d  --restart=always --privileged=true php:5.3-apache

nginx配置

原理是反向代理

...
    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8080;
    }
...

配置 php5.6-FPM

启动php5.6-fpm

docker run --name php56fpm -v /srv/www/php56:/var/www/html -v /srv/www/php56/php.ini:/usr/local/lib/php.ini -p 127.0.0.1:9001:80 -d  --restart=always --privileged=true php:5.6-fpm

nginx配置

原理还是fast cgi到fpm上,需要注意到是文件地址,必须为容易内部地址

...
        location ~ \.php$ {
            root           /var/www/html; ### 这里必须指定容器内部的地址,默认就是这个路径
            fastcgi_pass   127.0.0.1:9001; ###我的端口是这个,按需修改
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /$document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
...

安装必要的工具和扩展

默认的镜像里面不带ifconfig, ping等工具, 也缺一些常用的扩展, 需要自行安装,以php5.6为例,

# 进入docker命令行
docker exec -it php56fpm /bin/bash
 
# 安装 ifconfig, ping
apt update
apt install net-tools iputils-ping
 
# 安装依赖(安装gd扩展等必须要先安装系统依赖)
apt install libfreetype6-dev libmcrypt-dev libpng-dev libjpeg-dev libpng-dev sendmail zlib1g-dev

用 docker-php-ext-install 安装扩展, 这个脚本会自动编译并配置指定的扩展

docker-php-ext-install mysql
docker-php-ext-install gd
docker-php-ext-install zip
docker-php-ext-install mbstring
docker-php-ext-install pdo_mysql

重启docker后, 刷新phpinfo页面查看是否生效.

连接Mysql

由于Docker是桥接网络,所以从容器内向外连接,要连接外部主机的桥接地址

# 查看一下实际分配的IP地址
docker network inspect bridge

通常宿主主机的地址是172.17.0.1,所以通过docker运行的php程序要想连接宿主主机数据库应该是这个地址。

数据库对用户登录授权,也要是镜像的桥接地址,而不是localhost之类的本机地址。

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读/书籍书单大全:

(点击右侧 即可打开个人博客内有干货):技术干货小栈
=====>>①【Java大牛带你入门到进阶之路】<<====
=====>>②【算法数据结构+acm大牛带你入门到进阶之路】<<===
=====>>③【数据库大牛带你入门到进阶之路】<<=====
=====>>④【Web前端大牛带你入门到进阶之路】<<====
=====>>⑤【机器学习和python大牛带你入门到进阶之路】<<====
=====>>⑥【架构师大牛带你入门到进阶之路】<<=====
=====>>⑦【C++大牛带你入门到进阶之路】<<====
=====>>⑧【ios大牛带你入门到进阶之路】<<====
=====>>⑨【Web安全大牛带你入门到进阶之路】<<=====
=====>>⑩【Linux和操作系统大牛带你入门到进阶之路】<<=====

天下没有不劳而获的果实,望各位年轻的朋友,想学技术的朋友,在决心扎入技术道路的路上披荆斩棘,把书弄懂了,再去敲代码,把原理弄懂了,再去实践,将会带给你的人生,你的工作,你的未来一个美梦。

发布了142 篇原创文章 · 获赞 17 · 访问量 8216

猜你喜欢

转载自blog.csdn.net/JKX_geek/article/details/104894961