項(xiàng)目地址:https://github.com/shmilylbelva/dnmp
安裝docker
新版的docker for mac 下載地址docker-ce-desktop-mac,不需要安裝docker toolbox 骚揍,安裝好后大概是這樣的
$ docker -v
$ docker-compose -v
修改docker 鏡像倉庫
首先是到阿里云獲取專屬加速地址
使用git快速獲取lnmp
進(jìn)入到當(dāng)前用戶mac終端窟哺,以次執(zhí)行
$ git clone https://github.com/shmilylbelva/dnmp.git
$ cd dnmp
$ docker-compose up
即開始安裝資源涛菠,如下圖
,完成以后可以在瀏覽器中訪問localhost疙渣,出現(xiàn)以下界面代表ok匙奴。
。
站點(diǎn)部署
本文有默認(rèn)加了兩個(gè)站點(diǎn):www.site1.com(同localhost)和www.site2.com妄荔。
要在本地訪問這兩個(gè)域名泼菌,需要修改你的hosts文件谍肤,添加以下兩行:
127.0.0.1 www.site1.com
127.0.0.1 www.site2.com
其中,www.site2.com為支持SSL/https和HTTP/2的示例站點(diǎn)哗伯。
因?yàn)檎军c(diǎn)2的SSL采用自簽名方式谣沸,所以瀏覽器有安全提示,繼續(xù)訪問就可以了笋颤,自己的站點(diǎn)用第三方SSL認(rèn)證證書替換即可乳附。
如果只用到站點(diǎn)1,把站點(diǎn)2相關(guān)的目錄和配置文件刪除:
./conf/nginx/conf.d/certs/site2/
./conf/nginx/conf.d/site2.conf
./www/site2/
重啟容器內(nèi)的Nginx生效:
docker exec -it dlnmp_nginx nginx -s reload
dnmp目錄結(jié)構(gòu)
.
├── conf 配置目錄
│ ├── conf.d 站點(diǎn)配置文件目錄
│ │ ├── certs SSL認(rèn)證文件伴澄、密鑰和加密文件目錄
│ │ │ └── site2 站點(diǎn)2的認(rèn)證文件目錄
│ │ ├── site1.conf 站點(diǎn)1 Nginx配置文件
│ │ └── site2.conf 站點(diǎn)2 Nginx配置文件
│ ├── my.cnf MySQL配置文件
│ ├── nginx.conf Nginx通用配置文件
│ ├── php-fpm.d PHP-FPM配置目錄
│ │ └── www.conf PHP-FPM配置文件
│ ├── php.ini PHP配置文件
├── docker-compose.yml 默認(rèn)容器啟動(dòng)配置文件
├── docker-compose54.yml php5.4容器啟動(dòng)配置文件
├── docker-compose56.yml php5.6容器啟動(dòng)配置文件
├── log 日志目錄
│ ├── mysql.slow.log MySQL日志
│ ├── nginx.error.log Nginx日志
│ ├── nginx.site1.error.log
│ ├── nginx.site2.error.log
├── mysql MySQL數(shù)據(jù)文件目錄
├── php PHP版本目錄
└── www 站點(diǎn)根目錄
├── site1 站點(diǎn)1根目錄
└── site2 站點(diǎn)2根目錄
MYSQL說明
在docker-compose.yml文件中赋除,我們指定了MySQL數(shù)據(jù)庫root用戶的密碼為123456。
所以非凌,我們就可以在主機(jī)中通過:
$ 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位就能區(qū)分举农。
$ mysql -h 127.0.0.1 -uroot -p
輸入密碼,就可以進(jìn)入MySQL命令行敞嗡。
說明:這里MySQL的連接主機(jī)不能用localhost颁糟,因?yàn)镸ySQL客戶端默認(rèn)使用unix socket方式連接,應(yīng)該直接用本地IP喉悴。
在PHP代碼中的使用方式與在主機(jī)中使用稍有不同棱貌,如下:
$pdo = new PDO('mysql:host=mysql;dbname=site1', 'root', '123456');
其中,host的值就是在docker-compose.yml里面指定的MySQL容器的名稱箕肃。
這是因?yàn)镻HP代碼是在FPM容器中婚脱,F(xiàn)PM容器啟動(dòng)時(shí)會(huì)自動(dòng)在/etc/hosts中加上:
172.17.0.2 mysql 11e55f91c4c3 dnmp_mysql
就是說,mysql自動(dòng)指向了MySQL容器動(dòng)態(tài)生成的IP勺像。
注意障贸,這里用php進(jìn)行mysql連接測(cè)試會(huì)失敗(在docker-compose up的時(shí)候注意到存在mbind:Operation not permitted 這個(gè)提示)
吟宦,所以還需要處理上述問題篮洁。
進(jìn)入剛剛的mysql終端,內(nèi)容大致如下。host為 % 表示不限制ip localhost表示本機(jī)使用 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 |
+-----------+------------------+-----------------------+------------------------------------------------------------------------+
依次進(jìn)行如下操作
#更新一下用戶的密碼 root用戶密碼為newpassword
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
mysql連接問題解決殃姓。
修改docker-compose.yml
如果容器已經(jīng)生成袁波,回頭再編輯docker-compose.yml,用
docker-compose up
命令會(huì)直接啟動(dòng)原來的容器辰狡,修改的內(nèi)容不會(huì)體現(xiàn)在啟動(dòng)的容器里锋叨。
所以,要使修改的docker-compose.yml生效宛篇,需要以下4步:
$ docker stop dnmp_nginx # 第一步:停止容器
$ docker rm dnmp_nginx # 第二步:刪除容器
# !!第三步:重啟Docker服務(wù)!!
$ docker-compose up -d --no-deps --build mysql # 第四步:重新啟動(dòng)容器
其中最后一條命令參數(shù)作用:/
-d:后臺(tái)執(zhí)行
--no-deps:不啟動(dòng)link的容器
--build:啟動(dòng)容器前先構(gòu)建鏡像
使用Redis
Redis使用和MySQL類似娃磺。
不過需要注意的是在./php/php72中的Dockerfile末尾的
#源碼安裝方式
#php7 can install
ENV PHPREDIS_VERSION 4.0.0
RUN curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz \
&& tar xfz /tmp/redis.tar.gz \
&& rm -r /tmp/redis.tar.gz \
&& mkdir -p /usr/src/php/ext \
&& mv phpredis-$PHPREDIS_VERSION /usr/src/php/ext/redis \
&& docker-php-ext-install redis \
&& rm -rf /usr/src/php
如果是php5.X那么這里應(yīng)該是這樣的(需要自己添加到對(duì)應(yīng)的Dockerfile中,然后再docker-compose up)
#PECL安裝方式
#php5 can install
#添加擴(kuò)展 redis pecl方式
RUN apk add --no-cache --update libmemcached-libs zlib
RUN set -xe \
&& apk add --no-cache --update --virtual .phpize-deps $PHPIZE_DEPS \
&& pecl install -o -f redis \
&& echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini
&& rm -rf /usr/share/php \
&& rm -rf /tmp/* \
&& apk del .phpize-deps
在主機(jī)和容器內(nèi)部都通過地址127.0.0.1叫倍,端口6379訪問偷卧。
PHP則是跨容器訪問豺瘤,host參數(shù)用redis(links指定的名稱),端口用6379听诸。
修改site2的index.php文件內(nèi)容如下
<?php
$redis = new Redis();
$redis->connect('192.168.1.11',6379);//修改成自己的ip
$redis->set('name','青波');
echo $redis->get('name');
//檢測(cè)是否連接成功
瀏覽器訪問www.site2.com,出現(xiàn)‘青波’即代表redis擴(kuò)展正常坐求。