在不同的容器中Dockerize Nginx和PHP-FPM

在本教程中,我们将配置一个nginx容器来服务静态内容,以及一个php容器来服务php文件。

客户端: 20.10.12 服务器。20.10.12

  1. 必须安装Docker并运行docker守护进程。
  2. 运行docker命令的用户可能被添加到docker组,否则你可能需要sudo权限来运行这些命令。(可选)

作为工作的一部分,你可能已经在同一个容器中配置了Nginx和PHP。但是,最近我们有一个要求,要将Nginx和PHP-fpm配置在不同的容器中。

运行下面的命令来提取图像

docker image pull nginx:latest
docker image pull php:fpm

确认镜像已被正确拉出。

docker image ls

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
php          fpm       6c2e0d7fb356   11 days ago   450MB
nginx        latest    a99a39d070bf   11 days ago   142MB
docker network create  --driver bridge my-net

要列出已创建的桥接网络

docker network ls

  
  
  
  

My first PHP page

<?php echo "Hello World!"; ?>

首先,我们将创建一个nginx容器。

docker container run -d --name nginx -p 8080:80 -v index.php:/usr/share/nginx/html --network my-net nginx:latest

-d = 分离容器的shell会话,并在后台运行该容器

-p = 端口映射,用于将容器的端口映射到主机系统上。这里,容器的8080端口被映射到主机系统的80端口。

-v = 绑定挂载一个卷

- network = 将一个容器连接到一个网络,这使得容器之间可以进行基于名称的通信。

  1. 我们创建一个名为 "nginx "的容器。
  2. 我们创建一个名为 "nginx "的容器。
  3. 本地创建的index.php文件被挂载到/usr/share/nginx/html目录,这是Nginx容器的文件根。
  4. 容器将被连接到我们之前创建的桥接网络。基于名字的通信只有在自定义桥接网络中才能实现。
  5. 容器是使用我们从docker集线器中提取的nginx:fresh镜像构建的。这里,"最新 "是Nginx镜像的一个标签。在docker的情况下,标签起着非常重要的作用。

同样地,让我们创建一个PHP-fpm容器。

docker container run -d --name php -p 9000:9000 -v index.php:/var/www/html --network my-net php:fpm

选项和以前一样。

  1. 在这里,我们创建一个名为 "php "的容器。
  2. PHP-fpm 的默认端口是 "9000"。所以同样的端口被映射到本地系统。当主机系统的9000端口上有请求时,它将被重定向到php容器上。
  3. 同样在本地创建的index.php文件也必须被挂载到PHP容器中。因此,它被挂载到/var/www/html目录下,这是PHP容器的文档根目录。
  4. PHP容器必须连接到同一个桥接网络。
  5. 容器的图像是php:fpm。其中fpm是PHP图像的标签。
docker container ls -a

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS       PORTS                                       NAMES
2193060a2768   php:fpm        "docker-php-entrypoi…"   2 minutes ago   Up 2 minutes   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp   php
288e76fa12a3   nginx:latest   "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp       nginx

运行下面的命令来初始化容器的bash会话。

docker container exec -it nginx bash

一旦这个命令被执行,你将得到一个容器的shell提示。现在我们需要安装一个编辑器(例如:vim、nano)来编辑Nginx的配置文件。

root@288e76fa12a3:/# apt update &> /dev/null ; apt install vim -y &> /dev/null

导航到配置文件并添加以下配置。

cat /etc/nginx/conf.d/default.conf

server {
      listen       80;
      listen  [::]:80;
      server_name  localhost;
   
      location / {
                root   /usr/share/nginx/html;
                index  index.php index.html index.htm;
      }
   
      error_page   500 502 503 504  /50x.html;
      location = /50x.html {
          root   /var/www/html;
}
 
    location ~ .php$ {
              root           /var/www/html;
              fastcgi_pass   php:9000;
              fastcgi_index  index.php;
              set $filename "index.php";
       if ( $fastcgi_script_name ~ "^/+(.*)#34; ) {
             set $filename $1;
       }
       fastcgi_param SCRIPT_FILENAME $filename;
              include        fastcgi_params;
    }
}
  1. 服务器块用于定义特定域或主机名的设置。
  2. "listen "指令告诉Nginx在80端口监听IPv4和IPv6地址的传入请求。
  3. server_name "指令指定该服务器块应处理 "localhost "域名的请求。
  4. 带有"/"的位置块用于定义服务器的根目录,即"/usr/share/nginx/html",以及当客户端请求网站根目录时应该提供的索引文件。
  5. error_page "指令用于指定一个自定义的错误页面,当客户端收到一个服务器错误(如500、502、503、504)时,应该显示该页面。带有'= /50x.html'的位置块指定了错误页面的根目录,即"/var/www/html"。
  6. 带有"~ .php#34;的位置块被用来处理 PHP 文件。这个区块指定 PHP 文件的根目录为"/var/www/html"。
  7. fastcgi_pass "指令告诉Nginx将PHP请求传递给运行在主机 "php "上、监听端口为9000的FastCGI服务器。
  8. fastcgi_index "指令指定了当客户端请求一个目录时要提供的默认PHP文件。
  9. "set "指令用于设置一个变量,该变量在以后用于向 PHP 解释器指定脚本名称。
  10. fastcgi_param "指令用于向 PHP 解释器指定脚本名称。
  11. 最后,"include "指令用于包括一个带有FastCGI参数的单独文件。
root@288e76fa12a3:/# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

由于配置中没有错误,我们可以进一步进行。在对配置文件进行任何修改后,一定要检查是否有语法错误。

由于我们对配置进行了修改,nginx服务必须被重新启动。一个简单的方法是退出容器,重新启动容器。

root@288e76fa12a3:/# exit

这个命令将从容器中退出会话并在我们的本地syscal系统中建立一个shell会话。现在,重新启动容器。

sreehari@sh:~$ docker container restart nginx

检查容器是否已经重新启动,没有任何错误。

docker container ls -a

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                       NAMES
2193060a2768   php:fpm        "docker-php-entrypoi…"   40 minutes ago   Up 40 minutes   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp   php
288e76fa12a3   nginx:latest   "/docker-entrypoint.…"   40 minutes ago   Up 10 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp       nginx

http://localhost:8080

在这篇文章中,我们学习了如何在不同的容器上设置Nginx和PHP,并允许它们进行通信,以便它们能够处理请求。

展开阅读全文

页面更新:2024-04-15

标签:容器   根目录   端口   指令   客户端   命令   错误   服务器   文件   系统

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top