V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
youwater
V2EX  ›  程序员

在 2 分钟内极速构建超轻量级 docker + PHP 全功能开发测试环境

  •  
  •   youwater · 2016-09-28 11:44:16 +08:00 · 9493 次点击
    这是一个创建于 2767 天前的主题,其中的信息可能已经有所发展或是发生改变。

    版本: 1.04 更新记录

    • 将 nginx 、 php 日志也放在 host 主机 volumes/apps/logs/下,方便调试
    • 增加 php.ini 中 max_execution_time 的配置
    • 增加 php composer 包,修改为从国内镜像下载
    • 增加在 host 主机中 php 、 composer 别名指向到 phpfpmp 容器,这样可以实现本地完全不需要安装任何 php 相关组件

    为什么要做这个配置包?

    • 以前一直使用 virtualbox+ubuntu 虚拟机环境来搭建 php 开发环境,配置慢,不利于共享
    • 前一段时间采用 Docker 配置,官方很多包默认采用 ubuntu 为底包,包很大,还是不利于共享,我配置好完整的 LNMP Docker image 有 1G 多
    • 后来了解到 alpine ,一个轻量级的 linux 发行版,小到 5M 的底包, docker build 速度非常快,所以就有了自己做一个开发环境配置包的想法。
    • 我希望做一个超轻量级的全功能 php 开发测试环境配置包。

    配置原则

    • 尽可能小,保持 alpine 的优势
    • 尽可能少改动,保持原生 docker+alpine 的优势
    • 默认采用中国大陆国内镜像,加速 docker build 的过程
    • 默认采用 Asia/Shanghai 时区,国人开发更方便
    • 默认配置好 nginx 多虚拟主机环境,可以在 host 主机按范本修改虚拟主机配置以满足自己的需求
    • 默认配置好 php-fpm 环境, gd 、 mcrypt 等常见模块均可直接使用
    • 配置文件、程序开发代码、数据、日志均放在 host 主机,通过 volume 挂载到相应容器,并可跨容器共享访问

    效果如何?

    • 整个配置包, 72KB.
    • 在 [ macbook pro 15 英寸, 2014 年中] 电脑,电信 20M 宽带中执行date && docker-compose build && docker-compose up -d && date,总共费用 1 分钟 07 秒。
    • 总共生成 4 个镜像,合计: 282MB

    模块组成

    • alpine 最新版为基础包,目前是 3.4
    • nginx 1.10.1
    • mariaDB 10.1.17 兼容 mysql 5.6
    • php 5.6.26

    开始使用

    配置调整

    代码里面有注释,应该很容易看懂,可以直接改,然后运行

    docker-compose build && docker-compose up -d

    疑问与解答

    • 为什么我 build 的速度很慢?根本达不到文中所说的速度?

      整个镜像包的 build 过程已全部配置成国内镜像,理论上速度是非常快的, docker 本身也要配置成采用国内镜像,方法可自行搜索: docker 国内加速。每台电脑、网络环境都不一样,上面的时间是我在我的电脑上电信 20M 宽度环境下的 build 速度,仅供参考。

    • 我在 windows 下 mysql 容器无法正常运行,提示:

      standard_init_linux.go:175: exec user process caused "no such file or directory"

      这是因为 git for windows 的默认设置会强制将代码换行符强行转为 dos 格式,需要修改设置后重新 git clone :

      git config --global core.autocrlf false

    • 其他有关 docker 基本概念和环境配置请自行搜索解决。

    可能还有一些不完善,有什么意见建议欢迎与我联系。

    有什么问题可以提交 issue ,或者加 dphp 交流 QQ 群讨论,群号: 515731883

    第 1 条附言  ·  2016-10-01 20:59:19 +08:00
    最新版已更新到 https://github.com/gnulife/dphp
    17 条回复    2016-09-28 20:19:30 +08:00
    penjianfeng
        1
    penjianfeng  
       2016-09-28 13:29:02 +08:00
    非常赞
    cxbig
        2
    cxbig  
       2016-09-28 13:43:39 +08:00
    缺一个 xdebug
    gouchaoer
        3
    gouchaoer  
       2016-09-28 13:56:39 +08:00 via Android
    问题一大堆。。。最大的问题,你在生产环境用 docker-compose 是不对的,这意味着你要在生产环境 git pull 。。。第二代码更新你没考虑。。。第三, nginx 放容器有一些缺点,我不说你自己也可以体会到。。。

    这是一个失败的 docker 方案
    gouchaoer
        4
    gouchaoer  
       2016-09-28 13:59:17 +08:00 via Android
    php 的 docker 部署方案首先不能在生产环境 git pull 然后 build docker 镜像,其次需要考虑源码更新,你的方案只能做开发环境
    amd00
        5
    amd00  
       2016-09-28 14:47:46 +08:00 via Android
    @gouchaoer 上文或者标题提到的是开发测试环境,跟生产环境无关
    youwater
        6
    youwater  
    OP
       2016-09-28 14:48:25 +08:00
    @gouchaoer 本来就是:我希望做一个超轻量级的全功能 php 开发测试环境配置包。生产环境一定是高度定制的好,这个包的目标不是生产环境。
    youwater
        7
    youwater  
    OP
       2016-09-28 14:52:51 +08:00
    @cxbig 这个是应该加进来比较合适, xdebug 还是蛮通用的。回头我改一下。
    Havee
        8
    Havee  
       2016-09-28 15:18:48 +08:00
    我一直不懂的是
    一些人喜欢用 ENV ,却在 build 阶段,不能在 docker run 时的 ENV 有何用?

    建议
    ARG a=string_a
    ENV b string_b

    ARG 变量在 RUN 语句中使用

    ENV 变量在 ENTRYPOINT 或 CMD 语句中使用

    例子

    https://github.com/iHavee/dockerfiles/tree/master/nginx/mainline
    qweweretrt515
        9
    qweweretrt515  
       2016-09-28 16:18:04 +08:00
    +1
    qweweretrt515
        10
    qweweretrt515  
       2016-09-28 16:19:31 +08:00
    dphp/volumes/apps/localhost/ 网站代码放在这里面吗
    qweweretrt515
        11
    qweweretrt515  
       2016-09-28 16:23:00 +08:00
    @gouchaoer
    @youwater 求一个生产环境的案例
    youwater
        12
    youwater  
    OP
       2016-09-28 16:44:47 +08:00   ❤️ 1
    @qweweretrt515 放在 dphp/volumes/apps/ 下面,可以参照 dphp/nginx/conf/vhosts.conf 来配置你的虚拟主机哦。
    youwater
        13
    youwater  
    OP
       2016-09-28 16:45:34 +08:00   ❤️ 1
    @qweweretrt515 生产环境感觉不是太适合做成通用的,若有需要你可以根据自己的需求调整配置参数。
    gouchaoer
        14
    gouchaoer  
       2016-09-28 19:48:49 +08:00 via Android   ❤️ 1
    @qweweretrt515 都用 docker 了,开发环境和生产环境不一致不是自己给自己添麻烦么。。。

    我摸索出来的 php 生产环境部署方案:
    nginx 用原生的, php-fpm 和源码放进同一个 docker 镜像中,启动容器的时候-v app :/app 这样,然后 exec 进容器 copy 源码到 /app 下。代码更新直接在容器中启动 crond git pull 就完了。这个方案没用数据卷和 compose ,甚至还违背了一个容器干一件事的原则,但是它的好处你实际操作就会体会到了。

    @amd00 你测试环境敢和生产环境不一样?
    youwater
        15
    youwater  
    OP
       2016-09-28 20:03:22 +08:00   ❤️ 1
    @gouchaoer docker 容器内部的环境比如 linux 软件包、 php 版本、扩展配置等是一致的。但是开发环境一般都是单机的,服务器生产环境很可能需要大批量复制做分布式计算,所以不可能用同一个配置包。 dphp 只是用来方便做开发测试,生产环境可以以这个为基础根据需求场景去修改。

    dphp 的配置方案把程序、数据库、配置文件、日志都放在 host 主机,这样整个开发过程可以不需要进入到容器去操作,对新手会方便很多。

    再次声明: dphp 的初衷只是为了解决开发环境的配置问题,不要用生产环境往 dphp 上面去套。
    gouchaoer
        16
    gouchaoer  
       2016-09-28 20:18:13 +08:00 via Android
    @youwater 我也这么想过,然后我发现你 php-fpm 分布式不大现实(你 nginx 的 upstream 怎么设?更新难道直接更新整个 docker 镜像?),穿参数通过环境变量传实际操作也挺麻烦的。。。。嘛,找到适合自己的最好
    gouchaoer
        17
    gouchaoer  
       2016-09-28 20:19:30 +08:00 via Android
    docker 对我 php 来说主要有 2 点好处,一个解决 php 环境问题,再一个就算被拿 webshell 也不用担心主机更安全
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   883 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:46 · PVG 05:46 · LAX 14:46 · JFK 17:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.