docker-compose一键部署LNMP环境(Nginx+MySQL+PHP)
文章目录版本信息创建compose_lnmp目录编辑 php/Dockerfile编辑docker-compose.yml启动服务数据持久化目录php配置文件nginx配置测试验证查看容器状态验证mysql验证php访问Primary script unknown错误处理版本信息宿主机系统 CentOS Linux release 7.6.1810 (Core)docker Version 18.
文章目录
版本信息
创建compose_lnmp目录
编辑 php/Dockerfile
编辑docker-compose.yml
启动服务
数据持久化目录
php配置文件
nginx配置
测试验证
查看容器状态
验证mysql
验证php访问
Primary script unknown错误处理
版本信息
宿主机系统 CentOS Linux release 7.6.1810 (Core)
docker Version 18.09.6
docker-compose version 1.18.0
MySQL 5.6.44
PHP 7.0.33 (cli)
PHP 7.0.33 (fpm-fcgi)
1
2
3
4
5
6
创建compose_lnmp目录
结构如下
compose_lnmp/
├── docker-compose.yml
└── php
└── Dockerfile
1
2
3
4
编辑 php/Dockerfile
由于官方php-fpm镜像缺少一些扩展,所以要先用dockerfile构建新的镜像
注意配置时区和mysql扩展
FROM php:7.0-fpm
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
libmemcached-dev \
zlib1g-dev \
libcurl4-openssl-dev \
libxml2-dev \
--no-install-recommends && rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-install -j$(nproc) \
iconv mcrypt gettext curl mysqli pdo pdo_mysql zip \
mbstring bcmath opcache xml simplexml sockets hash soap \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
CMD ["php-fpm", "-F"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
编辑docker-compose.yml
官方推荐使用volume优于bind mount
volume默认存放在/var/lib/docker/volumes
version: "3"
services:
mysql:
hostname: mysql
restart: always
image: mysql:5.6
container_name: mysql
ports:
- "3306:3306"
volumes:
- mysql-config:/etc/mysql
- mysql-log:/var/log/mysql
- mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_USER: user
MYSQL_PASSWORD: user123
php:
hostname: php
restart: always
container_name: php
build:
context: ./php
dockerfile: Dockerfile
ports:
- "9000:9000"
links:
- mysql:mysql
volumes:
- nginx-html:/var/www/html
- php-config:/usr/local/etc
nginx:
hostname: nginx
restart: always
container_name: nginx
image: nginx:1.17.0
ports:
- "80:80"
- "443:443"
links:
- "php:php"
volumes:
- nginx-config:/etc/nginx
- nginx-log:/var/log/nginx
- nginx-html:/usr/share/nginx/html
volumes:
mysql-config:
mysql-log:
mysql-data:
nginx-html:
php-config:
nginx-config:
nginx-log:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
启动服务
cd compose_lnmp
docker-compose up -d 启动
docker-compose restart 重启
1
2
3
4
数据持久化目录
/var/lib/docker/volumes
docker volume ls #查看volume
composelnmp_mysql-config 数据库配置文件
composelnmp_mysql-data 数据库数据文件
composelnmp_mysql-log 数据库日志
composelnmp_php-config PHP配置文件
composelnmp_nginx-config nginx配置文件
composelnmp_nginx-html nginx web目录
composelnmp_nginx-log nginx日志目录
metadata.db volumes元数据信息
1
2
3
4
5
6
7
8
9
10
php配置文件
/var/lib/docker/volumes/composelnmp_php-config/_data
默认的php.ini文件是没有的,需要手动把模板配置文件复制为php.ini
同时修改时区
cd /var/lib/docker/volumes/composelnmp_php-config/_data/php
cp php.ini-production php.ini
修改php.ini
date.timezone = Asia/Shanghai
1
2
3
4
5
nginx配置
/var/lib/docker/volumes/composelnmp_nginx-config/_data/conf.d/default.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass php:9000; #这里php就是php容器的名字
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; #此处配置要注意,有坑
include fastcgi_params;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
测试验证
查看容器状态
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b7531773beaa nginx:1.17.0 "nginx -g 'daemon of…" 14 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx
aaebabd0a32a composelnmp_php "docker-php-entrypoi…" 14 minutes ago Up 7 minutes 0.0.0.0:9000->9000/tcp php
df7b8bd4975b mysql:5.6 "docker-entrypoint.s…" 14 minutes ago Up 7 minutes 0.0.0.0:3306->3306/tcp mysql
1
2
3
4
验证mysql
[root@localhost ~]# docker container exec -it mysql bash
root@mysql:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.44 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.44 |
+-----------+
1 row in set (0.00 sec)
mysql>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
查mysql数据文件
[root@localhost _data]# pwd
/var/lib/docker/volumes/composelnmp_mysql-data/_data
[root@localhost _data]# ls
auto.cnf ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema
查mysql配置文件
[root@localhost _data]# pwd
/var/lib/docker/volumes/composelnmp_mysql-config/_data
[root@localhost _data]# ls
conf.d my.cnf my.cnf.fallback mysql.cnf mysql.conf.d
查mysql日志
[root@localhost _data]# pwd
/var/lib/docker/volumes/composelnmp_mysql-log/_data
[root@localhost _data]# ls
error.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
验证php访问
/var/lib/docker/volumes/composelnmp_nginx-html/_data/test.php
<?php phpinfo();
1
浏览器访问http://服务器IP/test.php
Primary script unknown错误处理
最开始部署完后访问测试index.php会报404
nginx日志显示"Primary script unknown"
2019/07/11 10:51:25 [error] 7#7: *4 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.159.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://172.18.0.3:9000", host: "192.168.159.128"
192.168.159.1 - - [11/Jul/2019:10:51:25 +0000] "GET /index.php HTTP/1.1" 404 27 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "-"
1
2
网上很多说改nginx配置是不对的
#修改为$document_root依然解决不了问题
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#正确应该是
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
1
2
3
4
5
还有很多说是php和nginx运行的用户不一致,或者目录权限不对;这些经我测试都是不准的
————————————————
版权声明:本文为CSDN博主「_Leo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiazichenxi/article/details/95652457
更多推荐
所有评论(0)