Docker快速搭建一套PHP、Nginx、MySQL、Redis、Xdebug、Memcached 開發環境並演進

痛點

如何簡單迅速地初始化一個全新的PHP開發環境呢?

筆者在嘗試起一個新web項目時,每每會陷入從新創建一套Docker環境的繁雜事當中。我想你們在開始作一個新項目時,或者快速爲了和之前的項目作徹底的隔離,也會起一套新docker環境。php

從這篇文章你會獲得

採用docker-compose容器編排技術,一步啓動所有服務。php容器在官方的基礎上還打包了一些經常使用拓展(附帶build源碼,動手能力強能夠本身打包),php,nginx,mysql都附帶有自定義配置文件(便於開發測試的配置調整),都供下載。mysql

架構

clipboard.png

本片文章搭建出來的環境如上圖。nginx

環境說明

運行環境

  • Mac OS 10.13.6
  • Virtual Box 5.2.14
  • Ubuntu 16.04.4
  • Docker 17.07.0-ce

容器

  • Nginx 1.12.1-alpine
  • PHP-fpm 5.6
  • MySQL 5.7
  • Redis 3.2
  • Memcached 1.4.27
這裏說明一下筆者運行環境,採用了在Mac機上安裝vbox虛擬機,在虛擬機裏面的debian環境安裝了Docker環境,文件放在Mac環境,經過文件掛載方式,達到Mac環境編輯,Docker環境實時更新效果。你要問爲啥不在Mac下直接裝Docker,歷史緣由~

運行材料

.
├── build                                   ## docker 鏡像build 材料
│   ├── php5.6                              ## php 5.6
│   │   ├── Dockerfile
│   │   ├── imagick-3.4.3.tgz
│   │   ├── memcached-2.2.0.tgz
│   │   ├── redis-4.0.2.tgz
│   │   ├── sources.list
│   │   └── xdebug-XDEBUG_2_5_5.tar.gz
│   └── php-cli                             ## php cli 的自建鏡像
│       ├── amqp-1.9.3.tgz
│       ├── Dockerfile
│       ├── Dockerfile-php-swoole
│       ├── memcached-3.0.4.tgz
│       ├── redis-4.1.1.tgz
│       ├── sources.list.jessie
│       ├── swoole-4.0.4.tgz
│       ├── swoole-4.2.6.tgz
│       ├── xdebug-2.6.1.tgz
│       └── yaf-3.0.7.tgz
├── config                                  ## 配置文件
│   ├── apt                                 ## 因爲使用的debian系列,因此命名apt
│   │   └── sources.list                    ## 更新爲國內源
│   ├── memcached                           ## memchached的配置
│   │   └── memcached.conf
│   ├── mysql                            ## mysql 的配置
│   │   ├── conf.d
│   │   │   └── mysqld_safe_syslog.cnf
│   │   └── my.cnf
│   ├── nginx                            ## nginx 的配置
│   │   ├── conf.d
│   │   │   ├── default
│   │   │   └── xiuno
│   │   ├── mime.types
│   │   ├── nginx.conf
│   │   └── sites-enabled
│   ├── php                            ## php的配置,分cli,和fpm配置
│   │   ├── cli
│   │   │   ├── conf.d
│   │   │   │   ├── 05-opcache.ini
│   │   │   │   ├── 10-pdo.ini
│   │   │   │   ├── 20-curl.ini
│   │   │   │   ├── 20-gd.ini
│   │   │   │   ├── 20-imagick.ini
│   │   │   │   ├── 20-json.ini
│   │   │   │   ├── 20-memcache.ini
│   │   │   │   ├── 20-mysqli.ini
│   │   │   │   ├── 20-mysql.ini
│   │   │   │   ├── 20-pdo_mysql.ini
│   │   │   │   ├── 20-readline.ini
│   │   │   │   ├── 20-redis.ini
│   │   │   │   ├── 20-xdebug.ini
│   │   │   │   └── swoole.ini
│   │   │   └── php.ini
│   │   ├── fpm
│   │   │   ├── conf.d
│   │   │   │   ├── docker.conf
│   │   │   │   ├── www.conf
│   │   │   │   └── zz-docker.conf
│   │   │   ├── docker-php-fpm.conf
│   │   │   ├── php-fpm.conf
│   │   │   ├── php.ini
│   │   │   └── pool.d
│   │   │       └── www.conf
│   │   └── mods-available
│   │       ├── curl.ini
│   │       ├── gd.ini
│   │       ├── imagick.ini
│   │       ├── json.ini
│   │       ├── memcache.ini
│   │       ├── mysqli.ini
│   │       ├── mysql.ini
│   │       ├── opcache.ini
│   │       ├── pdo.ini
│   │       ├── pdo_mysql.ini
│   │       ├── readline.ini
│   │       ├── redis.ini
│   │       └── xdebug.ini
│   └── redis                            ## redis 配置
│       ├── redis.conf
│       ├── redis-server.sh
│       └── sentinel.conf
├── data                                ## 爲了數據持久化
│   ├── mysql                            ## mysql 文件掛載
│   └── redis                            ## redis 持久化數據文件夾
├── docker-compose.yaml                 ## 容器編排 !!!
├── log                                 ## 各個容器產生的日誌
│   ├── mysql                            ## mysql日誌
│   │   ├── error.log
│   │   └── mysql.log
│   ├── nginx                            ## nginx 日誌
│   │   ├── access.log
│   │   ├── access_xiuno.log
│   │   ├── error.log
│   │   └── error_xiuno.log
│   └── php
├── php                                    ## php代碼存放目錄
│   └── xiunobbs                            ## php項目
└── tool                                ## php 一些工具
    ├── composer.phar
    └── phpunit-4.8.36.phar

配置文件下載

git clone https://gitee.com/xupaul/docker_fast_init

配置說明

目前筆者尚未寫相關自動化腳本自動適配用戶的使用環境,因此這裏須要先調整一下下載後的配置文件。
docker-compose.yml 文件調整

這個文件有大量的文件掛載配置,這塊就須要調整,拿一個舉例。git

version: "2"

services:

    http:
        image: nginx:1.12.1-alpine
        volumes:
            - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf:rw
        ports:
            - "8080:80"
        environment: 
            TZ : "Asia/Shanghai"
        networks:
            tasker_net:
                ipv4_address: "192.63.0.11"

在例子中最後volumes的下一行,是將宿主機的nginx.conf配置文件掛載並覆蓋容器內的nginx.conf文件,./文件路徑就是clone git項目後的目錄。web

若是你也使用了 vbox虛擬機,那麼你須要 ./要替換爲 docker的運行環境的路徑!

ports這裏,http服務爲了避免和本機的80端口衝突,以及sudo權限才能申請的小於1024的端口,這裏我以8080做爲默認值。其餘容器的端口配置也遵循以上的規則,爲的是能一個命令就能啓動起來。redis

爲每一個容器都配置了時區。sql

網絡ip這部分,爲了便於配置就手動分配ip了。docker

Nginx 配置

配置好了php-fpm之間tcp通信,以及php路由的rewrite。配置了靜態資源緩存。shell

MySQL 配置

開啓記錄了通常性的查詢日誌,便於debug程序。注意這裏掛載的配置文件讀寫權限要配置只讀!json

PHP 配置

php:
        image: paulxu/php:5.6-fpm-jessis-pdo-xdebug-mysqli-gd-mb-zip-2
        volumes:
            - ./config/php/cli/php.ini:/usr/local/etc/php/php.ini/:rw
        ports:
            - "9000"
        environment: 
            PHP_IDE_CONFIG: "serverName=bs"
            XDEBUG_CONFIG: "remote_host=10.0.2.2 remote_port=9000"

我爲php一塊兒打包了一些經常使用拓展,其中xdebug須要調整一下remote_host的的ip(docker-compose.yaml, ~/config/php/cli/20-xdebug.ini 兩個文件內的都須要調整). server_name 須要結合開發IDE一塊兒調整,如PHPStorm裏Preferences | Languages & Frameworks | PHP | Servers配置路徑下有什麼可用的記錄,那麼這裏填什麼。

Redis 配置

沒有特殊配置

Memecached 配置

沒有特殊配置

鏡像構建

php鏡像

能夠經過以下命令拉取:

docker pull paulxu/php:5.6-fpm-jessis-pdo-xdebug-mysqli-gd-mb-zip-2

或者在到 ~/build/php5.6 下自行打包:

docker build -t paulxu/php:5.6-fpm-jessis-pdo-xdebug-mysqli-gd-mb-zip-2 -f dockerfile .
若是自定義tag name,須要一併調整docker-compose.yml

啓動

  1. 從gitee下載配置
  2. 根據本身的環境調整配置
  3. 準備好鏡像,鏡像也可直接拉,我已上傳了官方了。
  4. 啓動

啓動命令

## 當前線程運行,要中止時,鍵入`Ctrl+C`
docker-comose -f ./docker-compose.yaml up

## 後臺運行
docker-comose -f ./docker-compose.yaml up -d

摧毀

docker-comose -f ./docker-compose.yaml down

常見問題

MySQL 掛載的配置文件被忽略,不起做用

MySQL 要求配置文件的權限爲只能讀,你須要已只讀方式掛載

不知道remote_host怎麼辦

禁用xdebug,搭建好環境並啓動,在IDE運行的環境(由於xdebug須要和IDE通信)訪問以http(在瀏覽器訪問,注意端口映射)的方式訪問php容器內代碼,在Nginxaccess.log裏查看訪問的ip就是remote_host.

docker build 時報錯致使打包鏡像失敗

遇到這種狀況,若是時一些沒關係的報錯,能夠選擇忽略他們。能夠在命令後面追加 exit 0 來屏蔽錯誤

最後

祝願你們能一步到位,有問題留言,遇到疑難雜能夠試試本地起虛擬機裏跑docker容器的那種方案。

相關文章
相關標籤/搜索