mac上利用利用docker搭建lnmp開發環境

安裝docker

新版的docker for mac 下載地址https://store。docker。com/editions/community/docker-ce-desktop-mac,不需要安裝docker toolbox ,安裝好後大概是這樣的

mac上利用利用docker搭建lnmp開發環境

docker

,可以在終端測試$ docker -v$ docker-compose -v

修改docker 映象倉庫

首先是到阿里雲獲取專屬加速地址

mac上利用利用docker搭建lnmp開發環境

阿里雲Docker官方映象

,開啟docker->preferences->Daemon->Registry mirrors 點選加號,貼上剛剛獲取到的加速地址,點選Apply & Restart。

使用git快速獲取lnmp

進入到當前使用者mac終端,以次執行

$ git clone https://github。com/yeszao/dnmp。git$ cd dnmp$ docker-compose up

即開始安裝資源,如下圖

mac上利用利用docker搭建lnmp開發環境

下載資源

,完成以後可以在瀏覽器中訪問localhost,出現以下介面代表ok。

mac上利用利用docker搭建lnmp開發環境

localhost

站點部署

本文有預設加了兩個站點:www。site1。com(同localhost)和www。site2。com。

要在本地訪問這兩個域名,需要修改你的hosts檔案,新增以下兩行:

127。0。0。1 www。site1。com

127。0。0。1 www。site2。com

其中,www。site2。com為支援SSL/https和HTTP/2的示例站點。

因為站點2的SSL採用自簽名方式,所以瀏覽器有安全提示,繼續訪問就可以了,自己的站點用第三方SSL認證證書替換即可。

如果只用到站點1,把站點2相關的目錄和配置檔案刪除:

。/conf/nginx/conf。d/certs/site2/

。/conf/nginx/conf。d/site2。conf

。/www/site2/

重啟容器內的Nginx生效:

docker exec -it dlnmp_nginx nginx -s reload

dnmp目錄結構

。├── conf 配置目錄│ ├── conf。d 站點配置檔案目錄│ │ ├── certs SSL認證檔案、金鑰和加密檔案目錄│ │ │ └── site2 站點2的認證檔案目錄│ │ ├── site1。conf 站點1 Nginx配置檔案│ │ └── site2。conf 站點2 Nginx配置檔案 │ ├── my。cnf MySQL配置檔案 │ ├── nginx。conf Nginx通用配置檔案│ ├── php-fpm。d PHP-FPM配置目錄│ │ └── www。conf PHP-FPM配置檔案│ ├── php。ini PHP配置檔案├── docker-compose。yml 預設容器啟動配置檔案├── docker-compose54。yml php5。4容器啟動配置檔案├── docker-compose56。yml php5。6容器啟動配置檔案├── log 日誌目錄│ ├── mysql。slow。log MySQL日誌│ ├── nginx。error。log Nginx日誌│ ├── nginx。site1。error。log │ ├── nginx。site2。error。log ├── mysql MySQL資料檔案目錄├── php PHP版本目錄└── www 站點根目錄 ├── site1 站點1根目錄 └── site2 站點2根目錄

MYSQL說明

在docker-compose。yml檔案中,我們指定了MySQL資料庫root使用者的密碼為123456。

所以,我們就可以在主機中透過:

$ mysql -h 127。0。0。1 -u root -p #linux中#在mac中需要先切換到mysql容器$ docker container ls #列出容器列表$ docker exec -it 775c7c9ee1e1 /bin/bash #其中的容器id不用輸入完整的mysql容器id,一般3位就能區分。$ mysql -h 127。0。0。1 -uroot -p

輸入密碼,就可以進入MySQL命令列。

mac上利用利用docker搭建lnmp開發環境

mysql

說明:這裡MySQL的連線主機不能用localhost,因為MySQL客戶端預設使用unix socket方式連線,應該直接用本地IP。

在PHP程式碼中的使用方式與在主機中使用稍有不同,如下:

$pdo = new PDO(‘mysql:host=mysql;dbname=site1’, ‘root’, ‘123456’);

其中,host的值就是在docker-compose。yml裡面指定的MySQL容器的名稱。

這是因為PHP程式碼是在FPM容器中,FPM容器啟動時會自動在/etc/hosts中加上:

172。17。0。2 mysql 11e55f91c4c3 dlnmp_mysql_1

就是說,mysql自動指向了MySQL容器動態生成的IP。

注意,這裡用php進行mysql連線測試會失敗(在docker-compose up的時候注意到存在mbind:Operation not permitted 這個提示)

mac上利用利用docker搭建lnmp開發環境

mbind:Operation not permitted

,所以還需要處理上述問題。

進入剛剛的mysql終端,內容大致如下。host為 % 表示不限制ip localhost表示本機使用 plugin非mysql_native_password 則需要修改密碼

mysql> select host,user,plugin,authentication_string from mysql。user; +——————-+——————————+————————————-+————————————————————————————————————+ | host | user | plugin | authentication_string | +——————-+——————————+————————————-+————————————————————————————————————+ | % | root | caching_sha2_password | $A$005$^]RQB}j~t! 。#v)3。UogPRFu8VJA5/GKEbK5edEQlMT5sHw2n72zYJNlIbo3 | | localhost | mysql。infoschema | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | localhost | mysql。session | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | localhost | mysql。sys | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | localhost | root | caching_sha2_password | $A$005$Y6&q!59^Fmh)@-6TG58J3F5+3I/HI9L|JCadNG+-+d6W+1D_UFW+7MRD7F3 | +——————-+——————————+————————————-+————————————————————————————————————+

依次進行如下操作

ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘newpassword’; #更新一下使用者的密碼 root使用者密碼為newpassword mysql> ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘123456’; Query OK, 0 rows affected (0。06 sec)

mysql連線問題解決。

修改docker-compose.yml

如果容器已經生成,回頭再編輯docker-compose。yml,用

docker-compose up

命令會直接啟動原來的容器,修改的內容不會體現在啟動的容器裡。

所以,要使修改的docker-compose。yml生效,需要以下4步:

$ docker stop dnmp_nginx # 第一步:停止容器$ docker rm dnmp_nginx # 第二步:刪除容器# !!第三步:重啟Docker服務!!$ docker-compose up -d ——no-deps ——build mysql # 第四步:重新啟動容器

其中最後一條命令引數作用:/

-d:後臺執行

——no-deps:不啟動link的容器

——build:啟動容器前先構建映象

使用Redis

Redis使用和MySQL類似。

在主機和容器內部都透過地址127。0。0。1,埠6379訪問。

PHP則是跨容器訪問,host引數用redis(links指定的名稱),埠用6379。