轉載至個人博客php
做爲一隻iOS前端工程師,最近對PHP產生了興趣,我認爲這不屬於遊手好閒,做爲一個程序員不該該把本身侷限在一個封閉的領域當中,應該時刻保持好奇心,因此我對「世界上最好的語言」
開始了探索~html
工欲善其事,必先利其器,首先就要搭建開發環境,因爲本人不喜歡由於開發環境把本身的電腦搞得亂七八糟,亂安裝一些有的沒的依賴開發包,因此我選擇虛擬機+Docker
來搭建環境~前端
下面咱們開始:mysql
我選擇了徹底兼容Redhat
系統的CentOS7
發行版Linux
系統,下載Linux
而且虛擬機安裝系統這裏就省略了,準備好Linux
系統就能夠開始安裝Docker
了。linux
若是之前安裝過想從新安裝新版本請先使用下面的命令卸載舊版本的Docker
,第一次安裝請直接到第二步nginx
$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 複製代碼
Docker
提供兩種安裝方式,官方推薦使用軟件倉庫的方式安裝Docker
,方便更新等操做,另外一種是以RPM的方式安裝,這裏不作介紹~git
直接用官方推薦的方式安裝,首先設置Docker
的軟件倉庫程序員
先安裝Docker依賴的軟件包github
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 複製代碼
設置穩定版本的Docker
倉庫地址,Docker
還提供了測試版本的地址,這裏咱們不須要,只要穩定版本就能夠了。sql
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 複製代碼
安裝Docker
的最新版本
$ sudo yum install docker-ce 複製代碼
啓動Docker
服務
$ sudo systemctl start docker 複製代碼
測試Docker
是否工做正常
$ sudo docker run hello-world 複製代碼
若是輸出了 hello world
說明Docker已經安裝正常了
Dockerfile
是用來製做鏡像使用的一系列Docker
命令的腳本文件,docker build
命令會根據Dockerfile中的設置生成咱們自定義的鏡像。
首先準備好一個目錄結構以下:
testphp #你自定義的一個目錄名
├── html #用做Nginx的站點目錄
│ └── phptest #子目錄能夠自定義
│ ├── index.php #一段簡單的PHP代碼,好比<?php phpinfo();?>
├── mysql #Mysql數據庫相關的目錄
│ ├── conf #Mysql配置文件目錄
│ └── data #Mysql數據目錄
├── nginx #Nginx相關目錄
│ ├── conf #Nginx配置文件目錄
│ └── logs #Nginx日記目錄
└── php-mysqli #咱們須要根據官方鏡像生成支持mysqli的鏡像,此爲自定義目錄
└── Dockerfile #生成自定義鏡像的Dockerfile
複製代碼
在php-mysqli
目錄下的Dockerfile
文件中,輸入以下內容:
FROM php:7.2.11-fpm #基於PHP官方鏡像7.2.11-fpm版本製做自定義鏡像
RUN docker-php-ext-install mysqli #安裝PHP擴展支持mysqli
複製代碼
完成之後不用手動運行docker build
命令生成鏡像,稍後使用docker-compose
自動幫咱們構建鏡像。
docker-compose
是Docker
提供的用於管理多個Docekr
容器的工具,Docker
推薦的理念是,一個容器運行一個服務進程,這裏咱們搭建的環境包括,一個PHP
服務進程、一個Nginx
服務進程、一個phpadmin
進程(用於方便的操做mysql
數據庫的工具)、一個mysql
服務進程,總共4個,因此須要先安裝docker-compose
。
下載docker-compose
命令文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
複製代碼
爲docker-compose
命令文件賦予可執行權限
sudo chmod +x /usr/local/bin/docker-compose
複製代碼
測試安裝是否正確
$ sudo docker-compose --version 複製代碼
若是正常輸出版本號說明安裝完成
docker-compose
命令能夠根據咱們編寫的docker-compose.yml
文件自動的管理Docker
鏡像。
在咱們本身創建的根目錄下面新建一個docker-compose.yml
,輸入以下內容:
version: '3' #指定docker-compose文件的版本,低版本不支持services、
services: #networks等標籤
phpmyadmin:
image: phpmyadmin/phpmyadmin #使用的鏡像
ports: #端口映射
- "8080:80"
depends_on: #此服務要依賴於mysql服務
- mysql
links: #鏈接到mysql服務
- mysql:db
networks: #指定內部網絡
- app_net
nginx:
image: nginx:latest
ports:
- "80:80" #容器中的80端口映射到HOST的80端口
depends_on:
- "php"
volumes: #指定掛載的文件或目錄
- "./nginx/conf/nginx.conf:/etc/nginx/nginx.conf"
- "./html:/home:ro"
networks:
- app_net
container_name: "compose-nginx" #指定容器名字
php:
build: ./php-mysqli #這裏指定Dockerfile的路徑 會幫咱們自動構建鏡像
image: php:7.2.11-fpm-mysqli
ports:
- "9000:9000"
depends_on:
- mysql
volumes: #這裏的掛載目錄要和nginx中的同樣,不然找不到php文件
- "./html:/home"
networks:
- app_net
container_name: "compose-php"
mysql:
image: mysql:5.7.24 #數據庫鏡像版本
ports:
- "3306:3306"
volumes:
- "./mysql/data:/var/lib/mysql"
- "./mysql/conf/my.cnf:/etc/mysql/my.cnf"
environment: #鏡像內部使用的環境變量,這裏用來摺紙數據庫的密碼
- MYSQL_ROOT_PASSWORD=zhaofucheng
networks:
app_net:
ipv4_address: 10.10.10.1 #指定內部網絡中的IP地址
container_name: "compose-mysql"
networks:
app_net:
driver: bridge #網絡模式用橋接
ipam:
config:
- subnet: 10.10.0.0/16 #使用CIDR方式子網劃分
複製代碼
這裏咱們須要把配置文件放到咱們的指定的目錄中,稍後更改配置不須要進入到容器內部,也能更好的管理配置咱們的服務。
有兩種方式準備鏡像文件,一是本身從頭編寫,而是從鏡像當中複製一個默認的再根據本身的須要去修改,這裏咱們選擇從鏡像當中複製。
準備Nginx配置文件
啓動一個臨時容器
$ sudo docker run --name tmp-nginx-container -d nginx 複製代碼
從臨時nginx
鏡像當中複製配置文件 放到咱們本身創建的nginx/conf
目錄中
$ sudo docker cp tmp-nginx-container:/etc/nginx/nginx.conf ./nginx/conf/nginx.conf 複製代碼
刪除創建的臨時容器
$ sudo docker rm -f tmp-nginx-container 複製代碼
編輯文件內容以下:
user nginx;
worker_processes 2; #根據CPU核心數量指定工做線程的數量,這裏個人虛擬機爲2核心
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
#日誌記錄的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#訪問日誌的目錄地址
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
server {
listen 80; #監聽端口
server_name test.ng; #虛擬主機的名稱,稍後要寫入到本機的host文件當中
root /home/phptest; #項目php的路徑
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log error;
location / {
index index.html index.htm index.php;
}
#配置全部訪問php的請求都交給PHP: FastCGI 進程管理器處理
location ~ \.php$ {
fastcgi_pass php:9000;#這裏是在docker-compose.yml文件中指定的服務名和端口號
fastcgi_index index.php; #默認尋找的php入口頁面
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; #網絡上還有另外一種方式 include fastcgi.conf; 因爲要引入一個新的配置文件 這裏我就嫌麻煩就使用這種方式了 根據我的喜愛本身選擇吧
}
}
}
複製代碼
一樣複製Mysql
的配置文件
啓動一個臨時的Mysql
容器
$ sudo docker run --name tmp-mysql-container -d mysql:5.7.24 複製代碼
從臨時的Mysql
容器中複製配置文件到咱們指定的目錄
$ sudo docker cp tmp-mysql-container:/etc/mysql/my.cnf ./mysql/conf/my.conf 複製代碼
刪除臨時的Mysql
容器
$ sudo docker rm -f tmp-mysql-container 複製代碼
這裏咱們使用默認的mysql配置就能夠了。
在虛擬機的終端中輸入:
$ ifconfig eth0 #查看默認網卡的信息 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.31.150 netmask 255.255.255.0 broadcast 192.168.31.255 inet6 fe80::caec:3251:7864:4814 prefixlen 64 scopeid 0x20<link> ether 00:1c:42:a4:5b:ef txqueuelen 1000 (Ethernet) RX packets 2341561 bytes 1335991534 (1.2 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 520557 bytes 56885302 (54.2 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 複製代碼
其中的inet 192.168.31.150
就是咱們虛擬機的IP地址,我本人的電腦是Mac系統,因此回到在個人Mac系統電腦的終端中輸入:
$ sudo vim /etc/hosts 複製代碼
將咱們指定的虛擬主機名和IP地址以以下格式加入到host文件中 而後保存退出。
192.168.31.150 test.ng #Ngxin服務地址
192.168.31.150:8080 phpadmin.net #用於訪問PhpAdmin服務
複製代碼
稍後咱們就能夠直接在瀏覽器中輸入http://test.ng/
訪問Nginx
測試了。
回到虛擬機中,咱們目前爲止的文件結構以下:
testphp
├── docker-compose.yml
├── html
│ └── phptest
│ ├── index.php
│ ├── testmysql.php
├── mysql
│ ├── conf
│ │ └── my.cnf
│ └── data
├── nginx
│ ├── conf
│ │ └── nginx.conf
│ └── logs
└── php-mysqli
└── Dockerfile
複製代碼
編輯咱們的index.php
文件,輸入以下內容:
<?php phpinfo(); ?> 複製代碼
有些人不輸入<?php
而是直接寫<?
,致使出現錯誤,還得修改什麼php.ini
配置項,這裏我建議就別給本身找麻煩,按照標準寫法就能夠了,別起什麼幺蛾子~
編輯testmysql.php
文件用來測試可否鏈接到Mysql
數據庫,輸入以下內容:
<?php $db = new mysqli('10.10.10.1:3306','root','zhaofucheng','testdatabase'); if (mysqli_connect_errno()) { echo 'Error: Could not connect to database. Please try again later.'; exit; } else { echo 'The connection is successful.'; } $db->close(); ?> 複製代碼
確保咱們在本身定義的根目錄中輸入:
testphp]$ sudo /usr/local/bin/docker-compose up -d testphp]$ sudo docker ps 複製代碼
若是輸入完成後能夠看到四個容器都啓動了,那麼表明咱們成功了,若是出現了錯誤,請回到上面仔細對照配置項,或者Google
、Baidu
以及留言給我一塊兒解決~
先在咱們本身電腦的瀏覽器中輸入地址http://test.ng/
,成功頁面以下圖:
以上表明咱們的Nginx
和PHP
已經配合完美了~~
再來測試phpMyAdmin
是否也成功啓動了,在瀏覽器中輸入地址http://phpadmin.net
訪問,成功頁面以下圖:
出現上圖表明phpMyAdmin
啓動成功,若是輸入咱們配置的Mysql
密碼能夠正常登錄,表明phpMyAdmin
和Mysql
配合完美了~
這裏若是登錄成功了,如今數據庫中新建一個名叫testdatabase
數據庫,用來給咱們測試PHP
是否能正常鏈接到Mysql
,
如今見證奇蹟的時刻到了~,在瀏覽器中輸入http://test.ng/testmysql.php
訪問,若是頁面顯示The connection is successful.
那就表明成功了~,能夠盡情的玩耍了~~。
我在使用Mysql8.0
版本的鏡像來配置時,發現PHP
默認的配置不能登陸到Mysql
,致使鏈接報錯,原來是Mysql8.0
改了密碼驗證方式,若是想要正常鏈接,須要在Mysql
數據庫中把要登錄的用戶密碼的驗證方式從caching_sha2_password
改成mysql_native_password
,這裏就不費那個勁了,練習環境5.7
版本的Mysql
就能夠了~