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

項目地址https://github.com/shmilylbel...php

安裝docker

新版的docker for mac 下載地址docker-ce-desktop-mac,不須要安裝docker toolbox ,安裝好後大概是這樣的docker,能夠在終端測試mysql

$ docker -v
$ docker-compose -v

修改docker 鏡像倉庫

首先是到阿里雲獲取專屬加速地址阿里雲Docker官方鏡像,打開docker->preferences->Daemon->Registry mirrors 點擊加號,粘貼剛剛獲取到的加速地址,點擊Apply & Restart。linux

使用git快速獲取lnmp

進入到當前用戶mac終端,以次執行nginx

$ git clone https://github.com/shmilylbelva/dnmp.git
$ cd dnmp
$ docker-compose up

即開始安裝資源,以下圖
git

,完成之後能夠在瀏覽器中訪問localhost,出現如下界面表明ok。
localhostgithub

站點部署

本文有默認加了兩個站點:www.site1.com(同localhost)和www.site2.com。redis

要在本地訪問這兩個域名,須要修改你的hosts文件,添加如下兩行:sql

127.0.0.1 www.site1.com
127.0.0.1 www.site2.com
其中,www.site2.com爲支持SSL/https和HTTP/2的示例站點。docker

由於站點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命令行。
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 dnmp_mysql
就是說,mysql自動指向了MySQL容器動態生成的IP。
注意,這裏用php進行mysql鏈接測試會失敗(在docker-compose up的時候注意到存在mbind:Operation not permitted 這個提示)
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相似。
不過須要注意的是在./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那麼這裏應該是這樣的(須要本身添加到對應的Dockerfile中,而後再docker-compose up)

#PECL安裝方式
#php5 can install

#添加擴展 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

在主機和容器內部都經過地址127.0.0.1,端口6379訪問。

PHP則是跨容器訪問,host參數用redis(links指定的名稱),端口用6379。
修改site2的index.php文件內容以下

<?php
    $redis = new Redis();
    $redis->connect('192.168.1.11',6379);//修改爲本身的ip
    $redis->set('name','青波');
    echo $redis->get('name');
        //檢測是否鏈接成功

瀏覽器訪問www.site2.com,出現‘青波’即表明redis擴展正常。

相關文章
相關標籤/搜索