1、创建目录

首先,位于D盘分别创建用于存放配置文件和数据文件的目录:

D:\dnmp
D:\dnmp\conf
D:\dnmp\html
D:\dnmp\mysql
D:\dnmp\redis

2、安装mysql

安装 mysql 5.7.25 版本,打开cmd或PowerShell,并输入以下指令:

docker run -d --name mysql -v D:\dnmp\mysql:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.25

参数说明:
-d 表示在后台运行容器
--name 为容器指定一个名称
-v 挂载主机的目录或文件到容器,即文件共享
-p 主机端口与容器端口的映射
-e 设置容器环境变量(此处设置mysql密码123456)

3、安装php

安装 php 7.2.16 版本(注意php是fpm模式运行),指令如下:

docker run -d --name php -v D:\dnmp\html:/var/www/html -p 9000:9000 php:7.2.16-fpm

进入php容器(登录bash shell):

docker exec -it php /bin/bash

在容器内执行cp指令,生成php.ini配置文件:

cp /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini

官方php镜像默认有些扩展没有装上,我们根据需要自己装。官方提供了docker-php-ext-install快速安装:

#创建目录(必须)
mkdir -p /usr/src/php/ext

#安装扩展bcmath、gettext、intl、mysqli、pdo_mysql、zlib
docker-php-ext-install bcmath gettext intl mysqli pdo_mysql zlib

另外一些扩展有依赖库的,需要先安装依赖库,如下:

#先更新本地源才能使用apt-get install
apt-get update

#安装bz2扩展,它依赖于libbz2-dev
apt-get install libbz2-dev
docker-php-ext-install bz2

#安装gd扩展,它依赖于libpng-dev
apt-get install libpng-dev
docker-php-ext-install gd

#安装intl扩展,它依赖于libicu-dev
apt-get install libicu-dev
docker-php-ext-install intl

#安装zip扩展,它依赖于zlib1g-dev
apt-get install zlib1g-dev
docker-php-ext-install zip

还有一些非官方标准的第三方扩展,需要下载源代码,解压后使用docker-php-ext-install安装:

#安装redis扩展,此处docker-php-ext-install需要指定全路径
curl -L -o redis-4.3.0.tgz http://pecl.php.net/get/redis-4.3.0.tgz
tar xf redis-4.3.0.tgz
docker-php-ext-install ~/redis-4.3.0

#安装swoole扩展,此处docker-php-ext-install需要指定全路径
curl -L -o swoole-4.3.1.tgz http://pecl.php.net/get/swoole-4.3.1.tgz
tar xf swoole-4.3.1.tgz
docker-php-ext-install ~/swoole-4.3.1

安装完成后,按Ctrl+D退出php容器,然后重启php容器:

docker restart php

4、安装nginx

安装 nginx 1.14.2 版本(目前稳定版),指令如下:

docker run -d --name nginx -v D:\dnmp\html:/var/www/html -p 80:80 nginx:1.14.2

创建 nginx.conf 文件,保存到 D:\dnmp\conf 目录,文件内容如下:

user  nginx;
worker_processes  1;

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;

    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;

    sendfile        on;
    tcp_nopush      on;

    keepalive_timeout  60;

    tcp_nodelay     on;

    server_tokens   off;

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript application/vnd.ms-fontobject image/svg+xml;
    gzip_vary on;

    include /etc/nginx/conf.d/*.conf;
}

创建 default.conf 文件, 保存到 D:\dnmp\conf 目录,内容如下:

server {
    listen 80;
    server_name localhost;
    root /var/www/html;
    index index.php index.html;

    location ~ .+\.php$ {
        fastcgi_pass 172.17.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    
    location ~ .+\.(gif|jpg|jpeg|png|bmp|swf|ico|svg|js|css)$ {
        expires 1d;
        access_log off;
    }

    location ~ (/\.)|(.+\.(sql|bak|ini)$) {
        deny all;
    }
}

接着,分别把这2个配置文件复制到nginx容器内:

docker cp D:\dnmp\conf\nginx.conf nginx:/etc/nginx/nginx.conf
docker cp D:\dnmp\conf\default.conf nginx:/etc/nginx/conf.d/default.conf

最后,重启nginx容器:

docker restart nginx

5、安装redis

redis的安装比较特殊,默认它是以无配置文件的方式启动,如果我们想以配置文件启动,需要先做好配置文件,然后挂载到容器内。

去redis官网下载默认配置文件redis.conf,链接地址是:http://download.redis.io/redis-stable/redis.conf

下载保存到 D:\dnmp\conf 目录,有几处需要修改:

  1. “bind 127.0.0.1”前面加个#号注释掉,表示不绑定IP,任何IP都可以连接
  2. “protected-mode yes”改成“protected-mode no”,禁用保护模式

安装redis最新版:

docker run -d --name redis -v D:\dnmp\redis:/data -v D:\dnmp\conf\redis.conf:/etc/redis.conf -p 6379:6379 redis:latest redis-server /etc/redis.conf

其中,我们把 D:\dnmp\conf\redis.conf 挂载为 /etc/redis.conf ,并让容器启动后自动执行 redis-server /etc/redis.conf 指令,以便覆盖不带配置文件的redis-server默认指令。

6、测试

自此lnmp环境配置完毕。

写两个php脚本放到 D:\dnmp\html 目录,然后在浏览器访问 http://127.0.0.1/xxx.php 分别访问,看看是否成功。

testmysql.php:

<?php
$mysqli = new mysqli('172.17.0.1', 'root', '123456');
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
echo '<p>Connection OK '. $mysqli->host_info.'</p>';
echo '<p>Server '.$mysqli->server_info.'</p>';
$mysqli->close();
?>

testredis.php:

<?php
$redis = new redis();  
$redis->connect('172.17.0.1', 6379);  
$result = $redis->info();  
print_r($result);
?>

7、总结

关于dnmp目录,最好不要用系统盘(C盘),可能会有权限问题。

首次挂载主机共享目录,docker会弹窗询问是否允许,请选择“share it”。如果没选上或共享失效,可以打开设置项 Settings --> Shared Drives 把要共享的盘勾上。

在docker环境下,不要把redis.conf里的 daemonize no 改成 daemonize yes ,否则redis启动失败!

如果重装mysql,记得清空 D:\dnmp\mysql 目录下的文件。

绑定端口映射失败,可能是主机端口已经被其他程序占用,我使用 netstat -ano 也没看到哪个程序占用端口,重启win10系统后,重新操作一遍,问题就没有了。

主机的IP是 172.17.0.1 ,做了端口映射后,连接mysql、redis、php-fpm等,就可以直接使用这个固定IP+端口号了。如果不希望做端口映射,则要使用各容器自己的IP,查看容器IP的指令是:

docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}} {{.HostConfig.PortBindings}}' $(docker ps -aq)

其他指令参考:

docker ps   //查看所有正在运行容器
docker stop containerId   //停止正在运行的容器,containerId是容器的ID(也可以用容器名称,下同)
docker start containerId  //启动容器

docker ps -a      //查看所有容器
docker ps -a -q   //查看所有容器ID

docker stop $(docker ps -a -q)  //停止所有容器
docker rm $(docker ps -a -q)    //删除所有容器

docker logs containerID   //查看容器运行日志

进入容器shell:
docker exec -it containerID /bin/bash    //退出的时候按Ctrl+D

非交互模式执行容器内的shell指令,例如php容器执行cp:
docker exec php cp /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini

文件复制:
docker cp host_path containerID:container_path  //从主机复制到容器
docker cp containerID:container_path host_path  //从容器复制到主机

docker update --restart=always xxx  //让容器随docker服务自启动
docker update --restart=no xxx    //禁用容器自启动
docker update --restart=on-failure:10 xxx  //指定docker将尝试重新启动容器的最大次数为10次

 

附件下载 :dnmp.zip