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

在本教程中,我们将配置一个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 ls
<!DOCTYPE html>
<html>
<body>
<h1>My first PHP page</h1>
<?php
echo "Hello World!";
?>
</body>
</html>
首先,我们将创建一个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 ~ "^/+(.*)$" ) {
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$"的位置块被用来处理 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
