Docker 构建php web开发环境

Docker 构建php web开发环境

需要构建的环境镜像有 Nginx、php,通过docker-compose用来编排两个镜像
注意:建议生产环境将软件开发环境与中间件区分在不同镜像中,例如php开发环境,不与nginx、mysql、redis在同一个镜像中构建,那怕是php中的CGI需要nginx代理,也不存放在同一个镜像中,方便维护

目录结构

- app
    - index.html
    - index.php 
- conf
    - nginx 
        - market.conf 
- php
    - conf
        - php.ini   
    - Dockerfile
- docker-compose.yml

php目录为 php、fpm的镜像配置,使用本地的php.ini
conf 目录为所有的配置文件
nginx镜像没多少自定义东西,直接在docker-compose.yml里声明了

配置说明

php的镜像Dockerfile内容如下

FROM php:7.2-fpm
RUN apt-get update && \
    pecl install -n channel://pecl.php.net/ev-1.1.5 && \
    pecl install -n channel://pecl.php.net/redis-6.1.0RC1 && \
    pecl install -n channel://pecl.php.net/swoole-4.8.13 && \
    pecl install -n channel://pecl.php.net/protobuf-3.13.0.1 && \
    pecl install apcu && \
    docker-php-ext-install opcache && \
    docker-php-ext-enable opcache
    
ADD conf/php.ini /usr/local/etc/php/

EXPOSE 9000

这里我们使用的是dockerhub上的 php.7.2镜像,做一些扩展安装、配置设置

php的pecl命令,通过pecl搜索出的扩展大多是一些适配php高版本的扩展,这里我们通过pecl官网按照指定的扩展版本,例如
ev扩展1.1.5版本适用于php7.2以上,安装命令就是pecl install channel://pecl.php.net/ev-1.1.5
Dockerfile中的命令,默认会跳过需要二次确认的命令,例如 yum -y install vim ,其中-y参数不添加,也会自动跳过

docker-compose.yml 配置如下

version: '3'
services:
  php:
    build:
      context: ./php
    restart: always
    ports:
      - "9000:9000"
    environment:
      - HOST_ID=market_node1
      - ENV=test
    volumes:
      - "D:/site/prodphp/app:/home/www"
      
  nginx:
    container_name: nginx
    image: nginx:latest
    restart: always
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "80:80"
    depends_on:
      - "php"
    volumes:
      - "D:/site/prodphp/app:/home/www"
      - "D:/site/docker/nginx/logs:/var/log/nginx" 
      - "D:/site/prodphp/conf/nginx:/etc/nginx/conf.d" 

通过命令 docker-compose up -d 便可启动php nginx两个镜像所构建的容器
我们这里将本地的 D:/site/prodphp/ap 目录作为nginx中配置的web工作目录

相关知识点

  1. docker-commpose.ymlvolumes 修改,docker-compose restart 可能不生效,需要先docker-compose stop 再执行 docker-compose up -d,或者先删除容器,重新启动
  2. windows中,docker run -it --rm --name my-running-script -v "$PWD":/usr/src/myapp -w /usr/src/myapp php:8.2-cli php your-script.php$PWD命令可能不生效,注意操作系统差异、目录分隔符($PWD 当前目录)
  3. 根据Dockerfile文件,启动容器
    3.1 构建镜像 docker build -t my1029:1 . 根据当前目录下的Dockerfile文件,构建名为my1029tag1的镜像
    3.2 根据指定image启动容器 docker run -it --rm --name your-container-name your-image-name:tag --rm参数为进程退出自动删除容器
  4. docker hub官方的php镜像里,自带了一些默认(非第三方)扩展,例如GD库等,并且配置了专门安装扩展的命令docker-php-ext-install,例如docker-php-ext-install gddocker-php-ext-enable gd 的作用就是省去手动去php.ini添加xxxx.so操作
  5. Dockefile中的 COPY ADD与docker-compoer.yml中的volumes,都是用来文件映射用, COPY ADD是在构建镜像时执行的,而 volumes 是在运行容器时配置的。COPY 将文件复制到镜像中,使得文件随镜像一起分发,但不持久化;volumes 用于数据持久化,即使容器被删除,数据仍然存在
  6. Dockefile中的 EXPOSE 与docker-compoer.yml中的portsEXPOSE 指令仅声明容器应该监听的端口,是一个注释作用,没有实质效果,而 ports 配置项实际将容器端口映射到宿主机端口,使得外部可以访问。
  7. COPYADD 命令不能拷贝上下文之外的本地文件,如果要把本地的文件拷贝到镜像中,那么本地的文件必须是在上下文目录中的文件,就好比是你Dockerfile所在目录,或者工作目录
  8. 遇到nginx处理php请求,CGI报错 Access denied (403) see security.limit_extensions,可修改php.inicgi.fix_pathinfo 或者 security.limit_extensions配置,大多是由于nginx中代理转发fpm的.sock端口9000 方式不兼容导致
  9. docker-compose.yml中,关联Dockerfile的方式
php:
    build:
      context: ./php

context: ./php 就会php目录下默认的Dockerfile镜像配置

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容