Docker搭建LNMP环境
-
准备工作
#docker拉取mysql,php,nginx镜像 docker pull mysql:5.6 docker pull nginx docker pull php:7.2-fpm
查看
docker images
-
运行容器
1.启动mysql容器 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.6 2.启动php容器 docker run -d \ -p 9000:9000 \ -v /mnt/www/html:/var/www/html \ --link mysql:mysql \ --name php7 php:7.2-fpm #建立文件: cd /mnt/www/html touch index.php # phpinfo(); #在php容器中安装mysql扩展 docker-php-ext-install pdo_mysql docker-php-ext-install mysqli #在容器里查看扩展模块 php -m 3.启动nginx容器 docker run -d -p 80:80 -v /mnt/www/html:/var/www/html -v /mnt/nginx/conf/conf.d:/etc/nginx/conf.d --link php7:phpfpm --name nginx nginx:latest 或者 docker run -d -p 80:80 \ -v /mnt/www/html:/usr/share/nginx/html \ -v /mnt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ -v /mnt/nginx/conf/conf.d:/etc/nginx/conf.d \ --link php7:phpfpm \ --name nginx nginx:latest 说明:-v ~/nginx/conf/conf.d:/etc/nginx/conf.d 实现容器和主机之间的数据共享,即主机的/nginx/conf/conf.d目录与容器中的/etc/nginx/conf.d目录数据共享,这样在宿主机中就可以操作容器里面的配置(数据卷volume运用)
启动Nginx关联php时失败N次
#循序渐进 #首先简单启动Nginx docker run -d -p 81:80 \ -v /mnt/www/html:/usr/share/nginx/html \ -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf \ -v /etc/nginx/conf.d:/etc/nginx/conf.d \ --name nginx1 nginx #成功启动且访问了主机的/mnt/www/html/index.html 文件 #但是访问index.php时却成了下载项(PHP与Nginx没有关联起来的原因) #启动并关联上PHP-fpm docker run -d -p 81:80 \ -v /mnt/www/html:/usr/share/nginx/html \ -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf \ -v /etc/nginx/conf.d:/etc/nginx/conf.d \ -v /mnt/hosts:/etc/hosts \ --link php7:phpfpm \ --name nginx1 nginx #运行还是出现问题 : File not found.&& Primary script unknown && "GET /index.php" 404 # 分析:如果"GET /"后面接的是404,这意味着nginx正确的将请求传达给了php-fpm #碰到进容器后无权限,要在-v挂载后加-privileged=true docker run -d -p 82:80 \ -v /mnt/www/html:/var/www/html\ -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf \ -v /etc/nginx/conf.d:/etc/nginx/conf.d \ -v /mnt/hosts:/etc/hosts \ --privileged=true \ --link php7:phpfpm \ --name nginx2 nginx #终于成功!
进入conf.d目录中编辑文件
location ~ \.php$ {
root /var/www/html;
fastcgi_index index.php;
fastcgi_pass phpfpm:9000;//这里改成我们之前--link进来的容器,也可以直接用php容器的ip
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;//如果你的根目录和php容器的根目录不一样,这里的$document_root需要换成你php下的根目录,不然php就找不到文件了
include fastcgi_params;
}
参数说明
-t 在容器里生产一个伪终端
-i 对容器内的标准输入 (STDIN) 进行交互
-d 让容器在后台运行
-p 添加主机到容器的端口映射
-v 添加目录映射,即主机上的/var/nginx/www/html和容器中/var/www/html目录是同步的
–name 容器的名字
–link 与另外一个容器建立起联系,这样我们就可以在当前容器中去使用另一个容器里的服务。
docker inspect 容器ID 查看容器的数据券是否挂载成功
- 测试运行
查询虚拟机端口号 ifconfig -> 192.168.19.101
无法访问此网站192.168.19.101 拒绝了我们的连接请求
Nginx没有启动成功
在使用docker容器时,有可能没有安装vi,
安装vi : apt-get install vim
如果提示:Unable to locate package vim
则需要敲:apt-get update, 等更新完毕以后再敲命令: apt-get install vim
访问php文件的时候不解析,直接下载
1、确定你能够正常访问php的容器(端口有没有开放、容器内能不能ping通)
2、fastcgi_pass是不是正确的php-fpm的地址
在不同的容器,
nginx配置文件中需要写成类似下面的
php:9000
其中php表示你的php(php-fpm)容器名称
还要使用–network指定nginx和php使用相同的网络
docker PHP+nginx : File not found. && Primary script unknown. && “GET /index.php” 404
>出现这种情况的原因是
一是说:
nginx容器和php-fpm容器,
使用了不同的html映射目录或数据卷。
解决的方法是:
nginx容器的html映射到宿主目录,
在php-fpm(php)容器也要做相同的映射
二是:
分析:如果"GET /"后面接的是404,这意味着nginx正确的将请求传达给了php-fpm
#碰到进容器后无权限,要在-v挂载后加-privileged=true
(本人是通过第二种方法解析php成功!)
Docker日志: docker logs -f --tail 1 php7
[error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.248.1, server: 115.182.68.147, request: "GET /test.php HTTP/1.1", upstream: "fastcgi://172.18.0.2:9000", host: "192.168.248.129"
问题原因:
php默认监听的是本地的9000端口
解决方法:
修改php-fpm所在容器的/etc/php-fpm.d/www.conf文件
把listen = 127.0.0.1:9000修改为
listen = 0.0.0.0:9000
辅助命令
# 查看容器所有状态信息
docker inspect NAMES
# 查看 容器ip 地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' ID/NAMES
# 容器运行状态
docker inspect --format '{{.Name}} {{.State.Running}}' NAMES
#查看容器进程
docker top NAMES
#查看容器端口
docker port ID/NAMES