将 NGINX 运行在 Docker 容器中,可在多种环境下提供可靠的 Web 服务。您可能正在搭建个人网站、轻量级 Web 服务,或家庭实验项目。Docker 能帮助您在不同机器与配置之间保持一致性。这种方式能在开发与生产之间迁移时减少额外开销。很多场景会借助 Docker 来对 Web 服务器进行简易打包,使您无需繁琐的手动步骤就能更轻松地分享项目。
本文将讲解如何运行现成的 NGINX 镜像、如何从本地机器提供内容、以及如何构建带有自定义功能的镜像。同时还涵盖反向代理的设置步骤,以及使用 Docker Compose 进行多服务部署。最后,您将了解如何用几条简单命令管理容器,并清楚地看到如何将 Docker 与 NGINX 结合,用于实际任务。
如果您是 Docker 新手,务必查看我们的 Docker 入门指南 ,掌握所有基础知识。
什么是 Docker NGINX?
Docker NGINX 指的是在轻量级容器中运行 NGINX Web 服务器。Docker 容器类似小型打包单元,封装了一个应用及其运行所需的全部依赖。
NGINX 是一款以高性能、易配置、灵活处理 HTTP 流量而闻名的流行 Web 服务器。将 NGINX 与 Docker 搭配很有吸引力,因为可以保持环境一致。无论部署在 macOS、Windows 还是 Linux,容器内部内容都是相同的,也就意味着它在不同宿主操作系统上表现一致。
典型的 NGINX Docker 镜像包含服务器软件、默认配置,以及用于托管文件的目录结构。您可以直接运行该容器,或通过映射特定文件夹、调整配置文件,或基于自定义 Dockerfile 构建镜像来进行修改。这样,您就能加入自定义模块或脚本,使 NGINX 更贴合您的应用。
如需进一步了解如何容器化应用,请参考我们的 使用 Docker 容器化应用 教程。该文面向初学者,更详细地介绍了如何用 Docker 容器化机器学习应用。
前提条件
在开始运行 NGINX 容器之前,请确认已安装 Docker。Docker 为 macOS、Windows 和多种 Linux 发行版提供官方安装程序。其文档为每个操作系统提供了分步流程。
查看我们的 Docker 入门 课程,获取完整的入门指南。
使用如下命令快速测试安装:
docker version
derrickmwiti@Derricks-MacBook-Pro% docker version
Client:
Version: 28.0 .1
API version: 1.48
Go version: go1.23.6
Git commit: 068a01e
Built: Wed Feb 26 10 :38:16 2025
OS/Arch: darwin/arm64
Context: desktop-linux
Server: Docker Desktop 4.39 .0 ( 184744 )
Engine:
Version: 28.0 .1
API version: 1.48 ( minimum version 1.24 )
Go version: go1.23.6
Git commit: bbd0a17
Built: Wed Feb 26 10 :40:57 2025
OS/Arch: linux/arm64
Experimental: false
containerd:
Version: 1.7 .25
GitCommit: bcc810d6b9066471b0b6fa75f557a15a1cbf31bb
runc:
Version: 1.2 .4
GitCommit: v1.2.4-0-g6c52b3f
docker-init:
Version: 0.19 .0
GitCommit: de40ad0技术支持
如果能看到版本信息,说明 Docker 已就绪。除 Docker 本身外,您还需要联网以便从 Docker Hub 拉取 NGINX 镜像。如果打算创建自定义镜像,还需要一个文本编辑器来编写 Dockerfile。任意文本编辑器都可以,选择您用着顺手的即可。
在 Docker 容器中设置 NGINX
从现成的镜像运行 NGINX 通常是最快的方法。您可以在几秒内从 Docker Hub 拉取镜像,然后启动容器。之后,就能在浏览器中看到默认页面。这个简短流程往往是许多基于 Docker 的服务器搭建的第一步。
拉取 NGINX Docker 镜像
官方 NGINX 镜像在 Docker Hub 上以 nginx 名称公开提供。
使用以下命令拉取:
docker pull nginx
derrickmwiti@Derricks-MacBook-Pro % docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
4c7c1a5bd3af: Download complete
bef2ee7fab45: Download complete
d9b636547744: Downloading [ == == == == == == == == == == == > ] 12 .58MB/28.04MB
0994e771ba34: Downloading [ == = > ] 3 .146MB/40.56MB
589701e352f8: Download complete
13f89c653285: Download complete
8e77214beb25: Download complete 技术支持
该命令会访问镜像仓库并获取最新版本。完成后,您可以检查镜像是否已在本机:
docker images
derrickmwiti@Derricks-MacBook-Pro% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 124b44bfc9cc 6 weeks ago 280MB
keras-custom-training-container latest < none> 7de0f04013e5 7 技术支持
该命令会列出本地库中的镜像。您应该能在表格中看到 nginx 镜像。这表示您已准备好基于它创建容器。想了解数据科学项目常用镜像列表,请参阅我们的 机器学习与 AI 的 12 个顶级 Docker 容器镜像 教程。
运行 NGINX 容器
镜像下载到系统后,您可以用一条命令启动容器:
docker run --name mynginx -p 8080 :80 -d nginx
derrickmwiti@Derricks-MacBook-Pro % docker run --name mynginx -p 8080 :80 -d nginx
ec44d1a43016e9684b602437b967c0ed8e11c933a8a76b341b68c25168d2af70技术支持
该命令执行了多项操作。它以 -d 参数在后台运行名为 mynginx 的容器。将宿主机的 8080 端口映射到容器内的 80 端口。通过该端口映射,您可以在浏览器访问 http://localhost:8080 ,查看 NGINX 默认页面。该容器使用的是从 Docker Hub 拉取的 nginx 镜像。
由于 NGINX 在运行,新容器应会保持活动状态。您可以通过以下命令查看日志:
docker logs mynginx
derrickmwiti@Derricks-MacBook-Pro % docker logs mynginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10 -listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10 -listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2025 /03/20 04:33:10 [ notice] 1
2025 /03/20 04:33:10 [ notice] 1
2025 /03/20 04:33:10 [ notice] 1
2025 /03/20 04:33:10 [ notice] 1
2025 /03/20 04:33:10 [ notice] 1
2025 /03/20 04:33:10 [ notice] 1
2025 /03/20 04:3技术支持
您可以查看 NGINX 输出的所有消息。
使用 NGINX 提供自定义内容
您可能希望提供一份 HTML 页面,而非容器镜像自带的默认页。您可以在本地机器创建一个简单文件,然后将其挂载进容器。这样可将内容与容器分离。每当您修改页面,只需刷新浏览器即可看到变化。
创建自定义 HTML 页面
在本地机器选择一个方便的位置,例如您主目录下名为 html_content 的文件夹。在其中创建 index.html 文件,内容类似:
< html>
< head>
< title> My NGINX Page</ title>
</ head>
< body>
< h1> Hello from my Docker NGINX setup!</ h1>
< p> This is a custom page served from a local folder.</ p>
</ body>
</ html> 技术支持
这是一份基础的 HTML 页面。您可以加入任意文本或样式,添加图片或 JavaScript,按需定制。
将 HTML 页面挂载到 NGINX 容器
官方 NGINX 镜像默认从 /usr/share/nginx/html 提供内容。您可以将本地文件夹映射到容器内的该路径。使用 Docker 的 -v(卷)参数即可。在此之前,先停止名为 mynginx 的现有容器以避免端口冲突:
docker stop mynginx
docker rm mynginx技术支持
然后启动一个新容器:
docker run --name mynginx -p 8080 :80 -d \
-v /Users/derrickmwiti/Documents/html_content:/usr/share/nginx/html \
nginx
6f68085733eeac418c3302e5c580a4f7c5c0c36d3591d8e2a7f35f69f6308d18技术支持
将 /path/to/html_content 替换为您电脑上的实际路径。这样,当您访问 http://localhost:8080 时,容器会提供您放在 html_content 中的 HTML 文件。默认情况下,如果文件名为 index.html,NGINX 会自动加载它。
当您需要经常调整内容时,这种方式很实用。无需每次都重建容器,服务器会即时从本地文件夹读取内容。
如果看到与权限相关的警告,可能需要确保本地用户与 Docker 对该文件夹具有读取权限。
在 Linux 上,这可能意味着需调整所有权或文件权限。在 Windows 或 macOS 上,可能需要授予 Docker 访问磁盘的权限。
构建自定义 NGINX Docker 镜像
挂载本地文件夹是进行简单测试的快捷方式。但您可能还需要额外模块、特殊配置或其他改动。这时,构建镜像就很有帮助。
Docker 让您可以轻松创建一个小型“配方”文件(即 Dockerfile),按您的方式精确设置容器。随后,您会得到一个可与他人分享或推送到镜像仓库的镜像。这通常比让别人去挂载一堆本地文件更方便。
创建 Dockerfile
Dockerfile 只是一个纯文本文件。您可以将其命名为 Dockerfile,或按喜好取名。将其放在新目录中。下面是一个简单示例:
FROM nginx:latest
COPY index.html /usr/share/nginx/html/index.html技术支持
这将使用官方的 nginx:latest 作为基础镜像,然后将本地名为 index.html 的文件复制到容器内默认的 Web 内容目录。若有需要,您可以加入更多指令。例如复制自定义的 nginx.conf 或添加要安装的模块,视需求而定。如果只是放置一个静态页面,上述片段就已足够。
准备好 Dockerfile 后,在同一文件夹中加入自定义的 index.html。然后即可构建。常用命令为:
docker build -t mynginximage .
[ +] Building 2 .6s ( 7 /7) FINISHED docker:desktop-linux
= > [ internal] load build definition from Dockerfile 0 .0s
= > = > transferring dockerfile: 245B 0 .0s
= > [ internal] load metadata for docker.io/library/nginx:latest 0 .0s
= > [ internal] load .dockerignore 0 .0s
= > = > transferring context: 2B 0 .0s
= > [ internal] load build context 0 .0s
= > = > transferring context: 365B 0 .0s
= > [ 1 /2] FROM docker.io/library/nginx:latest@sha256:124b44bfc9ccd1f3cedf4b592d4d1e8bddb78b51ec2ed5056c52d3692baebc19 2 .3s
= > = > resolve docker.io/library/nginx:latest@sha256:124b44bfc9ccd1f3cedf4b592d4d1e8bddb78b51ec2ed5056c52d3692baebc19 2 .3s
= > [ 2 /2] COPY index.html /usr/share/nginx/html/index.html 0 .0s
= > exporting to image 0 .1s
= > = > exporting layers 0 .0s
= > = > exporting manifest sha256:19dd719772fd7ac839fadb7d49862f84422f4571a442994ffaca152e9674553a 0 .0s
= > = > exporting config sha256:e974f3ab92a0278e419f0fe4c5a6fc43fafb4a75da27895d90c4f2d5d385daa1 0 .0s
= > = > exporting attestation manifest sha256:e391b0212e5a100bd9132fbbd6cb4052e288dbbcba093839b55f8b197131372b 0 .0s
= > = > exporting manifest list sha256:d35c2bbe10ab0b7e46d1ef8fba6c6cb28628eb9c283db02607e32e95b62e14d5 0 .0s
= > = > naming to docker.io/library/mynginximage:latest 0 .0s
= > = > unpacking to docker.io/library/mynginximage:latest 0 .0s技术支持
命令末尾的点表示当前目录为构建上下文。Docker 会读取该目录中的 Dockerfile。最终会在本地生成名为 mynginximage 的镜像。您可以通过以下命令查看:
docker images
mynginximage latest d35c2bbe10ab 36 seconds ago 281MB技术支持
您应能在列表中看到这个新名称。这种方式意味着 Dockerfile 与 HTML 已被打包到同一个镜像中,运行时无需再挂载任何内容。
构建并运行自定义镜像
现在已经构建好了 mynginximage,您可以运行它:
docker run --name mycustomnginx -p 8080 :80 -d mynginximage技术支持
请确保先停止之前的容器以避免端口冲突。
该容器会自动提供您在 Dockerfile 中放置的页面。若在浏览器打开 http://localhost:8080 ,应能看到对应的 HTML 文本。
您可以将 Dockerfile 分享给他人,或将构建好的镜像推送到镜像仓库。这样,团队成员或同事无需复制本地文件夹就能直接启动。
至此,构建一个最小可用的自定义 NGINX 镜像的流程就完成了。您从官方基础镜像出发,复制一两个文件,即可得到包含自定义站点的新容器。您还可以继续扩展 Dockerfile,例如在多阶段构建中切换配置以用 php-fpm 处理 PHP,或添加 NGINX 默认未包含的自定义模块。
这也体现了 Docker 的灵活性:Dockerfile 的每一层都可处理特定任务,最终镜像又便于分发。您既能掌控 Web 内容,也可按需调整设置,使容器更契合项目。
探索这些10 个 Docker 项目灵感 ,通过动手构建与优化数据科学应用来学习 Docker。
将 NGINX 设置为反向代理
NGINX 可以将传入请求转发到同一系统上的其他服务,甚至转发到运行在不同机器上的服务。这通常称为反向代理设置。您可以将 NGINX 放在一组应用之前,使所有请求都通过单一入口。
当您有多个 Docker 容器分别监听不同端口、但希望统一使用一个域名时,这很常见。NGINX 监听标准端口(如 80 或 443),然后根据路径、主机名或其他因素将流量路由到正确的服务。
理解反向代理
当 NGINX 以这种方式配置后,客户端并不知道后台的通信细节。NGINX 作为对外入口,接收并转发请求,再将响应返回给客户端。
这种设计简化了网络结构,也为您提供了调整缓存、添加 TLS 证书、进行负载均衡或执行其他高级任务的机会。在单一位置统一管理这些任务,往往比把配置分散到多个服务中更容易。
一个典型场景是:在 80 端口运行 NGINX 的容器,将请求转发给在 3000 端口运行的应用容器。客户端访问 http://yourdomain.com,但流量在后台被导向另一个容器。
这既能让应用容器保留默认端口,对用户来说也几乎无感;另一个理由是,您也许希望隐藏服务的内部细节,或呈现统一的 URL 结构。
为反向代理配置 NGINX
要实现这一点,您需要一份使用代理指令的自定义 NGINX 配置文件。可以在运行容器时挂载该配置文件,或构建包含它的自定义镜像。以下示例用于说明基本思路:
server {
listen 80 ;
location / {
proxy_pass http://myapp:3000/;
}
} 技术支持
在以上片段中,任何到达 NGINX 容器 80 端口的请求,都将被转发到 myapp:3000。其中的 myapp 名称意味着存在一个可通过该名称访问的容器,这在使用 Docker 网络功能时很常见。
如果您使用的是独立容器,也可以映射容器的 IP 地址或宿主机的 IP。您还可以加入更高级的设置,例如 proxy_set_header Host $host,或根据应用需要调整超时值。
如果选择在运行时挂载该文件,可以像这样操作:
docker run --name nginxproxy -p 8080 :80 -d \
-v /path/to/nginx.conf:/etc/nginx/conf.d/default.conf \
--network mynetwork \
nginx技术支持
该命令运行 NGINX 容器,并将本地的 nginx.conf 挂载为默认配置文件。同时将容器连接到名为 mynetwork 的 Docker 网络(您的另一个容器 myapp 位于该网络中)。如果您希望将配置保留在容器外部,这通常是最简单的方式。
如果您倾向于固定的安排,也可以把该文件写进 Dockerfile。无论哪种方式都可以,只要引用与您命名的容器和网络一致即可。
这种设计让您可以为所有 Web 服务提供单一域名或 IP 以及统一的端口。如果您需要对接多个后端容器,可以在配置中定义多个 location,每个指向不同的容器端口。然后 NGINX 可基于 URL 路径将请求路由到对应服务。这是微服务架构中很受欢迎的做法,因为它能把入口整合得更干净有序。
使用 Docker Compose 部署 NGINX
当多个容器需要协同工作时,反向代理往往更有用。Docker Compose 允许您在一个文件中定义多个服务,然后用一条命令整体启动或停止。它将所有细节集中到一个标准文件中,减少了创建容器或端口映射出错的机会。
Docker Compose 简介
借助 Docker Compose,您可以管理一组容器。您可以描述每个服务、指定要使用的镜像、要发布的端口、要挂载的卷、以及要加入的网络。随后使用一个简单命令(docker compose up -d)即可一键启动所有服务。
这种方式对本地开发或需协调多容器的预发布环境很方便。常用的文件格式为 YAML。
尽管 Docker Compose 可在多种操作系统上使用,您仍需确保其已安装并可用。现代的 Docker Desktop 安装通常默认包含它。您可以通过以下命令检查版本:
docker compose version
Docker Compose version v2.33.1-desktop.1技术支持
如果能看到版本信息,就可以继续。如果没有,请参考 Docker 文档了解如何启用或安装 Docker Compose。
创建 docker-compose.yml 文件
该文件通常包含 services 段。下面是一份用于设置单个 NGINX 容器以提供静态内容的 docker-compose.yml 简例:
services :
web :
image : nginx: latest
ports :
- "8080:80"
volumes :
- ./html: /usr/share/nginx/html技术支持
文件含义如下:
web:该服务使用最新的 NGINX 镜像。
ports:将容器内的 80 端口映射到宿主机的 8080 端口。这样您就可以通过 http://localhost:8080 访问 Web 服务器。
volumes:将本地 html 目录挂载到容器内 NGINX 的默认内容目录( /usr/share/nginx/html )。该设置使 NGINX 能够提供您的自定义静态内容。
使用 Docker Compose 部署服务
在与 docker-compose.yml 位于同一目录的位置,创建名为 html 的子目录。
将静态 HTML 文件(如 index.html)放入该 html 目录。在此示例中,我创建了一个简单的 Bootstrap 风格页面作为演示。
打开终端,切换到包含 docker-compose.yml 的项目目录。
运行以下命令启动服务:
docker compose up -d
[ +] Running 1 /1
✔ Container html_content-web-1 Started 技术支持
-d 参数会以分离模式运行容器,让其在后台运行。
Docker Compose 会读取当前目录下的 docker-compose.yml 文件。若本地不存在所需镜像,它会先行拉取,然后启动每个容器。
打开浏览器并访问 http://localhost:8080 。
您应能看到由 NGINX 提供的静态内容。
您可以通过以下命令查看正在运行的服务状态:
docker compose ps 技术支持
如果需要将所有内容拆除,可以用一条命令移除容器:
docker compose down技术支持
该命令会一次性停止并移除所有容器。如果要在另一台机器上复现完整环境,只需复制 Docker Compose 文件和相关代码,然后运行相同命令即可。这能以最少的手动步骤确保一致的结果。
管理 NGINX 容器
虽然在多服务工作流中 Docker Compose 很受欢迎,但有时您只需管理单个容器或一个小集群。Docker 提供了一些基础命令,帮助您查看正在运行的容器、暂停或停止它们,并在需要时将其移除。
这些都是日常维护所必需的,尤其当您在多个 NGINX 容器或重复构建之间进行实验时。
查看正在运行的容器
若需查看哪些容器正在运行,可以使用:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d386c085129 mynginximage "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0 .0.0:8080-> 80 /tcp mycustomnginx技术支持
该命令会打印一个活动容器的表格,包括 ID、镜像、名称等信息。若需查看所有容器(包括已停止的),请使用:
docker ps -a 技术支持
它会显示系统上所有容器,包括已退出的容器。查看旧运行留下的容器时很有帮助。如果您一直在不同镜像间尝试,可能会看到名为 mynginx、mycustomnginx 等的容器。
停止并移除容器
完成使用后,您可以按名称停止容器:
docker stop mynginx技术支持
这会告诉 Docker 向容器发送停止信号,使 NGINX 能够正常关闭。若希望随后立即移除容器,可运行:
docker rm mynginx技术支持
如果您更喜欢一步到位地停止并移除容器,可以使用:
docker rm -f mynginx技术支持
该命令会强制移除,若容器仍在运行则先将其停止。在生产环境中使用这种方式需谨慎,因为它会在未进行优雅关闭的情况下终止容器。另一个日常维护命令是 docker rmi,用于从系统中删除镜像。
当您不再需要某些镜像并希望释放空间时,这会很有用。但 Docker 只会删除未被运行中容器使用的镜像。
总结
在 Docker 中使用 NGINX,是提供网页或将流量路由到其他服务的便捷方式。您可以直接运行官方镜像,或通过简单的 Dockerfile 构建自己的镜像。Docker Compose 能协调多个容器,使复杂环境更易管理。
通过这些方法,您可以提供内容、处理转发,并为 Web 项目维护可靠的一致性环境。
如果您需要更偏实操的 Docker 学习路径,请查看我们的 Docker 入门课程 ,了解它为何是数据专业人士的必备工具。
将 NGINX 运行在 Docker 容器中,可在多种环境下提供可靠的 Web 服务。您可能正在搭建个人网站、轻量级 Web 服务,或家庭实验项目。Docker 能帮助您在不同机器与配置之间保持一致性。这种方式能在开发与生产之间迁移时减少额外开销。很多场景会借助 Docker 来对 Web 服务器进行简易打包,使您无需繁琐的手动步骤就能更轻松地分享项目。
本文将讲解如何运行现成的 NGINX 镜像、如何从本地机器提供内容、以及如何构建带有自定义功能的镜像。同时还涵盖反向代理的设置步骤,以及使用 Docker Compose 进行多服务部署。最后,您将了解如何用几条简单命令管理容器,并清楚地看到如何将 Docker 与 NGINX 结合,用于实际任务。
如果您是 Docker 新手,务必查看我们的Docker 入门指南,掌握所有基础知识。
什么是 Docker NGINX?
Docker NGINX 指的是在轻量级容器中运行 NGINX Web 服务器。Docker 容器类似小型打包单元,封装了一个应用及其运行所需的全部依赖。
NGINX 是一款以高性能、易配置、灵活处理 HTTP 流量而闻名的流行 Web 服务器。将 NGINX 与 Docker 搭配很有吸引力,因为可以保持环境一致。无论部署在 macOS、Windows 还是 Linux,容器内部内容都是相同的,也就意味着它在不同宿主操作系统上表现一致。
典型的 NGINX Docker 镜像包含服务器软件、默认配置,以及用于托管文件的目录结构。您可以直接运行该容器,或通过映射特定文件夹、调整配置文件,或基于自定义 Dockerfile 构建镜像来进行修改。这样,您就能加入自定义模块或脚本,使 NGINX 更贴合您的应用。
如需进一步了解如何容器化应用,请参考我们的使用 Docker 容器化应用教程。该文面向初学者,更详细地介绍了如何用 Docker 容器化机器学习应用。
前提条件
在开始运行 NGINX 容器之前,请确认已安装 Docker。Docker 为 macOS、Windows 和多种 Linux 发行版提供官方安装程序。其文档为每个操作系统提供了分步流程。
查看我们的Docker 入门课程,获取完整的入门指南。
使用如下命令快速测试安装:
如果能看到版本信息,说明 Docker 已就绪。除 Docker 本身外,您还需要联网以便从 Docker Hub 拉取 NGINX 镜像。如果打算创建自定义镜像,还需要一个文本编辑器来编写 Dockerfile。任意文本编辑器都可以,选择您用着顺手的即可。
在 Docker 容器中设置 NGINX
从现成的镜像运行 NGINX 通常是最快的方法。您可以在几秒内从 Docker Hub 拉取镜像,然后启动容器。之后,就能在浏览器中看到默认页面。这个简短流程往往是许多基于 Docker 的服务器搭建的第一步。
拉取 NGINX Docker 镜像
官方 NGINX 镜像在 Docker Hub 上以
nginx名称公开提供。使用以下命令拉取:
该命令会访问镜像仓库并获取最新版本。完成后,您可以检查镜像是否已在本机:
该命令会列出本地库中的镜像。您应该能在表格中看到
nginx镜像。这表示您已准备好基于它创建容器。想了解数据科学项目常用镜像列表,请参阅我们的机器学习与 AI 的 12 个顶级 Docker 容器镜像教程。运行 NGINX 容器
镜像下载到系统后,您可以用一条命令启动容器:
该命令执行了多项操作。它以
-d参数在后台运行名为mynginx的容器。将宿主机的 8080 端口映射到容器内的 80 端口。通过该端口映射,您可以在浏览器访问 http://localhost:8080,查看 NGINX 默认页面。该容器使用的是从 Docker Hub 拉取的nginx镜像。由于 NGINX 在运行,新容器应会保持活动状态。您可以通过以下命令查看日志:
您可以查看 NGINX 输出的所有消息。
使用 NGINX 提供自定义内容
您可能希望提供一份 HTML 页面,而非容器镜像自带的默认页。您可以在本地机器创建一个简单文件,然后将其挂载进容器。这样可将内容与容器分离。每当您修改页面,只需刷新浏览器即可看到变化。
创建自定义 HTML 页面
在本地机器选择一个方便的位置,例如您主目录下名为
html_content的文件夹。在其中创建index.html文件,内容类似:这是一份基础的 HTML 页面。您可以加入任意文本或样式,添加图片或 JavaScript,按需定制。
将 HTML 页面挂载到 NGINX 容器
官方 NGINX 镜像默认从
/usr/share/nginx/html提供内容。您可以将本地文件夹映射到容器内的该路径。使用 Docker 的-v(卷)参数即可。在此之前,先停止名为mynginx的现有容器以避免端口冲突:然后启动一个新容器:
将
/path/to/html_content替换为您电脑上的实际路径。这样,当您访问 http://localhost:8080 时,容器会提供您放在html_content中的 HTML 文件。默认情况下,如果文件名为index.html,NGINX 会自动加载它。当您需要经常调整内容时,这种方式很实用。无需每次都重建容器,服务器会即时从本地文件夹读取内容。
如果看到与权限相关的警告,可能需要确保本地用户与 Docker 对该文件夹具有读取权限。
在 Linux 上,这可能意味着需调整所有权或文件权限。在 Windows 或 macOS 上,可能需要授予 Docker 访问磁盘的权限。
构建自定义 NGINX Docker 镜像
挂载本地文件夹是进行简单测试的快捷方式。但您可能还需要额外模块、特殊配置或其他改动。这时,构建镜像就很有帮助。
Docker 让您可以轻松创建一个小型“配方”文件(即 Dockerfile),按您的方式精确设置容器。随后,您会得到一个可与他人分享或推送到镜像仓库的镜像。这通常比让别人去挂载一堆本地文件更方便。
创建 Dockerfile
Dockerfile 只是一个纯文本文件。您可以将其命名为
Dockerfile,或按喜好取名。将其放在新目录中。下面是一个简单示例:这将使用官方的
nginx:latest作为基础镜像,然后将本地名为index.html的文件复制到容器内默认的 Web 内容目录。若有需要,您可以加入更多指令。例如复制自定义的nginx.conf或添加要安装的模块,视需求而定。如果只是放置一个静态页面,上述片段就已足够。准备好 Dockerfile 后,在同一文件夹中加入自定义的
index.html。然后即可构建。常用命令为:命令末尾的点表示当前目录为构建上下文。Docker 会读取该目录中的 Dockerfile。最终会在本地生成名为
mynginximage的镜像。您可以通过以下命令查看:您应能在列表中看到这个新名称。这种方式意味着 Dockerfile 与 HTML 已被打包到同一个镜像中,运行时无需再挂载任何内容。
构建并运行自定义镜像
现在已经构建好了
mynginximage,您可以运行它:请确保先停止之前的容器以避免端口冲突。
该容器会自动提供您在 Dockerfile 中放置的页面。若在浏览器打开 http://localhost:8080,应能看到对应的 HTML 文本。
您可以将 Dockerfile 分享给他人,或将构建好的镜像推送到镜像仓库。这样,团队成员或同事无需复制本地文件夹就能直接启动。
至此,构建一个最小可用的自定义 NGINX 镜像的流程就完成了。您从官方基础镜像出发,复制一两个文件,即可得到包含自定义站点的新容器。您还可以继续扩展 Dockerfile,例如在多阶段构建中切换配置以用
php-fpm处理 PHP,或添加 NGINX 默认未包含的自定义模块。这也体现了 Docker 的灵活性:Dockerfile 的每一层都可处理特定任务,最终镜像又便于分发。您既能掌控 Web 内容,也可按需调整设置,使容器更契合项目。
探索这些10 个 Docker 项目灵感,通过动手构建与优化数据科学应用来学习 Docker。
将 NGINX 设置为反向代理
NGINX 可以将传入请求转发到同一系统上的其他服务,甚至转发到运行在不同机器上的服务。这通常称为反向代理设置。您可以将 NGINX 放在一组应用之前,使所有请求都通过单一入口。
当您有多个 Docker 容器分别监听不同端口、但希望统一使用一个域名时,这很常见。NGINX 监听标准端口(如 80 或 443),然后根据路径、主机名或其他因素将流量路由到正确的服务。
理解反向代理
当 NGINX 以这种方式配置后,客户端并不知道后台的通信细节。NGINX 作为对外入口,接收并转发请求,再将响应返回给客户端。
这种设计简化了网络结构,也为您提供了调整缓存、添加 TLS 证书、进行负载均衡或执行其他高级任务的机会。在单一位置统一管理这些任务,往往比把配置分散到多个服务中更容易。
一个典型场景是:在 80 端口运行 NGINX 的容器,将请求转发给在 3000 端口运行的应用容器。客户端访问 http://yourdomain.com,但流量在后台被导向另一个容器。
这既能让应用容器保留默认端口,对用户来说也几乎无感;另一个理由是,您也许希望隐藏服务的内部细节,或呈现统一的 URL 结构。
为反向代理配置 NGINX
要实现这一点,您需要一份使用代理指令的自定义 NGINX 配置文件。可以在运行容器时挂载该配置文件,或构建包含它的自定义镜像。以下示例用于说明基本思路:
在以上片段中,任何到达 NGINX 容器 80 端口的请求,都将被转发到
myapp:3000。其中的myapp名称意味着存在一个可通过该名称访问的容器,这在使用 Docker 网络功能时很常见。如果您使用的是独立容器,也可以映射容器的 IP 地址或宿主机的 IP。您还可以加入更高级的设置,例如
proxy_set_header Host $host,或根据应用需要调整超时值。如果选择在运行时挂载该文件,可以像这样操作:
该命令运行 NGINX 容器,并将本地的
nginx.conf挂载为默认配置文件。同时将容器连接到名为mynetwork的 Docker 网络(您的另一个容器myapp位于该网络中)。如果您希望将配置保留在容器外部,这通常是最简单的方式。如果您倾向于固定的安排,也可以把该文件写进 Dockerfile。无论哪种方式都可以,只要引用与您命名的容器和网络一致即可。
这种设计让您可以为所有 Web 服务提供单一域名或 IP 以及统一的端口。如果您需要对接多个后端容器,可以在配置中定义多个 location,每个指向不同的容器端口。然后 NGINX 可基于 URL 路径将请求路由到对应服务。这是微服务架构中很受欢迎的做法,因为它能把入口整合得更干净有序。
使用 Docker Compose 部署 NGINX
当多个容器需要协同工作时,反向代理往往更有用。Docker Compose 允许您在一个文件中定义多个服务,然后用一条命令整体启动或停止。它将所有细节集中到一个标准文件中,减少了创建容器或端口映射出错的机会。
Docker Compose 简介
借助 Docker Compose,您可以管理一组容器。您可以描述每个服务、指定要使用的镜像、要发布的端口、要挂载的卷、以及要加入的网络。随后使用一个简单命令(
docker compose up -d)即可一键启动所有服务。这种方式对本地开发或需协调多容器的预发布环境很方便。常用的文件格式为 YAML。
尽管 Docker Compose 可在多种操作系统上使用,您仍需确保其已安装并可用。现代的 Docker Desktop 安装通常默认包含它。您可以通过以下命令检查版本:
如果能看到版本信息,就可以继续。如果没有,请参考 Docker 文档了解如何启用或安装 Docker Compose。
创建 docker-compose.yml 文件
该文件通常包含 services 段。下面是一份用于设置单个 NGINX 容器以提供静态内容的
docker-compose.yml简例:文件含义如下:
html目录挂载到容器内 NGINX 的默认内容目录(/usr/share/nginx/html)。该设置使 NGINX 能够提供您的自定义静态内容。使用 Docker Compose 部署服务
在与
docker-compose.yml位于同一目录的位置,创建名为html的子目录。将静态 HTML 文件(如
index.html)放入该html目录。在此示例中,我创建了一个简单的 Bootstrap 风格页面作为演示。打开终端,切换到包含
docker-compose.yml的项目目录。运行以下命令启动服务:
-d参数会以分离模式运行容器,让其在后台运行。Docker Compose 会读取当前目录下的
docker-compose.yml文件。若本地不存在所需镜像,它会先行拉取,然后启动每个容器。打开浏览器并访问 http://localhost:8080。
您应能看到由 NGINX 提供的静态内容。
您可以通过以下命令查看正在运行的服务状态:
如果需要将所有内容拆除,可以用一条命令移除容器:
该命令会一次性停止并移除所有容器。如果要在另一台机器上复现完整环境,只需复制 Docker Compose 文件和相关代码,然后运行相同命令即可。这能以最少的手动步骤确保一致的结果。
管理 NGINX 容器
虽然在多服务工作流中 Docker Compose 很受欢迎,但有时您只需管理单个容器或一个小集群。Docker 提供了一些基础命令,帮助您查看正在运行的容器、暂停或停止它们,并在需要时将其移除。
这些都是日常维护所必需的,尤其当您在多个 NGINX 容器或重复构建之间进行实验时。
查看正在运行的容器
若需查看哪些容器正在运行,可以使用:
该命令会打印一个活动容器的表格,包括 ID、镜像、名称等信息。若需查看所有容器(包括已停止的),请使用:
它会显示系统上所有容器,包括已退出的容器。查看旧运行留下的容器时很有帮助。如果您一直在不同镜像间尝试,可能会看到名为
mynginx、mycustomnginx等的容器。停止并移除容器
完成使用后,您可以按名称停止容器:
这会告诉 Docker 向容器发送停止信号,使 NGINX 能够正常关闭。若希望随后立即移除容器,可运行:
如果您更喜欢一步到位地停止并移除容器,可以使用:
该命令会强制移除,若容器仍在运行则先将其停止。在生产环境中使用这种方式需谨慎,因为它会在未进行优雅关闭的情况下终止容器。另一个日常维护命令是
docker rmi,用于从系统中删除镜像。当您不再需要某些镜像并希望释放空间时,这会很有用。但 Docker 只会删除未被运行中容器使用的镜像。
总结
在 Docker 中使用 NGINX,是提供网页或将流量路由到其他服务的便捷方式。您可以直接运行官方镜像,或通过简单的 Dockerfile 构建自己的镜像。Docker Compose 能协调多个容器,使复杂环境更易管理。
通过这些方法,您可以提供内容、处理转发,并为 Web 项目维护可靠的一致性环境。
如果您需要更偏实操的 Docker 学习路径,请查看我们的Docker 入门课程,了解它为何是数据专业人士的必备工具。