Docker搭建PHP运行环境

本文详细介绍了如何使用Docker安装PHP和Nginx,以及如何配置和运行nginx容器。通过端口映射和挂载目录,实现了Nginx与PHP的结合,用于部署PHP项目。同时,文章提供了启动和检查容器的Docker命令,帮助读者理解Docker容器的管理和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Docker 安装 PHP

Docker 安装 Nginx 

​编辑运行nginx容器

nginx安装成功

Nginx + PHP 部署PHP项目

启动 PHP: 

启动 nginx:

查看正在运行的容器: 

访问域名测试搭建结果

Docker相关命令描述


Docker 安装 PHP

  • 这里我们拉取官方的镜像,标签为7.1-fpm 
docker pull php:7.1-fpm

 等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为php,标签为7.1-fpm的镜像。

Docker 安装 Nginx 

 访问 Nginx 镜像库地址: Docker

可以通过 Sort by 查看其他版本的 Nginx,默认是最新版本 nginx:latest。 

  • 这里我们拉取官方的最新版本的镜像: 
docker pull nginx:latest
  •  使用以下命令来查看是否已安装了 nginx:

运行nginx容器

  • 安装完成后,我们可以使用以下命令来运行 nginx 容器:
docker run --name nginx-test -p 8080:80 -d nginx

参数说明:

  • --name nginx-test:容器名称。
  • -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
  • -d nginx: 设置容器在在后台一直运行

 

nginx安装成功

  • 最后我们可以通过浏览器可以直接访问 8080 端口的 nginx 服务: 

Nginx + PHP 部署PHP项目

启动 PHP: 

docker run --name  myphp-fpm -p 9000:9000 -v /var/www/blog:/www  -d php:7.1-fpm

命令说明:

  • --name myphp-fpm : 将容器命名为 myphp-fpm。

  • -v /var/www/blog:/www : 将主机中PHP项目目录挂载到容器的 /www目录,在容器内访问 /www 就相当于访问宿主机的 /var/www/blog

  • php:7.1-fpm 镜像名

  • 创建一个存放nginx配置文件的目录。这个目录等下要挂载到容器里。
mkdir -p /opt/docker/nginx/conf.d

 

  • 创建一个空配置文件
vim testdocker.conf
  •  在该目录下添加 /opt/docker/nginx/conf.d/testdocker.conf 文件,内容如下:
server {
    # 监听端口。此端口不能被占用了
    listen       80;
    # 此站点的域名。直接在宿主机配置一个host域名,或者在阿里云等云服务商那里解析过来。
    server_name  www.testdocker.com;
    # 此站点的入口目录。这里要注意,/www/public/ 路径是容器内的路径。因为等下会把宿主机的项目路径挂载到容器内的 /www 目录。所以这里访问 /www就相当于访问宿主机的项目路径。
    root  /www/public/;

    #配置url的伪静态设置
    location / {
       autoindex off;
       if (!-e $request_filename){
          rewrite ^/(.*)$ /index.php?/$1 last;        break;
       }
       #伪静态设置
       try_files $uri $uri/ /index.php$is_args$query_string;
       index index.php index.html index.htm;
    }

    #配置url处理及转发PHP请求
    location ~ \.php(/|$) {
        # 入口文件
        fastcgi_index index.php;
        # PHP项目的IP和端口。这是php-fpm的地址。由于nginx处理不了PHP代码,所以需要把请求转发给php-fpm进行处理。
        fastcgi_pass  10.10.10.68:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
    # 用户的访问日志。注意,这目录必须存在,否则nginx将启动不了。由于我把宿主机的项目路径www挂载到了容器内的/www目录,所以宿主机的项目路径www里需要有wwwlogs目录。
    access_log  /var/log/nginx/docker_nginx_access.log;
    # 错误日志
    error_log  /var/log/nginx/docker_nginx_error.log;
}

配置文件说明:

  • 10.10.10.68:9000:表示 php-fpm 服务的 URL,下面我们会具体说明。
  • root  /www/public/:项目的根目录,这里之所以写成( /www/public),是因为在启动PHP时,已经将项目的根目录(/var/www/blog)挂载到容器内的/www目录了

启动 nginx:

docker run --name my-nginx -p 80:80 -d -v /var/www/blog:/www -v /opt/docker/nginx/conf.d:/etc/nginx/conf.d nginx
  • -v /var/www/blog:/www 把宿主机的项目目录 /var/www/blog 挂载到容器内的 /www 目录。容器内访问 /www 就相当于访问 /var/www/blog
  • -v /opt/docker/nginx/conf.d:/etc/nginx/conf.d 把宿主机的配置目录,挂载到容器内nginx的配置目录。nginx 会自动去加载这目录内所有的配置文件。/opt/docker/nginx/conf.d 里建议每个站点对应一个配置文件。
  • -d 后台静默运行

查看正在运行的容器: 

  • 真确的结果如下图(图一):

  • 错误的结果如下图(图二):

  • 图一和图二的区别:

图一端口(9000)生效,图二端口(9000)没生效,如果php-fpm没有端口,最后导致的结果就是,客户端通过域名访问项目,在通过nginx请求php-fpm时会提示:502
nginx错误提示是:connect() failed (111: Connection refused) while connecting to upstream

访问域名测试搭建结果

Docker相关命令描述

docker container attach     附加到正在运行的容器
docker container commit     从容器的更改创建一个新的映像
docker container cp         在容器和本地文件系统之间复制文件/文件夹
docker container create     创建一个新的容器
docker container diff       检查容器文件系统上文件或目录的更改
docker container exec       在运行容器中运行命令
docker container export     将容器的文件系统导出为tar存档
docker container inspect    显示一个或多个容器的详细信息
docker container kill       杀死一个或多个运行容器
docker container logs       获取容器的日志
docker container ls         列出容器
docker container pause      暂停一个或多个容器内的所有进程
docker container port       列出端口映射或容器的特定映射
docker container prune      取出所有停止的容器
docker container rename     重命名容器
docker container restart    重新启动一个或多个容器
docker container rm         删除(移除)一个或多个容器
docker container run        在新容器中运行命令
docker container start      启动一个或多个停止的容器
docker container stats      显示容器的实时流资源使用统计信息
docker container stop       停止一个或多个运行容器
docker container top        显示容器的正在运行的进程
docker container unpause    取消暂停一个或多个容器内的所有流程
docker container update     更新一个或多个容器的配置
docker container wait       阻止一个或多个容器停止,然后打印退出代码

以上命令中的 container 可以省略不写,
例如命令:docker container stop 容器ID/容器名称 等同 docker stop 容器ID/容器名称

<think>嗯,用户想了解C#中SerialPortHelper类的使用方法、示例和文档。首先,我需要确认SerialPortHelper是否是.NET Framework内置的类。根据我的知识,.NET中的串口通信主要依赖于System.IO.Ports命名空间下的SerialPort类,而SerialPortHelper可能是一个自定义的辅助类,用于简化串口操作。用户提到的ReceiveDataEventArg类看起来像是自定义的事件参数,用于传递接收到的数据。 接下来,我需要考虑用户可能需要哪些信息。通常,使用串口通信的步骤包括初始化串口参数(如波特率、数据位、停止位等)、打开端口、发送和接收数据、处理事件以及关闭端口。由于用户提到了ReceiveDataEventArg,可能这个辅助类封装了数据接收的事件处理,比如在数据到达时触发事件并传递字节数组。 我应该提供一个基本的示例,展示如何创建SerialPortHelper实例,配置参数,订阅数据接收事件,并实现发送和接收数据的方法。同时需要指出,由于这个类可能是第三方或自定义的,用户需要参考具体的文档或源代码。此外,用户可能遇到异常处理或跨线程访问的问题,需要提醒他们注意这些方面,并建议查阅微软官方文档作为补充。 另外,用户提供的引用[1]中的ReceiveDataEventArg类包含一个byte数组属性Data,这说明在接收数据时,该类用于封装接收到的字节数据。因此,在示例中处理接收事件时,应该展示如何访问这个Data属性,并将其转换为字符串或其他格式。 最后,生成相关问题时要围绕SerialPortHelper的常见使用场景、异常处理、数据解析、多线程问题以及与其他串口类的比较,帮助用户进一步深入学习和解决问题。</think>### C# SerialPortHelper类使用方法说明 在C#中,`SerialPortHelper`通常为第三方库或开发者自定义的串口通信辅助类,用于简化`System.IO.Ports.SerialPort`的操作[^1]。以下是典型用法示例: #### 1. 初始化配置 ```csharp // 创建SerialPortHelper实例 SerialPortHelper serialHelper = new SerialPortHelper(); // 配置串口参数 serialHelper.PortName = "COM3"; serialHelper.BaudRate = 9600; serialHelper.DataBits = 8; serialHelper.Parity = Parity.None; serialHelper.StopBits = StopBits.One; // 订阅数据接收事件 serialHelper.DataReceived += OnDataReceived; ``` #### 2. 数据接收事件处理 ```csharp private void OnDataReceived(object sender, ReceiveDataEventArg e) { // 将字节数组转为字符串 string receivedData = Encoding.ASCII.GetString(e.Data); Console.WriteLine($"接收数据: {receivedData}"); } ``` #### 3. 发送数据示例 ```csharp // 发送字节数组 byte[] sendBytes = Encoding.ASCII.GetBytes("AT指令"); serialHelper.Write(sendBytes, 0, sendBytes.Length); // 发送字符串 serialHelper.WriteLine("Hello, SerialPort!"); ``` #### 4. 开关端口控制 ```csharp // 打开串口 if (!serialHelper.IsOpen) { serialHelper.Open(); } // 关闭串口 serialHelper.Close(); ``` #### 关键注意点: 1. **参数验证**:需确保波特率、数据位等参数与设备匹配 2. **线程安全**:接收事件在非UI线程触发,需使用`Invoke`更新界面 3. **异常处理**:建议包裹`try-catch`块处理`InvalidOperationException`等异常
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值