windows上利用docker搭建lnmp开发环境

项目地址:https://github.com/shmilylbelva/dnmp

开启Hyper-V

一、启用Hyper-V

打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图:

1513668234-6433-20171206211858191-1177002365.png

下载windwos版本docker安装包 地址
如下图

修改docker 镜像仓库

安装好后登陆docker(没有账号的请到官网进行注册)


修改为中国镜像

使用git快速获取lnmp

windows上推荐使用cmder来代替cmd

cmdercmder是一个增强型命令行工具,不仅可以使用windows下的所有命令,更爽的是可以使用linux的命令,shell命令。

后面的步骤和在mac上的一样。毕竟docker是跨系统的,真香。

切换到你准备安装dnmp的目录下

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

即开始安装资源,如下图


,完成以后可以在浏览器中访问localhost,出现以下界面代表ok。


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命令行。


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 |  
+-----------+------------------+-----------------------+------------------------------------------------------------------------+  

依次进行如下操作

#更新一下用户的密码 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

如果容器已经生成,回头再编辑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扩展正常。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容