主機通常都是直接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 中國大陸許可協議 進行許可。 可自由轉載、引用,但需署名做者且註明文章出處。