在本教程中,我们将配置一个nginx容器来服务静态内容,以及一个php容器来服务php文件。 客户端: 20.10.12 服务器。20.10.12必须安装Docker并运行docker守护进程。运行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 lsMy 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 = 将一个容器连接到一个网络,这使得容器之间可以进行基于名称的通信。我们创建一个名为 "nginx "的容器。我们创建一个名为 "nginx "的容器。本地创建的index.php文件被挂载到/usr/share/nginx/html目录,这是Nginx容器的文件根。容器将被连接到我们之前创建的桥接网络。基于名字的通信只有在自定义桥接网络中才能实现。容器是使用我们从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 选项和以前一样。在这里,我们创建一个名为 "php "的容器。PHP-fpm 的默认端口是 "9000"。所以同样的端口被映射到本地系统。当主机系统的9000端口上有请求时,它将被重定向到php容器上。同样在本地创建的index.php文件也必须被挂载到PHP容器中。因此,它被挂载到/var/www/html目录下,这是PHP容器的文档根目录。PHP容器必须连接到同一个桥接网络。容器的图像是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; } } 服务器块用于定义特定域或主机名的设置。"listen "指令告诉Nginx在80端口监听IPv4和IPv6地址的传入请求。server_name "指令指定该服务器块应处理 "localhost "域名的请求。带有"/"的位置块用于定义服务器的根目录,即"/usr/share/nginx/html",以及当客户端请求网站根目录时应该提供的索引文件。error_page "指令用于指定一个自定义的错误页面,当客户端收到一个服务器错误(如500、502、503、504)时,应该显示该页面。带有"= /50x.html"的位置块指定了错误页面的根目录,即"/var/www/html"。带有"~ .php#34;的位置块被用来处理 PHP 文件。这个区块指定 PHP 文件的根目录为"/var/www/html"。fastcgi_pass "指令告诉Nginx将PHP请求传递给运行在主机 "php "上、监听端口为9000的FastCGI服务器。fastcgi_index "指令指定了当客户端请求一个目录时要提供的默认PHP文件。"set "指令用于设置一个变量,该变量在以后用于向 PHP 解释器指定脚本名称。fastcgi_param "指令用于向 PHP 解释器指定脚本名称。最后,"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,并允许它们进行通信,以便它们能够处理请求。