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镜像配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值