- 本文地址: https://www.yangdx.com/2019/03/28.html
- 转载请注明出处
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、mysqli、pdo_mysql、zlib
docker-php-ext-install bcmath gettext 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 目录,有几处需要修改:
- “bind 127.0.0.1”前面加个#号注释掉,表示不绑定IP,任何IP都可以连接
- “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
想请问下 为什么生成php.ini配置文件.cp文件不存在呢?
博主回复:
你好,没明白你的意思。可以的话,请发个邮件详细说明:admin@yangdx.com