主机通常都是直接yum配置好的Nginx+PHP-FPM+Mysql,因为业务须要,本来环境里面的php7,不能兼容遗留的php5.x的老程序了,可是又想在同一主机上跑起来,问题来了:php
因此个人想法,看图:html
前置任务配置启动docker,请参考如下内容mysql
在docker hub上PHP官方镜像,提供的docker image系列有nginx
php:<version>-cli
命令行版本,单独的phpphp:<version>-apache
和apache打包的phpphp:<version>-fpm
提供PHP-FPM服务的php由于本机已经安装了nginx, 因此只须要用php:5.3-apache
和php:5.6-fpm
就能够了。sql
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
原理是反向代理docker
... location / { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8080; } ...
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
原理仍是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为例,apache
# 进入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 安装扩展, 这个脚本会自动编译并配置指定的扩展bash
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页面查看是否生效.网络
因为Docker是桥接网络,因此从容器内向外链接,要链接外部主机的桥接地址
# 查看一下实际分配的IP地址 docker network inspect bridge
一般宿主主机的地址是172.17.0.1
,因此经过docker运行的php程序要想链接宿主主机数据库应该是这个地址。
数据库对用户登陆受权,也要是镜像的桥接地址,而不是localhost之类的本机地址。
本文由 ez 创做,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名做者且注明文章出处。