介绍
Nginx 是一个开源 Web 服务器,用于服务静态或动态网站,反向代理,负载平衡和其他 HTTP 和代理服务器功能。
Docker是一个流行的开源容器化工具,用于为软件应用程序提供便携式和一致的运行时间环境,同时消耗的资源比传统的服务器或虚拟机少。
通过容器化 Nginx,你可以降低一些系统管理负担,例如,你不必通过包管理器来管理 Nginx 或从源头构建它。Docker 容器允许你在发布新的 Nginx 版本时更换整个容器。
在本教程中,您将学习如何通过配置 Nginx 与 Docker 容器来服务一个小小的网页。
前提条件
要遵循本教程,您将需要以下内容:
- 一个 Ubuntu 22.04 服务器设置为遵循 Ubuntu 22.04 初始服务器安装指南,包括一个 sudo 非root用户和防火墙
- Docker 安装在您的服务器上。
有了Docker安装在您的服务器上,您可以继续第一步。
步骤 1 – 从 Docker Hub 下载 Nginx
Docker 维护一个名为 Dockerhub的网站,这是一个公共存储库的 Docker 文件,包括官方和用户提交的图像。
您可以从预先构建的 Docker 图像下载 Nginx,使用默认的 Nginx 配置,运行以下命令:
1docker pull nginx
Docker 会缓存这些,所以当您运行容器时,您不需要每次下载容器图像。
现在你已经安装了 Nginx,你可以配置容器,以便它作为一个网页服务器公开访问。
1docker run --name docker-nginx -p 80:80 nginx
以下是该命令发生了什么的快速概述:
run
是创建新容器 的命令 *--name
旗帜是您如何指定容器的名称. 如果留空,将分配一个像 nostalgic_hopper 这样的生成的名称-p
指示您在-p local-machine-port:internal-container-port
格式中曝光的端口。在这种情况下,您正在将容器中的端口:80
地图到服务器上的端口:80
。
在 Web 浏览器中,输入您的服务器的 IP 地址,以揭示 Nginx 的默认定位页面:
请注意,在您的终端中,当您向服务器提出请求时,正在更新 Nginx 的日志,这是因为您正在互动地运行您的容器。
在您的终端中,输入CTRL+C
,以阻止容器运行。
由于您关闭了容器,您将无法再查看目的地页面. 您可以使用此命令验证容器状态:
1docker ps -a
1[secondary_label Output]
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
305012ab02ca1 nginx "nginx -g 'daemon off" 57 seconds ago Exited (0) 47 seconds ago docker-nginx
输出显示 Docker 容器已离开。
使用此命令删除现有docker-nginx
容器:
1docker rm docker-nginx
在下一步中,您将拆除容器,以便它独立运行。
步骤 2 – 在独立模式下运行
使用此命令创建一个新的、分离的 Nginx 容器:
1docker run --name docker-nginx -p 80:80 -d nginx
通过附上d
旗帜,您正在在背景中运行此容器。
输出是容器的ID:
1[secondary_label Output]
2b91f3ce26553f3ffc8115d2a8a3ad2706142e73d56dc279095f673580986257
通过运行docker ps
命令,您将遇到有关您的容器的一些新信息:
1docker ps
1[secondary_label Output]
2CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b91f3ce26553 nginx "/docker-entrypoint.…" 56 seconds ago Up 54 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp docker-nginx
您现在在状态
列中有约一分钟
而不是X分钟前退出
(Exited (0) X minutes ago),请注意,端口绘制也是输出的一部分。
请在浏览器中输入您的服务器的 IP 地址,以再次访问默认的 Nginx 定位页面. 此时它在背景中运行,因为您指定了 -d
旗帜,该旗帜告诉 Docker 以分离模式运行此容器。
您现在有一个运行的 Nginx 实例在一个独立的容器. 目前,容器没有访问任何您的网站文件。
停止容器,运行以下命令:
1docker stop docker-nginx
现在容器已停止,您可以通过运行以下命令来删除它:
1docker rm docker-nginx
现在你已经了解如何独立运行 Nginx,在下一步,你将创建和配置 Nginx 来构建一个定位页。
步骤 3 — 构建一个在 Nginx 上服务的网页
在此步骤中,您将为您的网站创建一个自定义页面. 此设置允许您在容器之外托管永久性网站内容。
在主目录中创建您的网站内容的新目录:
1mkdir -p ~/docker-nginx/html
通过运行这个命令导航它:
1cd ~/docker-nginx/html
在您的服务器上创建一个 HTML 文件. 下面的示例使用nano
,但您可以使用您偏好的文本编辑器:
1nano index.html
添加以下 HTML 内容:
1<html>
2 <head>
3 <title>Docker nginx Tutorial</title>
4 </head>
5
6 <body>
7 <div class="container">
8 <h1>Hello DigitalOcean</h1>
9 <p>This Nginx page is brought to you by Docker and DigitalOcean</p>
10 </div>
11 </body>
12</html>
如果您正在使用nano
文本编辑器,请按CTRL+X
,然后按Y
,然后按ENTER
来退出并保存此文件。
你现在有一个索引页面,取代了默认的Nginx定位页面。
步骤 4 – 将容器连接到本地文件系统
在此步骤中,您将 Nginx 链接到您的容器,以便通过端口:80
公开访问,并将其连接到服务器上的网站内容。
Docker 允许您将您的虚拟机的本地文件系统中的目录链接到您的容器. 因为您想要服务于新网页,您需要给您的容器进行渲染的文件。
您可以将文件复制到容器中作为Dockerfile的一部分,或者在事实发生后复制到容器中,但这两种方法都会让您的网站在容器内部处于静态状态。 使用Docker的数据量功能,您可以创建服务器的文件系统和容器的文件系统之间的符号链接。 这使您能够编辑现有网页文件并将新文件添加到目录中。 使用符号链接,您的容器将能够访问这些文件。 如果您想了解更多关于Docker和数据量的信息,请参阅 数据量文档。
Nginx 容器默认设置为在 /usr/share/nginx/html
寻找索引页面。
要做到这一点,使用 -v
旗帜将 ~/docker-nginx/html
文件夹从您的服务器绘制到容器 /usr/share/nginx/html
中的相对路径,使用以下命令:
1docker run --name docker-nginx -p 80:80 -d -v ~/docker-nginx/html:/usr/share/nginx/html nginx
以下是命令的简短解释:
-v
标志表示您正在链接一个卷- 左边的
:
是您服务器上的目录位置,~/docker-nginx/html
. - 右边的
:
是您象征地链接到您的容器的位置/usr/share/nginx/html
.
运行该命令后,请在浏览器中输入您的服务器的 IP 地址,以查看您的新定位页面:
如果您对默认的 Nginx 设置感到满意,则没有其他东西可配置。
您可以将更多内容上传到 ~/docker-nginx/html/
目录,并将添加到您的现场网站。
例如,如果你修改你的 HTML 文件,并更新你的浏览器,它将被相应地更新. 你也可以以这种方式从 HTML 文件中构建一个完整的网站. 例如,如果你添加了about.html
页面,你可以访问它在http://your_server_ip/about.html
,而无需与容器进行交互。
步骤 5 — 使用您自己的 Nginx 配置文件(可选)
如果您想对 Nginx 功能有更多的控制权,则可以使用自定义的 Nginx 配置文件与 Docker 容器一起使用。
首先,请确保您回到顶级项目目录:
1cd ~/docker-nginx
使用 Docker 复制命令将 Nginx config 目录复制到您的项目文件夹:
1docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.conf
由于您将为 Nginx 使用自定义 .conf
文件,您将需要重新构建容器。
首先,停止容器:
1docker stop docker-nginx
然后删除它:
1docker rm docker-nginx
现在,您可以本地编辑默认的 Nginx 配置文件,以服务于一个新的目录,或者使用proxy_pass
将流量转移到另一个应用程序或容器,就像您在正常的 Nginx 安装中一样。
一旦您保存了配置文件,是时候创建 Nginx 容器了. 添加一个 `-v' 旗帜与相应的路径,以便为新鲜的 Nginx 容器提供适当的链接,从自己的配置文件中运行。
1docker run --name docker-nginx -p 80:80 -v ~/docker-nginx/html:/usr/share/nginx/html -v ~/docker-nginx/default.conf:/etc/nginx/conf.d/default.conf -d nginx
此命令将自定义网站页链接到容器。
请注意,当您在启动容器后对配置文件进行任何更改时,您需要使用docker restart
命令重新启动容器。
1docker restart docker-nginx
这将重新启动您的容器,您的更改应反映在相关的页面上。
结论
你现在有一个运行的 Nginx 容器,服务于一个自定义的网页,并且已经学会了如何从容器内部配置 Nginx。
如果您想了解更多有关集装箱的工作,您可以查看我们的 介绍集装箱教程。
此外,如果您想了解如何在两个 Docker 容器之间共享数据,请参阅我们的 如何在 Docker 容器之间共享数据教程。