Docker-compose搭建LNMP环境(centos7 php5.6)(转)

本文详细介绍了如何使用Docker-compose在CentOS7环境下搭建LNMP(Nginx, PHP7, MySQL)服务,包括各服务的Dockerfile配置、目录结构、配置文件详解及启动命令,特别强调了Nginx与PHP的映射目录一致性问题。

https://www.cnblogs.com/showker/p/15927589.html
各种问题汇总:

1、html文件能读取,php文件不能解析,提示如下
FastCGI sent in stderr: “Unable to open primary script: /usr/local/nginx/html/ecstore_lap/index.php (No such file or directory)” while reading response header from upstream

问题,nginx和php的映射目录一定要一致!!!
nginx

volumes:
- ./wwwroot:/usr/local/nginx/html

php:
hostname: php
build: ./php
links:
- mysql:mysql-db
volumes:
- ./wwwroot:/usr/local/nginx/html

之前有随笔介绍使用Docker-compose搭建LNMP环境(centos6 php5.6)

  https://www.cnblogs.com/minseo/p/10146982.html

本文介绍Docker-compose搭建LNMP环境(centos7 php7)

文件目录结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
├── docker-compose.yml
├── mysql
│ ├── conf
│ └── data
├── nginx
│ ├── Dockerfile
│ ├── nginx-1.16.0.tar.gz
│ └── nginx.conf
├── php
│ ├── Dockerfile
│ ├── libzip-1.2.0.tar.gz
│ ├── php-7.3.9.tar.gz
│ └── php.ini
└── wwwroot
├── index.html
└── test.php
  需下载安装包 nginx-1.16.0.tar.gz libzip-1.2.0.tar.gz php-7.3.9.tar.gz

1
2
3
wget http://nginx.org/download/nginx-1.16.1.tar.gz
wget https://libzip.org/download/libzip-1.2.0.tar.gz
wget https://www.php.net/distributions/php-7.3.9.tar.gz
  docker-compose.yml

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
version: ‘3’
services:
nginx:
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- “80:80”
links:
- php:php-cgi
volumes:
- ./wwwroot:/usr/local/nginx/html

php:
hostname: php
build: ./php
links:
- mysql:mysql-db
volumes:
- ./wwwroot:/usr/local/nginx/html

mysql:
hostname: mysql
image: mysql:5.7
ports:
- “3306:3306”
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
MYSQL_USER: user
MYSQL_PASSWORD: user123
  PS:links php:php-cgi意思是链接到服务名为php的服务,可以使用host名 php-cgi访问该容器,在启动容器后进入容器ping

进入nginx容器ping测试

同理下面的配置mysql:mysql-db也是一样的道理,在php容器中使用host名mysql-db访问mysql容器

mysql/conf/my.cnf

1
2
3
4
5
6
7
8
9
[mysqld]
user=mysql
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysql.pid
log_error=/var/log/mysql/error.log
character_set_server = utf8
max_connections=3600
  nginx/Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[mysqld]
user=mysql
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysql.pid
log_error=/var/log/mysql/error.log
character_set_server = utf8
max_connections=3600
root@test-docker1:/data/compose_lnmp# cat nginx/Dockerfile
FROM centos:7
MAINTAINER liuym
RUN yum install -y gcc-c++ zlib-devel pcre-devel make
ADD nginx-1.16.0.tar.gz /tmp
RUN cd /tmp/nginx-1.16.0 && ./configure --prefix=/usr/local/nginx && make -j 2 && make install
RUN rm -f /usr/local/nginx/conf/nginx.conf
COPY nginx.conf /usr/local/nginx/conf

EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", “-g”, “daemon off;”]
  nginx/nginx.conf

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
user root;
worker_processes auto;

error_log logs/error.log info;

pid logs/nginx.pid;

events {
use epoll;
}

http {

include       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 logs/access.log main;
sendfile        on;
keepalive_timeout  65;

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

    location ~ \.php$ {
        root html;
        fastcgi_pass php-cgi:9000;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

}
  php/Dockerfile

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
FROM centos:7
MAINTAINER liuym
RUN yum install -y gcc gcc-c++ gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel make perl
ADD libzip-1.2.0.tar.gz /tmp
RUN cd /tmp/libzip-1.2.0 &&
./configure &&
make &&
make install
ADD php-7.3.9.tar.gz /tmp
RUN cd /tmp/php-7.3.9 &&
./configure --prefix=/usr/local/php
–with-config-file-path=/usr/local/php/etc
–with-mysql --with-mysqli
–with-openssl --with-zlib --with-curl --with-gd
–with-jpeg-dir --with-png-dir --with-iconv
–enable-fpm --enable-zip --enable-mbstring &&
cp /usr/local/lib/libzip/include/zipconf.h /usr/local/include/ &&
make -j 4 && make install &&
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf &&
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf &&
sed -i “s/127.0.0.1/0.0.0.0/g” /usr/local/php/etc/php-fpm.d/www.conf &&
cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm &&
chmod +x /etc/init.d/php-fpm
#COPY php.ini /usr/local/php/etc

EXPOSE 9000
CMD /etc/init.d/php-fpm start && tail -F /var/log/messages
  PS:1,CentOS7自带libzip版本较低需要下载编译安装

2,需要把默认配置文件www.conf.default重命名为www.conf并且修改配置把127.0.0.1改成0.0.0.0否则会导致无法访问php页面,因为启动了不同的容器无法通过127.0.0.1访问

            3,配置文件php.ini可以不拷贝

wwwroot/test.php

1

<?php phpinfo()?>

启动

1
docker-compose up -d
  查看

web页面访问

<think>好的,我现在需要帮助用户在CentOS 7上使用Docker Compose配置LNMP环境,并且要包括环境变量的设置和.env文件的使用,特别是MySQL的根密码。用户之前提供的引用内容中有一些配置示例,比如docker-compose.yml和my.cnf文件,还有关于环境变量的部分。我需要结合这些信息,同时参考之前的回答来生成一个详细的教程。 首先,我需要确保用户的环境已经安装了DockerDocker Compose。根据引用[2]中的内容,用户提到关闭防火墙和SELinux,这可能是一个必要的步骤,所以应该在教程中包括这部分。另外,用户引用了Dockerfile的构建,但当前问题可能更关注docker-compose的配置,所以可能需要简化Dockerfile部分,或者假设用户已经构建了相应的镜像。 接下来,用户想了解如何使用.env文件来管理环境变量,尤其是MySQL的root密码。在之前的回答中,我已经详细介绍了environment指令和.env文件的使用,所以这里需要再次强调,并给出具体的示例。需要确保用户明白如何在docker-compose.yml中引用变量,以及如何在.env文件中定义这些变量,特别是敏感信息如密码的处理。 然后,LNMP环境的配置包括Nginx、MySQL、PHP三个服务,需要确保它们在同一个网络中,并且正确设置volumes、ports、depends_on等配置。根据引用[1]中的docker-compose.yml示例,用户已经配置了自定义网络和静态IP,但可能在实际应用中更推荐让Docker自动分配IP,除非有特殊需求。因此,可能需要调整网络配置部分,使其更简洁。 另外,用户提到的MySQL配置文件my.cnf,在引用[3]中有示例,但用户可能希望将配置通过volume挂载到容器中,而不是在构建镜像时复制进去。这需要在docker-compose.yml中配置volumes,将本地的my.cnf文件挂载到容器的相应位置。同时,PHP可能需要与Nginx共享html目录,所以volumes部分需要正确设置共享路径。 对于环境变量,重点在于如何在docker-compose.yml中使用${}语法引用.env文件中的变量,并确保.env文件不被提交到版本控制。需要提醒用户将.env添加到.gitignore中,并考虑安全措施,比如使用docker secret或其他工具管理敏感数据,但可能对于初级用户来说,先掌握.env文件的使用更为实际。 最后,需要验证整个配置是否正确,包括检查docker-compose config是否有错误,以及容器启动后各服务是否能正常通信。可能还需要指导用户如何测试LNMP环境,比如通过创建一个phpinfo页面或安装WordPress来验证PHP和MySQL的连接是否正常。 总结步骤应该是:安装DockerDocker Compose → 准备项目目录结构 → 配置各服务的Dockerfile(如果需要自定义镜像)→ 编写docker-compose.yml并引用环境变量 → 创建.env文件 → 启动服务 → 验证配置。需要确保每个步骤清晰,并提供具体的命令和配置示例,特别是.env文件和docker-compose.yml的详细内容。</think>### CentOS 7 使用 Docker Compose 配置 LNMP 环境(含环境变量与 `.env` 文件) --- #### 一、环境准备 1. **关闭防火墙与 SELinux** ```bash systemctl disable --now firewalld setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永久禁用 ``` 2. **安装 DockerDocker Compose** ```bash yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io systemctl enable --now docker curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose ``` --- #### 二、项目结构规划 ```bash /opt/lnmp-docker/ ├── docker-compose.yml ├── .env # 环境变量文件 ├── nginx/ │ ├── Dockerfile # 可选自定义镜像 │ ├── conf.d/ │ └── html/ ├── mysql/ │ ├── Dockerfile # 可选自定义镜像 │ └── my.cnf # MySQL 配置文件 └── php/ └── Dockerfile # 可选自定义镜像 ``` --- #### 三、关键配置文件 1. **`.env` 文件**(项目根目录) ```env # MySQL 配置 MYSQL_ROOT_PASSWORD=your_secure_password MYSQL_DATABASE=wordpress TZ=Asia/Shanghai # 网络配置 SUBNET=172.20.0.0/16 ``` 2. **`docker-compose.yml` 核心配置** ```yaml version: '3.8' services: nginx: image: nginx:alpine container_name: nginx ports: - "80:80" - "443:443" volumes: - ./nginx/html:/usr/share/nginx/html - ./nginx/conf.d:/etc/nginx/conf.d networks: lnmp: ipv4_address: 172.20.0.10 mysql: image: mysql:5.7 container_name: mysql environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # 从 .env 注入 MYSQL_DATABASE: ${MYSQL_DATABASE} TZ: ${TZ} volumes: - mysql-data:/var/lib/mysql - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf # 挂载自定义配置 networks: lnmp: ipv4_address: 172.20.0.20 php: image: php:7.4-fpm container_name: php volumes: - ./nginx/html:/var/www/html # 与 Nginx 共享代码目录 networks: lnmp: ipv4_address: 172.20.0.30 depends_on: - mysql networks: lnmp: driver: bridge ipam: config: - subnet: ${SUBNET} volumes: mysql-data: ``` --- #### 四、操作步骤 1. **启动服务** ```bash cd /opt/lnmp-docker docker-compose up -d # 自动加载 .env 文件 ``` 2. **验证环境变量注入** ```bash docker-compose config # 查看解析后的完整配置 docker exec mysql env | grep MYSQL_ROOT_PASSWORD ``` 3. **测试 PHP 连接 MySQL** 在 `nginx/html` 目录创建 `test.php`: ```php <?php $link = mysqli_connect("mysql", "root", $_ENV['MYSQL_ROOT_PASSWORD']); if (!$link) { die("Connection failed: " . mysqli_connect_error()); } echo "Connected to MySQL successfully"; ?> ``` 访问 `http://服务器IP/test.php` 验证结果。 --- #### 五、安全增强 1. **保护敏感数据** - 将 `.env` 加入 `.gitignore` - 使用 `docker secret` 或 HashiCorp Vault 管理密码(生产环境推荐) 2. **MySQL 配置文件优化**(参考引用[3]) ```bash vim mysql/my.cnf ``` ```ini [mysqld] character-set-server=utf8mb4 default-authentication-plugin=mysql_native_password # 兼容旧客户端 ``` --- #### 六、常见问题排查 1. **容器 IP 冲突** 修改 `.env` 中的 `SUBNET` 字段,例如 `172.21.0.0/16`[^1] 2. **权限问题** 为数据卷添加读写权限: ```yaml volumes: - ./nginx/html:/var/www/html:rw ``` 3. **环境变量未生效** 检查 `.env` 文件格式(**无空格**,每行 `KEY=VALUE`) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值