1. 程式人生 > >Mac上通過docker配置PHP開發環境

Mac上通過docker配置PHP開發環境

這篇文章介紹的內容是關於Mac上通過docker配置PHP開發環境,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

更多PHP相關知識請關注我的專欄PHP​zhuanlan.zhihu.com

安裝docker

關於MAC上安裝docker網上有很多文章介紹,這裡我就不在做描述了,順便提一句,建議使用阿里雲或Daocloud提供的加速器。

使用docker-compose配置開發環境

一般一個基本的PHP開發環境包括PHP、PHP-FPM、WEB伺服器、MySQL資料庫,另外還會有Redis或memcache等相關NoSQL服務。我主要是通過docker-compose來配置服務。

什麼是docker-compose

docker-compose是一個通過YAML檔案來定義專案,專案中包含單個或多個容器服務。一般配置檔名為:docker-compose.yml。

目錄結構

你可以按自己的喜好組織專案,下面是我用的方法,app 目錄放的是應用的程式碼,services 下面是建立服務需要用的東西,有些服務需要我們自己去建立映象,在一個 Dockerfile 檔案裡說明一下你想要的映象是什麼樣的。在建立自定義映象的時候也可能需要用到一些額外的檔案,比如一些配置檔案,一般在建立映象的時候會把這些配置檔案複製到映象裡。

MySQL

mysql是資料服務,先去給這個服務新增一個數據卷,然後在這個服務裡使用一下這個資料卷,把資料庫生成的資料放到這裡,這樣即使我們刪除容器,資料服務裡的資料也會保留在主機上,下回建立容器的時候,可以繼續使用已有的資料。在 volumes 下面,新增一個名字是 mysql 的資料卷:

volumes: mysql:   driver: local

 

然後再去新增一個名字是 MySQL的服務,指定一下服務使用的映象,這個映象我們也可以用自己建立的 Dockerfile 去建立一下,或者你不打算定製映象,也可以直接使用現成的,這裡我用了 mysql:5.7 這個映象。注意最好設定具體要使用的版本。

這個映象裡有一些環境變數,我們可以在定義服務的時候去設定一下它們的值,這裡我設定了 root 使用者的密碼,要建立的資料庫,使用者名稱,還有密碼,你可以 根據自己的需求去修改這些變數的值。

在 mysql 服務上我用了 volumes 為它指定了一個 MySQL 資料卷,掛載的位置是容器的 /var/lib/mysql ,這是儲存資料庫的預設的地方。因為我本機安裝了MySQL服務,3306埠被佔用了,所以指定6306埠對映到容器的3306

version: "3"services:  mysql:    image: mysql:5.7    environment:       MYSQL_ROOT_PASSWORD: "root"      MYSQL_DATABASE: "app"      MYSQL_USER: "app"      MYSQL_PASSWORD: "123456"    volumes:

      - ./services/mysql/data:/var/lib/mysql    ports:

      - "6306:3306"

 

測試

在我們的 compose 檔案裡現在已經有了一個叫 mysql 的服務,在命令列工具下,進入到專案所在的目錄,執行:

docker-compose up

 

然後你就會在終端上看到安裝映象和啟動容器的過程,然後另開一個命令終端,執行:

docker-compose execmysql bash 

 

進入mysql容器中,然後進入資料庫檢查一下:

mysql -uroot -pshow databases;

+--------------------+| Database           |

+--------------------+| information_schema |

| app                |

| mysql              |

| performance_schema || sys                |

+--------------------+5 rows in set (0.03 sec)

 

這個時候我們發現mysql容器已經可用了

php

定義一個解釋 php 的服務,我打算自己建立這個服務用的映象,所以用了 build,而不是 image 。我告訴了 docker 自己要建立的這個映象要使用的那個 Dockerfile 檔案的位置(./services/php/Dockerfile)。

volumes 下面是服務用的資料卷,我把 compose 檔案所在目錄下的 app 這個目錄,掛載到了容器的 /www/html/app 這個位置上了。這樣我可以直接修改專案的程式碼,然後立即看到結果;同時由於本機9000埠被佔用,指定9090埠對映到容器的9000埠

php:    build:       context: ./services/php      dockerfile: Dockerfile    volumes:

      - ./app:/www/html/app    ports:

      - "9090:9000"

 

Dockerfile

構建 php 服務的映象用的 Dockerfile 是 ./services/php/Dockerfile。FROM,設定了一下這個映象要基於哪個映象去建立,我用了 php:7.1-fpm 這個官方提供的映象。RUN 了幾行命令,主要是去安裝一些軟體包,比如一些額外的 php 擴充套件。在安裝這些擴充套件之前 ,你需要先安裝擴充套件依賴的一些其它的軟體包,這裡的 libpng12-dev,libjpeg-dev,就是 gd 這個 php 擴充套件需要的軟體包。然後我又 COPY 了配置檔案到映象裡面。

FROM php:7.1-fpm

RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev \

  && rm -rf /var/lib/apt/lists/* \

  && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \

  && docker-php-ext-install gd mysqli pdo_mysql zip opcache

COPY ./config/php.ini /usr/local/etc/php/conf.d/php.ini

 

php服務中遇到的坑

PHP這個映象中軟體是使用的Debian的源,因為眾所周知的緣故會導致映象安裝不成功,如圖所示:

這個時候我們就需要更換源了,第一次換成了中科大的源,然後發現不行,第二次更換成了阿里雲的源,完美完成映象安裝,修改過後的Dockerfile如下:

FROM php:7.1-fpm

RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list \

  && apt-get update && apt-get install -y libpng12-dev libjpeg-dev \

  && rm -rf /var/lib/apt/lists/* \

  && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \

  && docker-php-ext-install gd mysqli pdo_mysql zip opcache

COPY ./config/php.ini /usr/local/etc/php/conf.d/php.ini

 

使用sed命令搜尋軟體原始檔,把Debian域名修改為阿里雲域名

php.ini

自定義的 php 配置。把你想要的 php 配置放到這個檔案裡,重新 build 映象,然後再次啟動 php 服務的時候會用新的映象重新建立容器,這樣配置就會生效了。

memory_limit = 256Mpost_max_size = 100Mupload_max_filesize = 100M

 

Nginx

用 image 指定了要使用的映象,ports 設定了釋出的埠號,讓主機上的 8000 對應容器的 80 。depends_on 可以設定服務的依賴,我讓 nginx 服務依賴之前定義的 php ,這樣會先啟動 php ,然後再啟動 nginx 。

另外我又用了 volumes 自己設定了一個數據卷,讓主機上包含 nginx 配置檔案的目錄,對應容器裡的 nginx 服務的配置檔案目錄,這樣我就可以直接在本機上修改 nginx 的配置檔案,然後重新啟動一下 nginx 服務,配置就可以生效了。這種方法適用在開發環境上,因為修改了配置不需要重新 build 映象,在生產環境中,你需要自己 build 這個 nginx 映象,把想要的配置直接複製到映象裡去。在開發階段有的時候我們需要檢視nginx的日誌,然後我配置了日誌目錄對映到容器,最後一個地址是程式碼目錄

nginx:    image: nginx:1.12.2    ports:

      - "8000:80"    depends_on:

      - php    volumes:

      - ./services/nginx/config:/etc/nginx/conf.d

      - ./services/nginx/logs:/etc/nginx/logs/

      - ./app:/www/html/app

 

app.conf

./services/nginx/config/app.conf,這是一個最基本的 nginx 配置檔案,設定了應用的 root 是在 /www/html/app 這裡,我們已經把主機上的 app 目錄掛載到了容器裡的 /www/html/app 這個地方。

注意這條指令:fastcgi_pass php:9000; 這裡的 php 是我們定義的 php 這個服務的名字,在 compose 檔案裡定義的服務,它們之間可以使用服務的名字相互進行溝通,因為 docker 內建了 DNS 功能。

server {    listen       80;    server_name  localhost;    root         /www/html/app;    # access_log  /etc/nginx/logs/app.access.log  main;

 

    location / {        

    index  index.html index.htm index.php;       autoindex   on;

    #        include     /usr/local/etc/nginx/conf.d/php-fpm;#        include     /usr/local/etc/nginx/conf.d/pathinfo.conf;

     if (!-e $request_filename) {                        ###一級目錄下

                        rewrite ^/(.*)$ /index.php/$1 last;                        ###域名下的二級目錄

                        #rewrite ^/html/(.*)$ /uuabc_home/index.php/$1 last;

                }   

    }    location = /info {        allow   127.0.0.1;        deny    all;

    }   location ~ \.php(.*)$  {            # comment try_files $uri =404; to enable pathinfo

            # try_files $uri =404;

            fastcgi_pass                php:9000;            fastcgi_index               index.php;            fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;            fastcgi_param PATH_INFO $fastcgi_path_info;            fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;            include /etc/nginx/fastcgi_params;

        }   # error_page  404     /404.html;

   # error_page  403     /403.html;}

 

啟動

經過上面幾個步驟,我們已經把PHP開發最基本的搞好了,下面我們準備看下成果。
在 app 目錄下建立一個 index.php ,內容是:

<?php 

 

    phpinfo();

 

進入到專案下面,執行:

docker-compose up

 

開啟瀏覽器訪問http://localhost:8000/,結果如圖所示:

連線資料庫

在app目錄有一個adminer.php檔案,這個檔案是一個類似於PHPmyadmin的資料庫管理工具,比較輕量級,訪問http://localhost:8000/adminer.php,如圖所示:

在表單伺服器選項中填寫mysql,使用者名稱root,密碼填寫安裝MySQL服務時的root密碼,然後登陸進去,如圖所示:

然後我們就可以愉快的管理資料庫了。

總結

至此,我們對PHP基本開發環境已經安裝好了,如果需要安裝比如Redis或memcache等服務的話,可以自行度娘,自己動手。

更多PHP相關知識請關注我的專欄PHP​zhuanlan.zhihu.