Docker PHP
Docker PHP 可以快速构建基于 Docker 的 PHP 本地开发环境,此套 LNMP 环境同时支持PHP 5 和PHP 7 。
版本及组件
- 当前版本:1.0
- 默认组件:PHP/FPM 7.2/5.6、Nginx 1.12、Mysql 5.7、Redis 4.0、Memcached 1.5
目录结构
├── add_project.sh 新建项目脚本(Linux)
├── build 镜像构建目录
│ ├── memcached
│ │ └── Dockerfile
│ ├── mysql
│ │ └── Dockerfile
│ ├── nginx
│ │ └── Dockerfile
│ ├── php5
│ │ └── Dockerfile
│ ├── php7
│ │ └── Dockerfile
│ └── redis
│ └── Dockerfile
├── config 服务配置目录
│ ├── mysql
│ │ ├── backup
│ │ ├── config
│ │ │ └── mysql.cnf
│ │ ├── crontabs
│ │ └── docker-entrypoint-initdb.d 数据库初始化脚本目录
│ ├── nginx
│ │ ├── conf.d
│ │ │ ├── bar.example.com.conf
│ │ │ ├── foo.example.com.conf
│ │ │ └── example.com.conf.template
│ │ ├── fastcgi_mysql
│ │ ├── fastcgi_web
│ │ └── nginx.conf
│ ├── php5
│ │ ├── php.ini
│ │ └── php.ini-production
│ ├── php7
│ │ ├── php.ini
│ │ └── php.ini-production
│ └── redis
│ └── redis.conf
├── data 服务数据目录
│ ├── mysql 数据库数据存储目录
│ ├── nginx
│ │ ├── cache 应用缓存目录
│ │ └── data 应用数据目录
│ └── redis 缓存数据目录
├── docker-compose.yml 项目配置文件
├── logs 服务日志目录
│ ├── access Nginx访问日志目录
│ │ ├── bar.example.com
│ │ │ └── bar.example.com.log
│ │ └── foo.example.com
│ │ └── foo.example.com.log
│ ├── app 应用日志目录
│ │ ├── bar.example.com
│ │ └── foo.example.com
│ └── xinsrv 服务日志目录
│ ├── memcached
│ ├── mysql
│ │ └── error.log
│ ├── nginx
│ │ └── nginx_error.log
│ ├── php5
│ │ └── php_errors.log
│ ├── php7
│ │ └── php_errors.log
│ └── redis
│ └── redis.log
├── README.md
└── webapps 应用代码目录
├── bar.example.com
│ └── htdocs
│ └── index.php
└── foo.example.com
└── htdocs
└── index.php
安装 Docker 及相关工具
https://docs.docker.com/install/
1、安装 docker 参考官方文档:推荐安装 docker-ce=17.03.2
2、安装 docker-compose
# 注意:你如果用的是非 root 用户,执行 curl 会提示没权限写入 /usr/local/bin 目录,可以先写入当前目录,再使用 sudo mv 过去
curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
3、启动 Docker
sudo service docker start
sudo docker info
4、配置私有镜像仓库(重要)
# 添加--insecure-registry启动参数,以CentOS 7为例,修改/usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry=hub.example.com
5、配置 DockerHub 加速器(重要)
# 阿里云加速器:每个人有对应的加速地址,访问 https://dev.aliyun.com ->【管理中心】-> 【DockerHub 镜像站点】配置加速器
# 添加--registry-mirror启动参数,以CentOS 7为例,修改/usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry=hub.example.com --registry-mirror=https://xxxxxx.mirror.aliyuncs.com
启动开发环境
启动 PHP 开发环境
git clone http://github.com/ist0ne/docker-php.git
cd docker-php
# 配置应用目录(重要)、数据库密码、端口等
vim .env
# 给组件文件夹可写权限
sudo chmod -R 777 data logs
# 构建镜像并启动容器
sudo docker-compose up --build -d
# 仅启动容器
sudo docker-compose up -d
# 单独编译PHP容器
sudo docker-compose build php7
# 停止开发环境
sudo docker-compose stop
# 启动开发环境
sudo docker-compose start
# 销毁开发环境
sudo docker-compose down
启动成功访问
修改hosts:
127.0.0.1 foo.example.com bar.example.com
访问地址:http://foo.example.com 或者 http://bar.example.com
创建新项目
使用脚本创建新项目默认使用config/nginx/conf.d/example.com.conf.template配置模板,可以根据自己的需求修改模板
# ./add_project.sh <项目域名> <PHP版本>
# 默认创建PHP 7 项目
./add_project.sh foo.example.com 5
可能遇到的问题
常用操作命令
# 查看当前启动的容器
sudo docker ps
# 启动部分服务在后边加服务名,不加表示启动所有,-d 表示在后台运行
sudo docker-compose up [nginx|php|mysql|redis] -d
# 停止和启动类似
sudo docker-compose stop [nginx|php|mysql|redis]
# 删除所有未运行的容器
sudo docker rm $(docker ps -a -q)
# 删除所有镜像,-f 可以强制删除
sudo docker rmi $(docker images -q)
修改镜像文件怎么处理?
# 比如在 php 里新增一个扩展
# 1、更改对应的 docker-php/build/php7/Dockerfile
# 2、重新构建镜像
sudo docker-compose build [php7|...]
如何设置资源(mysql、redis)变量?
Nginx 资源环境变量定义在./docker-php/config/nginx/fastcgi_web 和 ./docker-php/config/nginx/fastcgi_mysql 其中./docker-php/config/nginx/fastcgi_mysql放置mysql资源相关环境变量,./docker-php/config/nginx/fastcgi_web存放除mysql以外的资源变量。
其他的坑
如果需要升级某些组件的版本需要注意载入对应版本的配置文件,修改对应的配置信息,比如 redis.conf 默认配置的出口 ip 为 127.0.0.1,这样的话 php 的容器是连不上的,需要修改成 0.0.0.0,另外也要注意修改对应的日志。