如何在Mac上通過docker配置PHP開發環境
使用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等服務的話,可以自行度娘,自己動手。
以上就是如何在Mac上通過docker配置PHP開發環境的詳細內容,更多關於在Mac上通過docker配置PHP開發環境的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 解決使用Docker Compose管理容器的問題
- Docker compose部署SpringBoot項目連接MySQL及遇到的坑
- Docker搭建部署Node項目的方法步驟
- 基於Docker、Nginx和Jenkins實現前端自動化部署
- docker-compose安裝yml文件配置方式