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

安裝docker

關於MAC上安裝docker網上有不少文章介紹,這裏我就不在作描述了,順便提一句,建議使用阿里雲或Daocloud提供的加速器。
本文推薦參看這篇文章:https://blog.csdn.net/jiang_x...
這篇文章至關於官方文檔的中文版翻譯php

使用docker-compose配置開發環境

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

什麼是docker-compose

docker-compose是一個經過YAML文件來定義項目,項目中包含單個或多個容器服務。通常配置文件名爲:docker-compose.yml。mysql

目錄結構

你能夠按本身的喜愛組織項目,下面是我用的方法,app 目錄放的是應用的代碼,services 下面是建立服務須要用的東西,有些服務須要咱們本身去建立鏡像,在一個 Dockerfile 文件裏說明一下你想要的鏡像是什麼樣的。在建立自定義鏡像的時候也可能須要用到一些額外的文件,好比一些配置文件,通常在建立鏡像的時候會把這些配置文件複製到鏡像裏。nginx

clipboard.png

MySQL

mysql是數據服務,先去給這個服務添加一個數據卷,而後在這個服務裏使用一下這個數據卷,把數據庫生成的數據放到這裏,這樣即便咱們刪除容器,數據服務裏的數據也會保留在主機上,下回建立容器的時候,能夠繼續使用已有的數據。在 volumes 下面,添加一個名字是 mysql 的數據卷:git

volumes:
 mysql:
   driver: local

而後再去添加一個名字是 MySQL的服務,指定一下服務使用的鏡像,這個鏡像咱們也能夠用本身建立的 Dockerfile 去建立一下,或者你不打算定製鏡像,也能夠直接使用現成的,這裏我用了 mysql:5.7 這個鏡像。注意最好設置具體要使用的版本。github

這個鏡像裏有一些環境變量,咱們能夠在定義服務的時候去設置一下它們的值,這裏我設置了 root 用戶的密碼,要建立的數據庫,用戶名,還有密碼,你能夠 根據本身的需求去修改這些變量的值。sql

在 mysql 服務上我用了 volumes 爲它指定了一個 MySQL 數據卷,掛載的位置是容器的 /var/lib/mysql ,這是存儲數據庫的默認的地方。由於我本機安裝了MySQL服務,3306端口被佔用了,因此指定6306端口映射到容器的3306docker

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 exec mysql bash

進入mysql容器中,而後進入數據庫檢查一下:

mysql -uroot -p
show 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的源,由於衆所周知的緣故會致使鏡像安裝不成功,如圖所示:

clipboard.png
這個時候咱們就須要更換源了,第一次換成了中科大的源,而後發現不行,第二次更換成了阿里雲的源,完美完成鏡像安裝,修改事後的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 = 256M
post_max_size = 100M
upload_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/,結果如圖所示:

clipboard.png

鏈接數據庫

在app目錄有一個adminer.php文件,這個文件是一個相似於PHPmyadmin的數據庫管理工具,比較輕量級,訪問http://localhost:8000/adminer.php,如圖所示:

clipboard.png
在表單服務器選項中填寫mysql,用戶名root,密碼填寫安裝MySQL服務時的root密碼,而後登錄進去,如圖所示:

clipboard.png
而後咱們就能夠愉快的管理數據庫了。

總結

至此,咱們對PHP基本開發環境已經安裝好了,若是須要安裝好比Redis或memcache等服務的話,能夠自行度娘,本身動手。
下面是我這個項目的源碼,但願能夠幫助到你,git地址:https://github.com/xiaodingch...

原文連接:https://www.xiaodingchen.cn/2...

相關文章
相關標籤/搜索