如何使用官方NGINXDocker镜像_

【51CTO.com快译】

NGINX是世界上最受欢迎的Web服务器之一。NGINX不仅是一种快速可靠的静态Web服务器,还被众多开发人员用作放在API前面的反向代理。

本教程将介绍NGINX官方Docker镜像及其使用方法。我们将从在本地运行静态Web服务器开始,然后构建自定义镜像以容纳Web服务器及它需要提供的文件。最后,我们将介绍为简单的REST API创建反向代理服务器,并介绍如何与您的团队共享该镜像。

先决条件

要完成本教程,您需要满足以下条件:

免费的Docker帐户

您可以注册一个免费的Docker帐户(,并获得免费的无限公共存储库。

本地运行的Docker

下载和安装Docker的说明(。

用于编辑文件的IDE或文本编辑器。我会推荐VSCode(。

NGINX官方镜像

Docker官方镜像是托管在Docker Hub上的一组精选Docker存储库,已经过漏洞扫描,由Docker员工和上游维护者进行维护。

官方镜像是Docker新用户入门的好地方。这些镜像有清晰的文档,倡导最佳实践,是针对最常见的用例设计的。

不妨看一下NGINX官方镜像(。打开常用的浏览器,登录Docker。如果您还没有Docker帐户,可以免费创建一个(。

一旦登录到Docker,在顶部搜索栏中输入“NGINX”,然后按回车键。官方的NGINX镜像应该是搜索结果中的第一个镜像。您会在搜索条目的右上角看到“官方镜像”标签。

图1

现在,点击nginx结果可查看镜像详细信息。

在镜像详细信息屏幕上,您可以查看镜像的描述及自述文件。您还可以通过点击“标签”选项卡来查看所有可用标签。

图2

运行基本的Web服务器

不妨使用NGINX官方镜像运行基本的Web服务器。运行以下命令以启动容器。

$ docker run -it --rm -d -p 8080:80 --name web nginx

运行上述命令后,您开始将容器作为守护程序(-d)来运行,并在主机网络上发布端口8080。您还使用--name选项命名了容器Web。

打开您常用的浏览器并导航到http://localhost:8080。您应该看到以下NGINX欢迎页面。

图3

很好,但运行Web服务器的目的是提供我们自己的自定义html文件,而不是默认的NGINX欢迎页面。

不妨停止容器,看看提供我们自己的HTML文件。

$ docker stop web

添加自定义HTML

默认情况下,Nginx在容器内的/usr/share/nginx/html目录中查找要提供的文件。我们需要将html文件放入该目录。一种很简单的方法是使用已挂载的卷。有了已挂载的卷,我们可以链接本地计算机上的目录,并将该目录映射到运行中的容器。

不妨创建一个自定义html页面,然后使用nginx镜像提供该页面。

创建一个名为site-content的目录。在该目录中添加index.html文件,并添加以下html:

Docker Nginx Hello from Nginx container

现在运行以下命令,该命令与上述命令相同,但现在我们添加了-v标志,以创建绑定挂载卷。这将我们的本地目录 / site-content本地挂载到运行中容器,该容器位于/usr/share/nginx

$ docker run -it --rm -d -p 8080:80 --name web -v / site-content:/ usr / share / nginx nginx

打开常用的浏览器并导航到http://localhost:8080,您应该在浏览器窗口中看到上述的html。

图4

构建自定义的NGINX镜像

绑定挂载是在本地运行并将文件共享到运行中容器的绝佳选择。但如果我们想移动该镜像,并同时移动html文件,该怎么办?

有几个方法,不过最简单的方法之一是通过构建自定义镜像,将html文件复制到镜像中。

要构建自定义镜像,我们需要创建一个Dockerfile并将命令添加到其中。

在同一目录中,创建一个名为Dockerfile的文件,然后粘贴以下命令。

FROM nginx:latestCOPY ./index.html /usr/share/nginx/html/index.html

我们开始使用基础镜像来构建自定义镜像。在第1行,您可以看到我们使用FROM命令执行此操作。这会将nginx:latest镜像拉到本地计算机上,然后在其上面构建自定义镜像。

接下来,我们将index.html文件复制到容器内的/usr/share/nginx/html目录中,覆盖nginx:latest镜像提供的默认index.html文件。

您会注意到,我们没有为Dockerfile添加ENTRYPOINT或CMD。我们将使用基础NGINX镜像提供的底层ENTRYPOINT和CMD。

要构建镜像,运行以下命令:

$ docker build -t webserver .

build命令将告诉Docker执行位于Dockerfile中的命令。您会在终端中看到类似的输出,如下所示:

图5

现在我们可以在容器中运行镜像,但是这回我们没必要创建绑定挂载以加入html。

$ docker run -it --rm -d -p 8080:80 --name web webserver

打开浏览器并导航到http:// localhost:8080,确保html页面已正确提供。

设置反向代理服务器

开发人员的一种常见情况是在反向代理后面运行REST API。这么做的原因有很多,但主要原因之一是在不同网络或IP上运行API服务器,然后前端应用程序开启。然后,您可以保护该网络,只允许来自反向代理服务器的流量。

为了简化和节省空间,我用React.js创建了一个简单的前端应用程序,并用Node.js编写了一个简单的后端API。运行以下命令从GitHub中提取代码。

$ git clone

一旦您克隆了存储库,在常用的IDE中打开项目。看一下前端目录中的Dockerfile。

FROM node:12.18.2 as buildARG REACT_APP_SERVICES_HOST=/services/mWORKDIR /appCOPY ./package.json /app/package.jsonCOPY ./package-lock.json /app/package-lock.jsonRUN yarn installCOPY . .RUN yarn buildFROM nginxCOPY ./nginx/nginx.conf /etc/nginx/conf.d/default.confCOPY --from=build /app/build /usr/share/nginx/html

Dockerfile创建了多阶段构建。我们先构建了React.js应用程序,然后将nginx.conf文件从本地机器复制到镜像中,当初构建的静态html和javascript文件一并复制过去。

我们在frontend/nginx/nginx.conf文件中配置了反向代理。

server { listen 80;server_name frontend;location / {# This would be the directory where your React apps static files are stored atroot /usr/share/nginx/html;try_files $uri /index.html;}location /services/m {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-NginX-Proxy true;proxy_pass :8080/services/m;proxy_ssl_session_reuse off;proxy_set_header Host $http_host;proxy_cache_bypass $http_upgrade;proxy_redirect off;} }

正如您在第二个位置部分中看到的那样,所有前往/services/m的流量都将通过proxy_pass传输到http:// backend:8080/services/m。

该项目的根目录中有一个Docker Compose文件,它将启动前后端服务。不妨启动应用程序,测试反向代理是否正常运行。

$ docker-compose -up Creating network "docker-nginx_frontend" with the default driver Creating network "docker-nginx_backend" with the default driver Creating docker-nginx_frontend_1 ... done Creating docker-nginx_backend_1... done Attaching to docker-nginx_backend_1, docker-nginx_frontend_1 frontend_1| /docker-entrypoint.sh: Configuration complete; ready for start up backend_1 | Listening on port 8080

您可以看到nginx Web服务器已启动,backend_1服务也已启动,在侦听端口8080。

打开浏览器并导航到http:// localhost。您应该会看到以下网页:

图6

打开开发者工具窗口,点击“网络”选项卡。现在回到浏览器,输入实体名称,可以是任何名称。我将使用“widgets”。然后点击“提交”按钮。

在开发者工具窗口中,点击widgets的网络请求,可以看到请求针对http://localhost而不是针对http:// localhost:8080。

图7

打开终端,会注意到从浏览器发出的请求已代理到backend_1服务,并已正确处理。

图8

运送镜像

现在不妨在Docker上共享镜像,以便我们团队中的其他人可以提取镜像并在本地运行。这也是与您团队之外的其他人(比如测试人员和企业主)共享您应用程序的好方法。

要将镜像推送到Docker的存储库,运行docker tag命令,然后运行docker push命令。您先要使用Docker ID登录。如果没有免费帐户,可以在此处创建一个(。

$ docker login $ docker tag nginx-frontend /nginx-frontend $ docker push /nginx-frontend

结论

本文逐步介绍了如何运行NGINX官方镜像、添加自定义html文件、基于官方镜像构建自定义镜像以及将NGINX配置为反向代理。最后,我们将自定义镜像推送到Docker,以便我们可以与团队中的其他人共享。

原文标题:How To Use the Official NGINX Docker Image,作者:Peter McKee

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】