广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >Docker-dnmp环境搭建
  • 170
分享到

Docker-dnmp环境搭建

dockerphp容器 2023-09-01 21:09:07 170人浏览 八月长安
摘要

目录 dnmp环境搭建1、dnmp目录结构2、.env 配置文件3、docker-compose.yml4、dockerfile5、启动6、测试 遇到的问题1、PHP8 打不开2、MySQ

目录

dnmp环境搭建

本片文章搭建的环境是 Nginx1.19 + PHP7.4 + php8.2 + Mysql5.7 + mysql8.0 + Redis,多版本 php 和多版本 mysql
这里就直接使用 Docker-compose 搭建环境,也可以找到镜像创建容器再关联映射端口部署。

资源包下载地址
参考文章:docker-compose使用nginx+php+mysql+redis部署fastadmin

1、dnmp目录结构

..env# 配置参数├── docker-compose.yml# docker-compose文件├── mysql57│   ├── conf│   │   └── my.cnf│   └── log│       ├── mysqld.log│       ├── tallylog│       └── yum.log├── mysql80│   ├── conf│   │   └── my.cnf│   ├── data# mysql8.0数据目录(我这里没有挂载)│   └── log├── nginx│   ├── conf│   │   ├── default.conf│   │   ├── php.conf│   └── logs│       ├── access.log│       └── error.log├── php74│   ├── Dockerfile# php7.4 Dockerfile文件│   └── conf│       ├── ini│       │   ├── conf.d│       │   │   ├── docker-php-ext-mysqli.ini│       │   │   ├── docker-php-ext-pdo_mysql.ini│       │   │   └── docker-php-ext-sodium.ini│       │   ├── php.ini-development│       │   └── php.ini-production│       └── php-fpm.d│           ├── docker.conf│           ├── www.conf│           ├── www.conf.default│           └── zz-docker.conf├── php824│   ├── Dockerfile# php8.2.4 Dockerfile文件│   ├── conf│   │   ├── php-fpm.conf│   │   └── php.ini│   ├── data│   │   └── composer│   └── logs│       ├── fpm.slow.log│       └── php.error.log└── redis    ├── redis.cnf    └── redis.conf

2、.env 配置文件

我只简单配置了 工作目录docker环境目录,可以根据需要把 docker-compose.yml 中容器参数放到这边。

## 项目目录/工作目录#PROJECT_DIR=/Users/yunsanmu/work/project## 当前docker开发环境目录#DEV_ENV_DIR=/Users/yunsanmu/dev-env

3、docker-compose.yml

为了方便操作,一般都会把容器的配置文件、日志文件等挂载映射。端口映射根据自己需要

version: "2.1"services:    nginx:        image: nginx:1.19.1-alpine        container_name: nginx        ports:            - "80:80"        volumes:            - ${PROJECT_DIR}:/usr/share/nginx/html            - ${DEV_ENV_DIR}/nginx/conf:/etc/nginx/conf.d            - ${DEV_ENV_DIR}/nginx/logs:/var/log/nginx        networks:            - lnmp-network    php74:        container_name: php74        build: ./php74 # 这个目录放上我们刚才做好的定制化php的Dockerfile        ports:            - "9001:9000"        volumes:            - ${PROJECT_DIR}:/www:rw            - ${DEV_ENV_DIR}/php74/conf/ini:/usr/local/etc/php            - ${DEV_ENV_DIR}/php74/conf/php-fpm.d:/usr/local/etc/php-fpm.d        restart: always        links:            - mysql57        networks:            - lnmp-network    php824:        container_name: php824        build: ./php824        ports:            - "9002:9000"        volumes:            - ${PROJECT_DIR}:/www/:rw            - ${DEV_ENV_DIR}/php824/conf/php.ini:/usr/local/etc/php/php.ini:ro            - ${DEV_ENV_DIR}/php824/conf/php-fpm.conf:/usr/local/etc/php-fpm.d/www.conf:rw            - ${DEV_ENV_DIR}/php824/logs:/var/log/php            - ${DEV_ENV_DIR}/php824/data/composer:/tmp/composer        restart: always        networks:            - lnmp-network    mysql57:        image: mysql/mysql-server:5.7.28        container_name: mysql57        ports:            - "3307:3306"        volumes:            - ${DEV_ENV_DIR}/mysql57/conf/my.cnf:/etc/my.cnf:ro            # - ${DEV_ENV_DIR}/mysql57/data:/var/lib/mysql/:rw # 这里我就不挂载了,有需要到容器里看            - ${DEV_ENV_DIR}/mysql57/log:/var/log/:rw        environment:            - MYSQL_ROOT_PASSWord=root        restart: always        networks:            - lnmp-network    mysql80:        image: mysql:8.0        container_name: mysql80        ports:            - "3308:3306"        volumes:            - ${DEV_ENV_DIR}/mysql80/conf/my.cnf:/etc/my.cnf:ro            # - ${DEV_ENV_DIR}/mysql80/data:/var/lib/mysql/:rw            - ${DEV_ENV_DIR}/mysql80/log:/var/log/:rw        environment:            - MYSQL_ROOT_PASSWORD=root        networks:            - lnmp-network    redis:        image: redis:5.0.3-alpine        container_name: redis        ports:            - "6379:6379"        volumes:            - ${DEV_ENV_DIR}/redis/redis.cnf:/etc/redis.conf:ro        restart: always        entrypoint: [ "redis-server", "/etc/redis.conf" ]        networks:            - lnmp-networknetworks:    lnmp-network:        driver: bridge        ipam:            driver: default

由于我的电脑是 Mac 的 m1 芯片 所以我这里使用的都是支持linux/arm64/v8 的镜像。
请添加图片描述

MySQL5.7的最新镜像就是不支持 linux/arm64/v8 平台,创建容器会报如下警告:

WARNING: The requested image's platfORM (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

我这里使用 mysql/mysql-server:5.7.28 替代。

4、dockerfile

dockerfile 是自定义镜像的一套规则,由多条指令构成,在docker-compose.yml 中通过 build 参数引入。 上面的 docker-compose.yml 比较简单,我只对两个版本的PHP写了 dockerfile,其他的都只在 compose 中使用image,没有过多配置。

php7.4 的 dockerfile:

# 该装的都装上 # 版本7.4FROM php:7.4-fpm # composerRUN curl -sS https://getcomposer.org/installer | php \    && mv composer.phar /usr/bin/composer && chmod +x /usr/bin/composer # 各种依赖库和扩展RUN apt-get update \    && apt-get install -y \    vim \    git \    wget \    build-essential \    libmagickcore-dev \    libmagickwand-dev \    imagemagick \    libfreetype6-dev \    libmcrypt-dev \    libpng-dev \    libzip-dev \    libWEBp-dev \    autoconf \    pkg-config \    GCc \    make \    zlib1g \    zlib1g-dev \    && docker-php-ext-configure gd  --with-webp=/usr/include/webp --with-jpeg=/usr/include --with-freetype=/usr/include/freetype2/ \    && docker-php-ext-install -j$(nproc) gd iconv pdo pdo_mysql pdo_odbc mysqli bcmath calendar exif gettext Sockets dba  pcntl  shmop sysvmsg sysvsem sysvshm zip \    && pecl install redis-5.3.7 \    && pecl install imagick \    && pecl install mcrypt \    && docker-php-ext-enable redis imagick mcrypt \# 这句很重要,如果和你的nginx用户不同会导致你的服务起不来RUN groupadd www && useradd -g www www # 如果你需要别的扩展,还可以再加

php8.2.4 的 dockerfile:

# 该装的都装上# 版本8.2.4FROM php:8.2.4-fpm# composerRUN curl -sS Https://getcomposer.org/installer | php \    && mv composer.phar /usr/bin/composer && chmod +x /usr/bin/composer# 各种依赖库和扩展RUN apt-get update \    && apt-get install -y \    vim \    git \    wget \    build-essential \    libmagickcore-dev \    libmagickwand-dev \    imagemagick \    libfreetype6-dev \    libmcrypt-dev \    libpng-dev \    libzip-dev \    libwebp-dev \    autoconf \    pkg-config \    gcc \    make \    zlib1g \    zlib1g-dev \    && docker-php-ext-configure gd  --with-webp=/usr/include/webp --with-jpeg=/usr/include --with-freetype=/usr/include/freetype2/ \    && docker-php-ext-install -j$(nproc) gd iconv pdo pdo_mysql mysqli bcmath calendar exif gettext sockets dba  pcntl  shmop sysvmsg sysvsem sysvshm zip \    && pecl install redis-5.3.7 \    && pecl install imagick \    && pecl install mcrypt \    && docker-php-ext-enable redis \    && docker-php-ext-enable imagick \    && docker-php-ext-enable mcrypt# 这句很重要,如果和你的nginx用户不同会导致你的服务起不来RUN groupadd www && useradd -g www www# 如果你需要别的扩展,还可以再加

5、启动

进入 docker-compose.yml 所在的目录,创建镜像那一步就直接跳过了,执行 docker-compose up -d 启动如下:

yunsanmu@yunsanmudeMacBook-Pro ~ % cd dev-env yunsanmu@yunsanmudeMacBook-Pro dev-env % docker-compose up -dStarting nginx   ... doneStarting redis   ... doneStarting php824  ... doneStarting mysql80 ... doneStarting mysql57 ... doneStarting php74   ... doneyunsanmu@yunsanmudeMacBook-Pro dev-env % 

打开docker 客户端如下图:
启动相关命令:

docker-compose up -d               # 创建并启动某个容器docker-compose down                # 停止并删除所有容器、网络、镜像等docker-compose stop   # 停止所有容器docker-compose start               # 启动所有容器docker-compose restart# 重启所有容器docker-compose rm# 删除容器(删除前必须关闭容器,执行stop)

启动完成后需要做一些操作,mysql默认root账号是没有远程连接权限,先通过命令行在mysql5.7和mysql8.0赋予root用户远程权限,生产环境添加专门的远程账号。

通过docker 客户端进入mysql57和mysql80容器内,都执行一遍下面的命令:

sh-4.2# mysql -uroot -pEnter password: mysql> use mysql;Database changedmysql> update user set host = '%' where user = 'root';Query OK, 1 row affected (0.03 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql> flush privileges;Query OK, 0 rows affected (0.01 sec)mysql> exit

6、测试

下面的测试显示的都是成功的流程,如果遇到相同问题参考下面的解决方法,其他问题自行百度。

进入nginx配置文件目录添加两个配置文件:php74.confphp82.conf,并且在项目目录下创建两个文件夹:php74php82,分别测试不同版本PHP。

├── nginx│   ├── conf│   │   ├── default.conf│   │   ├── php74.conf│   │   ├── php82.conf
├── project│   ├── php74│   │   ├── index.php│   ├── php82│   │   ├── index.php

php74.conf :

server {    listen  80;    server_name www.php74.com;    location / {        root    /usr/share/nginx/html/php74;        index   index.html index.htm index.php;        if (!-e $request_filename) {            # rewrite ^.*$ /index.php last;            rewrite ^/(.*)$ /index.php/$1 last;        }    }    location ~ \.php$ {        fastcgi_pass    php74:9000;        fastcgi_index   index.php;        fastcgi_param   SCRIPT_FILENAME /www/php74/$fastcgi_script_name;        include         fastcgi_params;    }}

php82.conf :

server {    listen  80;    server_name www.php82.com;    location / {        root    /usr/share/nginx/html/php82;        index   index.html index.htm index.php;        if (!-e $request_filename) {            rewrite ^/(.*)$ /index.php/$1 break;            # rewrite . /index.php last;        }    }    location ~ \.php$ {        fastcgi_pass    php824:9000;        fastcgi_index   index.php;        fastcgi_param   SCRIPT_FILENAME /www/php82/$fastcgi_script_name;        include         fastcgi_params;    }}

修改 hosts,添加以下内容:

127.0.0.1       www.php74.com127.0.0.1       www.php82.com

虚拟域名访问:

mysql5.7、mysql8.0和redis连接测试,编辑两个域名下的index.php文件,添加相同测试代码,测试连接:
php74/index.php:

// redis 测试$redis = new \Redis();$redis->connect('redis',6379);echo "redis is running: ".$redis->ping();echo '
'
;// mysql5.7 测试try { # 连接的host要注意,与./nginx/default.conf中的php连接一样,不是ip,是docker-compose中配置的容器名,container_name $dsn = "mysql:host=mysql57;dbname=mysql;"; $username = "root"; $password = "root"; $db = new PDO($dsn, $username, $password); $sql = "SELECT * FROM user"; $stmt = $db->prepare($sql); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); var_dump($result);} catch (PDOException $e) { echo $e->getMessage() . "
"
; exit;}echo '
'
;// mysql8.0 测试try { # 连接的host要注意,与./nginx/default.conf中的php连接一样,不是ip,是docker-compose中配置的容器名,container_name $dsn = "mysql:host=mysql80;dbname=mysql;"; $username = "root"; $password = "root"; $db = new PDO($dsn, $username, $password); $sql = "SELECT * FROM user"; $stmt = $db->prepare($sql); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); var_dump($result);} catch (PDOException $e) { echo $e->getMessage() . "
"
; exit;}

再次访问虚拟域名:

遇到的问题

1、PHP8 打不开

报错:

[error] 26#26: *1 rewrite or internal redirection cycle while processing "/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/index.php/", client: 172.28.0.1, server: www.php82.com, request: "GET / HTTP/1.1", host: "www.php82.com"2

修改nginx配置文件的反向代理:

错误配置if (!-e $request_filename) {    rewrite ^/(.*)$ /index.php/$1 last;}正确配置,替换{}内容:rewrite ^/(.*)$ /index.php/$1 break;或rewrite . /index.php last;

2、MySQL 不允许主机连接到此MySQL服务器

报错:

Host '172.28.0.6' is not allowed to connect to this MySQL Server

解决方法: 进入容器执行以下命令。

mysql> use mysql;mysql> update user set host = '%' where user = 'root';mysql> flush privileges;mysql> exit

执行第二个命令时可能会出现 Duplicate entry ‘%-root‘ for key ‘PRIMARY‘ 错误,参考:MySql出现ERROR 1062 (23000): Duplicate entry ‘%-root‘ for key ‘PRIMARY‘

3、Mysql 无法连接

错误:

Error!: could not find driver

原因:
当我们使用 navicat 连接 mysql 时是在容器外进行操作,是用 ip+映射端口 连接;当在 php 代码中使用 pdo 连接 mysql 是在 php 容器内部连接mysql 容器,所以是 容器名+3306端口 连接。

解决办法:

$conn = new PDO('mysql:host=容器名;dbname=数据库;port=端口','用户','密码');

来源地址:https://blog.csdn.net/weixin_43844718/article/details/129883644

--结束END--

本文标题: Docker-dnmp环境搭建

本文链接: https://www.lsjlt.com/news/389683.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Docker-dnmp环境搭建
    目录 dnmp环境搭建1、dnmp目录结构2、.env 配置文件3、docker-compose.yml4、dockerfile5、启动6、测试 遇到的问题1、PHP8 打不开2、MySQ...
    99+
    2023-09-01
    docker php 容器
  • docker搭建php环境
    PHP(PHP: Hypertext Preprocessor)即“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言,吸纳Java和Perl多个语言的特色发展出自己的特色语法,并根...
    99+
    2023-08-31
    php 开发语言 服务器
  • docker搭建nginx+php环境
    一、docker拉取nginx和php镜像 命令如下: docker pull nginx:latestdocker pull php:7.4-fpm 创建本地挂载路径: mkdir -p /dock...
    99+
    2023-09-02
    nginx php docker
  • docker怎么搭建lnmp环境
    要搭建一个LNMP环境(即 Linux + Nginx + MySQL + PHP),可以使用Docker来实现。 以下是基本的步骤...
    99+
    2023-10-23
    docker lnmp
  • 使用docker搭建tomcat环境
    创建目录[root@ticent docker]#mkdir /home/docker2.下载tomcat[root@ticent docker]#wget http://mirrors.tuna.tsinghua.ed...
    99+
    2023-06-04
  • docker搭建php环境安装
    目录 一、什么是php?  二、docker拉取nginx和php镜像 三、创建容器   四、 测试 一、什么是php? PHP定义:一种服务器端的HTML脚本/编程语言,是一种简单的、面向对象的、解释型的、健壮的、安全的、性能非常之高...
    99+
    2023-09-22
    php 开发语言 docker
  • Docker搭建PHP运行环境
    目录 Docker 安装 PHP Docker 安装 Nginx  ​编辑运行nginx容器 nginx安装成功 Nginx + PHP 部署PHP项目 启动 PHP:  启动 nginx: 查看正在运行的容器:  访问域名测试搭建结果 D...
    99+
    2023-09-04
    php docker 运维
  • 使用Docker搭建python环境
    文章目录 使用Docker搭建python环境一、实现思路二、环境准备三、实现思路四、搭建python服务1. 使用Dockerfile构建python镜像1.1 拉取python镜像1.2....
    99+
    2023-09-01
    python docker linux
  • docker如何搭建lnmp环境
    要在Docker中搭建LNMP环境(即Linux、Nginx、MySQL和PHP),可以按照以下步骤进行操作:1. 安装Docker...
    99+
    2023-08-23
    docker lnmp
  • Docker怎么搭建Django+Mariadb环境
    这篇文章主要讲解了“Docker怎么搭建Django+Mariadb环境”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Docker怎么搭建Django+Mariadb环境”吧!Docker搭...
    99+
    2023-06-19
  • CentOS7 Nvidia Docker环境如何搭建
    本文小编为大家详细介绍“CentOS7 Nvidia Docker环境如何搭建”,内容详细,步骤清晰,细节处理妥当,希望这篇“CentOS7 Nvidia Docker环境如何搭建”文章能帮助大家解决疑惑,...
    99+
    2022-10-19
  • CentOS7下怎么搭建Docker环境
    这篇文章主要介绍了CentOS7下怎么搭建Docker环境的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇CentOS7下怎么搭建Docker环境文章都会有所收获,下面我们一起来看看吧。Docker 是一个开源的...
    99+
    2023-06-28
  • Docker宿主机环境怎么搭建
    这篇文章主要介绍“Docker宿主机环境怎么搭建”,在日常操作中,相信很多人在Docker宿主机环境怎么搭建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Docker宿主机环境怎么搭建”的疑惑有所帮助!接下来...
    99+
    2023-06-04
  • 怎么使用docker搭建fastdfs环境
    本篇内容主要讲解“怎么使用docker搭建fastdfs环境”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用docker搭建fastdfs环境”吧!docker镜像的选择也挺重要的,我最开...
    99+
    2023-07-02
  • Docker版PHP多版本环境搭建
    目录 1. 前言 2. 目标 3. 实现原理图 4. 环境准备 5. 实战演练 (1)创建挂载目录 (2)默认配置文件 (3)网络配置 (4)启动容器 (4)Nginx配置 (5)重启容器,进行验证即可 6. 扩展相关 (1)修改源 (2)...
    99+
    2023-09-14
    Nginx PHP 容器 docker
  • docker本地PHP开发环境搭建
    一、搭建本地PHP开发环境 概述 本文简单介绍通过启动一个nginx和fpm容器来搭建一个php web运行环境,以文档命令为例,H:/home/code/docker/web 目录下可以放多个子项目,只需针对不同的项目配置不同的nginx...
    99+
    2023-09-02
    php docker nginx linux安装PHP运行环境
  • centos怎么搭建部署docker环境
    这篇文章主要介绍“centos怎么搭建部署docker环境”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“centos怎么搭建部署docker环境”文章能帮助大家解决问题。1、Docker的存在解决的...
    99+
    2023-07-02
  • 基于docker如何搭建caffe环境
    小编给大家分享一下基于docker如何搭建caffe环境,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!需求:构建一个独立的容器,里面安装了caffe 的所有依赖,...
    99+
    2023-06-07
  • 如何使用docker搭建kafka环境
    这篇文章主要介绍“如何使用docker搭建kafka环境”,在日常操作中,相信很多人在如何使用docker搭建kafka环境问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用docker搭建kafka环境...
    99+
    2023-06-19
  • 如何在docker中搭建swoole环境
    本篇内容介绍了“如何在docker中搭建swoole环境”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、搭建swoole环境拉取镜像doc...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作