我不生产代码
我只是代码的搬运工

docker-compose搭建 Nginx + PHP + MySQL 环境

在使用docker-compose创建nginx,php,mysql三个容器时,虚拟要把容器内的数据挂载到宿主机,以便于持久化保存,首先创建目录结果如下:

docker-lnmp
├── docker-compose.yml
├── nginx
│  ├── conf # nginx相关配置
│  ├── log  # nginx日志,访问日志、错误日志
│  └── ssl  # ssl证书
├── html # web文件目录
├── mysql
│  ├── conf # mysql相关配置
│  ├── log  # mysql日志
│  ├── init # 初始文件
│  └── data # mysql数据
├── php
│  ├── conf  # php相关配置
│  └── Dockerfile  # php镜像文件

  1. 目录 nginx/conf 下的文件为从 nginx容器中复制出来的配置文件;

  2. 目录 php/conf 下的文件为从 php 容器中复制出来的配置文件;

  3. 目录 mysql/conf 下的文件为从 mysql 容器中复制出来的配置文件;

在 php 目录中编写 php 的镜像文件 Dockerfile

FROM php:7.4-fpm
RUN apt-get update && apt-get install -y \
       zlib1g-dev libzip-dev \
       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) \
       gettext mysqli pdo_mysql zip \
       bcmath opcache sockets soap \
   && docker-php-ext-configure gd  --with-freetype --with-jpeg \
   && docker-php-ext-install -j$(nproc) gd

CMD ["php-fpm", "-F"]


编写 docker-compose.yml文件如下:

version: "3"

services:
 mysql:
   hostname: mysql
   restart: always
   image: mysql:5.7
   ports:
     - "3306:3306"
   volumes:
     - ${PWD}/mysql/conf:/etc/mysql
     - ${PWD}/mysql/log:/var/log/mysql
     - ${PWD}/mysql/data:/var/lib/mysql
     - ${PWD}/mysql/init:/var/lib//docker-entrypoint-initdb.d/ #初始化文件
   environment:
     MYSQL_ROOT_PASSWORD: root # roor用户名密码
     MYSQL_USER: user
     MYSQL_PASSWORD: user123456
   command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci  
 php:
   hostname: php
   restart: always
   build:
     context: ${PWD}/php
     dockerfile: Dockerfile
   ports:
     - "9000:9000"
   volumes:
     - ${PWD}/html:/var/www/html
     - ${PWD}/php/conf:/usr/local/etc
 nginx:
   hostname: nginx
   restart: always
   image: nginx:1.19.2-alpine
   depends_on:     #依赖关系,需要先运行php
     - "php"
   ports:
     - "80:80"
     - "443:443"
   volumes:
     - ${PWD}/nginx/conf:/etc/nginx/conf.d
     - ${PWD}/nginx/ssl:/etc/nginx/ssl
     - ${PWD}/nginx/log:/var/log/nginx
     - ${PWD}/html:/usr/share/nginx/html
 composer:
   image: composer:2.0
   container_name: composer
   restart: "no"
   volumes:

然后执行如下命令启动容器:

$ docker-compose up -d
Creating docker-lnmp_mysql_1 ... done
Creating docker-lnmp_php_1   ... done
Creating composer             ... done
Creating docker-lnmp_nginx_1 ... done

然后测试是否容器启动成功:

$ docker ps
a7c797cb350d        nginx:1.9.1        "/docker-entrypoint.…"   40 seconds ago      Up 38 seconds       0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   docker-lnmp_nginx_1
fcabcbdd2fbd        php:7.4-fpm    "docker-php-entrypoi…"   42 seconds ago      Up 40 seconds       0.0.0.0:9000->9000/tcp                     docker-lnmp_php_1
66857b56b61a        mysql:5.7           "docker-entrypoint.s…"   42 seconds ago      Up 40 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp          docker-lnmp_mysql_1

当出现如上内容,表示容器启动成功,可以使用 curl 127.0.0.1 命令测试容器是否可以正常连接。  

html  目录下新建文件 p.php 内容如下:

<?php
   phpinfo();

然后在浏览器输入 ip/p.php 查看php是否可正常加载。

上述过程完成以后,将会安装好 php7.4nginx1.9.1mysql 5.7composer 2.0


以安装 Laravel 为例说明 composer 使用方法:

$ cd html #首先进入 html 目录
$ # -it 以交互方式执行
$ # -v 将当前目录挂载到 composer 容器中
$ docker run -it -v $PWD:/app composer:2.0 composer create-project --prefer-dist laravel/laravel:~6 blog -vvv

上面命令执行完以后,会在目录 $PWD/blog 创建 Laravel  项目,可以通过 ip/blog/public 在浏览器中正常访问。也可以修改 $PWD/nginx/conf/default.conf 配置文件或在 $PWD/nginx/conf 目录中添加 nginx 配置文件,让域名指向 laravel 根目录,以便可以直接通过域名访问 laravel 项目。


注:在上述安装过程中,开始使用的是虚拟机,改成国内镜像中还是特别慢,一直安装失败。当换成阿里云服务器后,很快就可以安装完成,所以如果有遇到安装失败的情况,可以换成云服务器试试。


详见 Github


参考资料:

  1. 从入门到实践

  2. LNMP Docker

  3. PHP Docker Official Images

本文章为本站原创,如转载请注明文章出处:https://www.sviping.com/archives/43

分享到:
上一篇: Docker容器,部署Nginx+PHP环境,php文件不执行返回404 Not Found 下一篇: CentOS 7.8 源码编译安装 PHP8
12