使用Docker link搭建PHP开发环境
一般我们会把nginx、php都安装在同一个容器,为了扩展方便,我们希望nginx容器和php容器分开。那么就可以使用docker link命令实现这一目的。
需要的镜像:
- nginx 1.12.2
- php(含php-fpm7.1) 7.1
这里nginx镜像选择daocloud.io/library/nginx:1.12.2-alpine,php镜像自行编译(选用的是 https://github.com/52fhy/docker-images 里的php56-fpm-centos68-withext和php71-fpm-centos68-phalcon-withext)。
实践
运行 php-fpm :
docker run -d --restart=always --name yphp \
-v /work/:/work/ \
-v "/work/yphp/php/etc/":/usr/local/php/etc/ \
php71-fpm-centos68-phalcon-withext
--restart=always 使得容器开机随着docker服务自行启动。-v指定宿主机和容器的目录映射关系。
这里的/work/yphp来自 https://github.com/52fhy/yphp 。
/work里面包含的子目录:
/work
|-- www
|---yphp
/www是项目目录,yphp是nginx和php配置目录,映射到容器,方便本地修改。
运行 nginx :
docker run -d --restart=always --name some-nginx -p 80:80 --link yphp:yphp \
-v /work/:/work/ \
-v /work/yphp/nginx/conf/:/etc/nginx/ \
-v /work/yphp/nginx/logs/:/etc/nginx/logs/ \
daocloud.io/library/nginx:1.12.2-alpine
选用nginx:1.12.2-alpine是因为该镜像非常小。
命令不是很多,但是有很多注意点,必须仔细查看,否则可能导致服务不正常:
1、对于php-fpm容器来说,php-fpm的www.conf配置文件里,监听的IP导致不能是127.0.0.1,必须是0.0.0.0;否则会导致后续nginx这边出现404(查看问题)。
;listen = 127.0.0.1:9000
listen = 0.0.0.0:9000
2、nginx容器必须使用--link连接到php-fpm容器。
3、nginx容器和php-fpm容器的www目录必须是一致的。
4、nginx容器配置fastcgi_pass的时候需要修改为--link里的名称(实际为主机名称,会在nginx容器的/etc/hosts新增一条主机记录)。
5、如果nginx容器需要支持更多端口访问,那么使用-p范围表示,示例:-p 80-90:80-90。或者多个-p参数。
6、-v参数指定的本地挂载目录(示例里的/work)子目录(例如/www)在宿主机不能是软链接,否则会导致nginx 404,因为软链接在容器里是无效的。但是/work本身可以是软链接。
nginx配置:
hello.cc.conf
server {
listen 80;
server_name hello.cc;
access_log logs/access.log;
error_log logs/error.log;
root /work/yphp/php/;
index index.php index.html index.htm;
location ~ \.php$ {
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass yphp:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
注意这里的fastcgi_pass已做改动。
运行多个版本PHP
docker run -d --restart=always --privileged --name yphp56 --env COLUMNS=`tput cols` --env LINES=`tput lines` -p 9000:9000 -p 9400-9499:9400-9499 \
-v /work/:/work/ \
-v "/work/yphp/php/etc56/":/usr/local/php/etc/ \
php56-fpm-centos68-withext
docker run -d --restart=always --privileged --name yphp --env COLUMNS=`tput cols` --env LINES=`tput lines` -p 9001:9000 -p 9500-9600:9500-9600 \
-v /work/:/work/ \
-v /work/:/alidata/ \
-v "/work/yphp/php/etc/":/usr/local/php/etc/ \
php71-fpm-centos68-phalcon-withext
docker run -d --restart=always --name some-nginx -p 80-90:80-90 --link yphp56 --link yphp \
-v /work/:/work/ \
-v /work/yphp/nginx/conf/:/etc/nginx/ \
-v /work/yphp/nginx/logs/:/etc/nginx/logs/ \
daocloud.io/library/nginx:1.12.2-alpine
对于使用了--link的nginx容器来说,php-fpm容器的-p参数实际没有产生作用,可以省略不写。
这里面的/work对于宿主机来说都是同一个目录。
使用docker ps查看状态是否都是UP:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
221c6ffb19dd daocloud.io/library/nginx:1.12.2-alpine "nginx -g 'daemon of…" 12 minutes ago Up 2 seconds 0.0.0.0:80-90->80-90/tcp some-nginx
02a4f9d804f7 php71-fpm-centos68-phalcon-withext "/run.sh" 24 minutes ago Up 3 seconds 80/tcp, 0.0.0.0:9001->9000/tcp yphp
a9decc06558e php56-fpm-centos68-withext "/run.sh" 25 minutes ago Up 3 seconds 80/tcp, 0.0.0.0:9000->9000/tcp yphp56
说明正常。
如果本地是Mac或者Linux且安装的是Docker(非ToolBox之类),使用127.0.0.1就可以看到nginx已经运行了。添加127.0.0.1 hello.cc到/etc/hosts(非Windows)后访问http://hello.cc/可以看到phpinfo信息。试着修改/work/yphp/nginx/conf/vhost/hello.cc.conf里的fastcgi_pass端口为9001,然后重启nginx容器或者重启nginx容器里的nginx服务,会发现phpinfo显示的PHP版本变成了PHP7.1。
# 重启nginx容器
docker restart some-nginx
# 重启nginx容器里的nginx服务
docker exec some-nginx nginx -s reload
参考
1、docker容器连接问题:nginx 和 php-fpm --link后并无法正常解析php程序,求解
https://segmentfault.com/q/1010000006148224/a-1020000013359135
2、在docker 上使用alpine linux建立简易静态网站 - CSDN博客
http://blog.csdn.net/becivells/article/details/51599186
3、Docker多容器连接-以Nginx+PHP为例 - 程序猿成长计划 - SegmentFault 思否
https://segmentfault.com/a/1190000002949036
4、Nginx调用远程php-fpm - 指间&流年 - 博客园
https://www.cnblogs.com/feiyafeiblog/p/6938515.html
5、基于boot2docker部署Docker环境 - 飞鸿影 - 博客园
https://www.cnblogs.com/52fhy/p/8413029.html
使用Docker link搭建PHP开发环境的更多相关文章
- PyCharm使用之利用Docker镜像搭建Python开发环境
在我们平时使用PyCharm的过程中,一般都是连接本地的Python环境进行开发,但是如果是离线的环境呢?这样就不好搭建Python开发环境,因为第三方模块的依赖复杂,不好通过离线安装包的方式安装 ...
- 使用Docker快速搭建PHP开发环境
最近有个同事找过来,希望我对在很早之前写的一个PHP网站上增加一些功能,当时开发使用xampp构建的本地开发环境,但是现在我的笔记本电脑已经更新,没有当时的开发环境.本着尽量不往电脑上装无用软件的原则 ...
- 五分钟用Docker快速搭建Go开发环境
挺早以前在我写过一篇用 `Docker`搭建LNMP开发环境的文章:[用Docker搭建Laravel开发环境](http://mp.weixin.qq.com/s?__biz=MzUzNTY5MzU ...
- 在win10下使用docker快速搭建ruby开发环境
docker在windows下发力的时候必将取代各种虚拟机,并改变程序员的开发习惯,或许还会改变infra的工作. 概要: 在Windows下搭建开发环境一直是infra(我)头疼的事情.为了解决这个 ...
- Docker 快速搭建 MySQL8 开发环境
使用 Docker 快速搭建一个 MySQL8 开发环境 步骤 获取镜像 docker pull mysql:8 启动容器,密码 123456,映射 3306 端口 docker run --name ...
- 使用Docker快速搭建Tensorflow开发环境
当我刚开始学习使用scikit-learn时,总是会出现各种各样的包依赖问题,兜兜转转了一遍才全部安装好,现在的机器学习算法开发者大都使用tensorflow.pytorch来实现自己的想法,但依然会 ...
- Win7+Docker(boo2docker)搭建php开发环境简略
之所以称谓简略 是不准备配图的意思 嘿嘿! 步骤1: 到docker官网下载Docker Toolbox,并完全安装 步骤2: 安装完成后,运行在桌面新生成的快捷方式:Docker Quickstar ...
- Docker最全教程之使用Docker搭建Java开发环境(十七)
前言 Java是一门面向对象的优秀编程语言,市场占有率极高,但是在容器化实践过程中,发现官方支持并不友好,同时与其他编程语言的基础镜像相比(具体见各语言镜像比较),确实是非常臃肿. 本篇仅作探索,希望 ...
- mac 下 用 glfw3 搭建opengl开发环境
mac 下 用 glfw3 搭建opengl开发环境 下载编译 glfw3 Build Setting 里面, Library Search Paths -> 设置好编译 glfw 库的路径 H ...
随机推荐
- 在js中怎样获得checkbox里选中的多个值?
https://zhidao.baidu.com/question/203897221.html 思路:利用name属性值获取checkbox对象,然后循环判断checked属性(true表示被选中, ...
- 在ASP.NET Core中通过EF Core实现一个简单的全局过滤查询
前言 不知道大家是否和我有同样的问题: 一般在数据库的设计阶段,会制定一些默认的规则,其中有一条硬性规定就是一定不要对任何表中的数据执行delete硬删除操作,因为每条数据对我们来说都是有用的,并且是 ...
- VS code注释快捷键
注释: 先CTRL+K,然后CTRL+C 取消注释: 先CTRL+K,然后CTRL+U
- 2.supervisor实时监控程序存活状态
1.supervisor是一款python开发的一个client/server服务,是一款进程管理工具,支持linux/unix系统,但是不支持windows系统. 它可以很方便的监听.启动.停止.重 ...
- JavaScript总结学习一:js中构造函数与普通函数的区别
构造函数不仅只出现在JavaScript中,它同样存在于很多主流的程序语言里,比如c++.Java.PHP等等.与这些主流程序语言一样,构造函数在js中的作业一样,也是用来创建对象时初始化对象,并且总 ...
- python基础6之迭代器&生成器、json&pickle数据序列化
内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...
- JavaScript 字符串与对象互换
对象转字符串: var str = JSON.stringify(obj); 字符串转对象: var str = JSON.parse(str);
- Angular19 自定义表单控件
1 需求 当开发者需要一个特定的表单控件时就需要自己开发一个和默认提供的表单控件用法相似的控件来作为表单控件:自定义的表单控件必须考虑模型和视图之间的数据怎么进行交互 2 官方文档 -> 点击前 ...
- Linux下如何释放cache内存
转自:http://www.linuxidc.com/Linux/2015-02/112685.htm 在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作 ...
- underscore.js 源码阅读 准备
本次阅读是初次阅读源码,参考了以下几篇文章: https://github.com/hanzichi?language=javascript&page=5&tab=stars http ...