前言

本文根据参考文章,自己动手试了搭建PHP环境,对里面的Dockerfile的编写

做了最新的修改,以此记录,完整代码查看传送门

说明:

  • 镜像下载过慢,可使用国内镜像加速,具体可自行查询
  • 根据此方法是 用了四个镜像,生成了四个容器,容器之间的启动,根据docker-compose管理

    当然也可以 用一个基础镜像,在此镜像的基础上 安装 nginx php等软件,容器也只有一个,就像本机安装一样

目录结构

app # 项目目录
index.php
test
-test.php
data # 数据目录
mysql
redis logs # 日志目录
nginx
mysql
php-fpm docker_self # docker目录
docker-compose.yml
mysql
-Dockerfile
-conf.d
-my.conf
nginx
-Dockerfile
-nginx.conf
-conf.d
-www.conf
php
-Dokcerfile
-php-fpm.conf
-php-fom.d
-www.conf
-idc.ini
redis
-Dockerfile

php的dockerfile

FROM php:7.2-fpm

# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 更新安装依赖包和PHP核心拓展
RUN apt-get update && apt-get install -y \
git \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
&& docker-php-ext-install zip \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install opcache \
&& docker-php-ext-install mysqli \
&& rm -r /var/lib/apt/lists/* # 安装 PECL 拓展,这里我们安装的是redis psr
# 最新的phalcon扩展,需要 psr
RUN pecl install redis-5.0.2 \
&& pecl install psr \
&& docker-php-ext-enable redis psr # 安装第三方拓展,这里是 Phalcon 拓展
RUN cd /home \
&& git clone --depth=1 git://github.com/phalcon/cphalcon.git \
&& cd cphalcon/build \
&& ./install \
&& echo "extension=phalcon.so" > /usr/local/etc/php/conf.d/phalcon.ini \
&& rm -rf /home/* # 添加配置文件,新添加的phalcon项目需要
COPY idc.ini /data/app/idc/idc.ini WORKDIR /data
  • 我们使用了 php:7.2-fpm 的镜像
  • php的扩展安装分为 核心扩展 和 pcel扩展 以及源代码的安装

    具体可参考官方文档
  • phalcon的扩展,利用了git下载源文件的方式

    git在api-get时已安装

其他的dockerfile

nginx:

FROM nginx:alpine

# set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

mysql:

FROM mysql:5.7

# set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

redis:

FROM redis:alpine

# set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

注意:

  • nginx的配置文件中 php-fpm 不为本机 127.0.0.1

    而且 docker-compose.yml中的名称 php-fpm

docker-compose的编写

version: '3.2'
services:
php-fpm:
build: ./php
ports:
- "9000:9000"
links:
- mysql-db:mysql-db
- redis-db:redis-db
volumes:
- ../app:/data/www:rw
- ./php/php.ini:/usr/local/etc/php/php.ini:ro
- ./php/php-fpm.conf:/usr/local/etc/php/php-fpm.conf:ro
- ./php/php-fpm.d:/usr/local/etc/php/php-fpm.d:ro
- ../logs/php-fpm:/var/logs/php-fpm
- ../logs/contento:/data/logs/contento:rw
restart: always
command: php-fpm nginx:
build: ./nginx
depends_on:
- php-fpm
links:
- php-fpm:php-fpm
volumes:
- ../app:/data/www:rw
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ../logs/nginx:/var/logs/nginx
ports:
- "80:80"
- "8080:8080"
- "443:443"
restart: always
command: nginx -g 'daemon off;' mysql-db:
build: ./mysql
ports:
- "3306:3306"
volumes:
- ../data/mysql:/var/lib/mysql:rw
- ../logs/mysql:/var/lib/mysql-logs:rw
- ./mysql/conf.d:/etc/mysql/conf.d:ro
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test
MYSQL_USER: test
MYSQL_PASSWORD: test123
restart: always
command: "--character-set-server=utf8" redis-db:
build: ./redis
ports:
- "6379:6379"
volumes:
- ../data/redis:/data
restart: always
  • php以及nginx等的配置文件映射为外部文件

    方便修改其配置
  • 项目的日志文件以及nginx和php的日志文件映射为外部目录

    防止容器重启后,无日志的情况

启动与停止

  • 编写好完毕后,可使用 docker-compose up 启动

    有错误,则根据输出调试
  • 启动没问题后,以后可使用 docker-compose up -d 后台启动

    docker container ls 查看启动容器

    docker image ls 查看镜像列表
  • 停止服务,可使用 docker-compose stop

缺点

  • 镜像太大

    FROM php:7.2-fpm

    非 alpine的镜像,默认是以 ubanutu 为基础的,

    可以使用 apt-get,docker-php-ext-* 等命令

    但生成的镜像 非常大

    alpine镜像 只能 使用 apk 的方式安装软件包

待做

  • alpine镜像的制作
  • laradock的使用

参考

参考文章

官方文档

传送门

最新文章

  1. Backbone源码解析(六):观察者模式应用
  2. Android的历史与花边
  3. SQLServer 事务隔离级别
  4. Mysql 相关字段类型长度
  5. mysql学习笔记 第六天
  6. 多校3- RGCDQ 分类: 比赛 HDU 2015-07-31 10:50 2人阅读 评论(0) 收藏
  7. git泄漏原理
  8. Mvc4_MvcPager 概述
  9. JavaScript效果之选项卡
  10. verilog 随笔
  11. TraceView性能分析工具介绍
  12. MySQL数据库入门笔记
  13. 海量数据挖掘MMDS week4: 推荐系统之隐语义模型latent semantic analysis
  14. JMX的l理解
  15. 让MySQL查询更加高效——对查询进行重构
  16. Nuxt.js项目实战
  17. spring IOC理解
  18. arya-sites模块的主要类
  19. Laravel 框架集成 UEditor 编辑器的方法
  20. .net 枚举(Enum)使用总结

热门文章

  1. 2019-7-29-win10-UWP-使用-MD5算法
  2. StringBuilder.sb.AppendLine();
  3. HM NIS Edit制作安装包时检测是否有.net4.6环境,没有的时候自动安装。
  4. PhaseScorer:感慨高手写的代码就是精炼
  5. php对象复制、clone、浅复制与深复制实例详解
  6. Eclipse 笔记
  7. Web Service 接口测试
  8. Python Scrapy在windows上的安装方法
  9. supervisor 管理应用程序
  10. Linux下压缩工具gzip和归档工具tar及其实战shell应用