基於 Docker 搭建 PHP 開發環境

語言: CN / TW / HK

點選進入“PHP開源社群”    

免費獲取進階面試、文件、影片資源

Docker 是這幾年非常火的一項技術,作為一名軟體開發人員,應該及時的接觸和掌握。我剛進入的公司恰好需要使用 Docker 作為開發環境,所以也就不得不學習 Docker 的使用。今天寫一下搭建 PHP 開發環境的過程,也是一個記錄。

本人使用的是 Docker Desktop for Mac,Docker 安裝需要拉取映象,使用原始映象拉取會非常慢。不過我們可以使用國內映象資源,而且多數是免費,我使用的是阿里雲的映象加速連結,速度非常快。我們可以在阿里雲上免費的獲取,然後進行配置即可使用。阿里雲 Docker 加速器,沒有阿里雲賬號註冊一個即可。

檢測 Docker 是否正常執行

docker -v

安裝 Mysql

拉取映象

#拉取最新版的 Mysql

docker pull mysql

#拉取指定版本的 Mysql (5.7)

docker pull mysql:5.7

執行 Mysql

#執行最新版 Mysql

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345678 -d mysql

#執行制定版本

docker run --name mysql_57 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:5.7

引數:

  • run:建立一個新的容器

  • --name : 容器名稱

  • -p : 埠對映(local_port:container_port)

  • -e : 傳入環境變數

  • -d : 後臺執行

進入容器內部

docker exec -it mysql bash
  • -i 表示允許我們對容器進行操作

  • -t 表示在新容器內指定一個為終端

  • /etc/mysql : Mysql 容器內的配置檔案目錄,目錄下包含 my.cnf 配置和一個 conf.d 資料夾,my.cnf 檔案內是一些基礎配置。自定義的配置應該寫在 conf.d 資料夾下的配置檔案裡,從而覆蓋預設的 my.cnf。

  • /var/lib/mysql : 映象內 Mysql 的持久化資料儲存目錄

MySQL 屬於有狀態應用,若將其容器化需將其狀態抽離到宿主機,其配置檔案、日誌檔案和持久化資料都應該掛載到宿主機上。在 PC 上建立目錄儲存 Mysql 的資料、配置、日誌,這樣資料儲存在宿主機上,我們刪除容器後再次安裝,可直接使用,不會導致資料丟失。

mkdir -p docker/mysql && cd docker/mysql

mkdir data log conf

移除我們先前建立的 Mysql 容器

docker stop mysql && docker rm mysql

在 conf 目錄中新建 my.cnf 檔案,作為 Mysql 的配置檔案

vim my.cnf



[mysqld]



datadir=/var/lib/mysql

#(預設不是中國時區,使用的時候被坑過)

default-time_zone = '+8:00'



log-error=/var/log/mysql/error.log

然後重新建立 Mysql 容器,並將建立的目錄掛載到容器內對應的目錄上。

docker run --name mysql

--restart=always ( Docker 重啟時容器也跟隨啟動)

--privileged=true (Docker 為容易內的 root 使用者賦予真正的 root 許可權,不然會提示 log 目錄許可權不足)

-p 3306:3306

-v docker/mysql/conf:/etc/mysql/conf.d (將配置目錄掛載到容器內的配置目錄)

-v docker/mysql/data:/var/lib/mysql (將資料儲存目錄掛載到容器內的出局儲存目錄)

-v /docker/mysql/log:/var/log/mysql (將日誌目錄掛載到容器內的日誌目錄)

-e MYSQL_ROOT_PASSWORD=12345678

-d mysql

  • -v 將容器內路徑掛載到宿主機路徑

進行容器內部,配置可使用資料庫管理工具連線 Mysql

$ docker exec -it mysql bash



$ mysql -u root -p



$ mysql-> ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '12345678';



$ mysql-> FLUSH PRIVILEGES;

現在可以使用資料庫管理工具進行連線了。

安裝 Nginx

拉取映象

docker pull nginx

建立並啟動容器

docker run --name nginx -p 80:80 -d nginx

然後訪問 localhost 就可以看到 Nginx 的預設歡迎頁面

建立目錄儲存 Nginx 的配置和日誌

mkdir -p docker/nginx && cd docker/nginx

mkdir conf log

從容器內複製配置檔案到宿主機,經配置檔案對映到容器內對應的目錄中

docker cp nginx:/etc/nginx/conf.d/default.conf docker/nginx/conf/default.conf

重新建立

docker stop nginx && docker rm nginx

docker run --name nginx -p 80:80 -v docker/nginx/conf:/etc/nginx/conf.d

-v docker/www:/usr/share/nginx/html -v docker/nginx/log:/var/log/nginx -d nginx

安裝 PHP

拉取 PHP 映象

docker pull php:fpm

建立容器

docker run --name php-fpm -p 9000:9000 -d php:fpm

建立目錄儲存php配置檔案和日誌

mkdir -p docker/php && cd docker/php

mkdir conf log

從容器中複製配置檔案

docker cp php-fpm:/usr/local/etc/php-fpm.d/www.conf docker/php/conf/www.conf

docker cp php-fpm:/usr/local/etc/php/php.ini-production docker/php/conf/php.ini

重新啟動容器

docker run --name php-fpm --link mysql:mysql

-v ~/docker/www:/var/www/html

-v docker/php/conf/www.conf:/usr/local/etc/php-fpm.d/www.conf

-v docker/php/conf/php.ini:/usr/local/etc/php/php.ini

-d php:fpm

  • --link : 可以用來連結2個容器,使得源容器和接收容器之間可以互相通訊
    連線 PHP 和 Mysql 容器後,PHP 指令碼連線資料庫時,host 的值為 'mysql'。

Nginx 容器支援 PHP-FPM 容器

修改 Nginx 的配置檔案 default.conf

server {

listen 80;

server_name localhost;

root /usr/share/nginx/html;

charset utf-8;



access_log /var/log/nginx/access.log main;

error_log /var/log/nginx/error.log;



location / {

index index.html index.htm index.php;

try_files $uri $uri/ /index.php?$query_string;

}



#error_page 404 /404.html;



# redirect server error pages to the static page /50x.html

#

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}



location ~ \.php$ {



fastcgi_index index.php;

#php-fpm容器名:埠號

fastcgi_pass php-fpm:9000;



fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;



include fastcgi_params;

}



location ~ /\.ht {

deny all;

}

}

重新建立 Nginx 容器

docker stop nginx && docker rm nginx

docker run --name nginx -p 80:80 --link php-fpm

-v docker/nginx/conf:/etc/nginx/conf.d

-v docker/www:/usr/share/nginx/html

-v docker/nginx/log:/var/log/nginx

-d nginx

OK!在 docker/www 下建立 index.php

phpinfo();

開啟 localhost 就可以看到 phpinfo() 函式的輸出資訊。

安裝 php 擴充套件

docker-php-ext-install mysqli
#如果提示無法安裝
pecl install redis && docker-php-ext-install redis
#安裝gd擴充套件

apt-get update

apt-get install libpng-dev libjpeg-dev libfreetype6-dev

docker-php-ext-install gd

安裝完擴充套件後,不需要修改配置檔案,重啟 PHP 容器即可。

  • 容器啟動順序:mysql > php > nginx

*宣告:本文於網路整理,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜

END

PHP開源社群

掃描關注  進入”PHP資料“

免費獲取進階

面試、文件、影片資源

點選“檢視原文”獲取更多