前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 14.04上的Docker容器中运行Nginx

如何在Ubuntu 14.04上的Docker容器中运行Nginx

原创
作者头像
朝朝
修改2018-10-22 11:36:04
2.7K0
修改2018-10-22 11:36:04
举报

介绍

本教程介绍如何在Docker容器中部署Nginx。

通过容纳Nginx,我们减少了系统管理员的开销。我们将不再需要通过包管理器管理Nginx或从源代码构建它。Docker容器允许我们在发布新版本的Nginx时简单地替换整个容器。我们只需要维护Nginx配置文件和我们的内容。

Nginx将自己描述为:

nginx [engine x]是一个HTTP和反向代理服务器,一个邮件代理服务器和一个通用的TCP代理服务器,最初由Igor Sysoev编写。

实际上,许多系统管理员使用Nginx来提供Web内容,从平面文件网站到NodeJS中的上游API。在本教程中,我们将提供一个基本的Web页面,因此我们可以专注于使用Docker容器配置Nginx。

Docker容器是一种相对较老的操作实践的流行形式:容器化。容器化与虚拟化的不同之处在于虚拟化抽象出硬件,而容器化也抽象出基本操作系统。实际上,这意味着我们可以将应用程序(或应用程序组)包装在一个容器(或容器)中,以使它们具有模块化,可移植性,可组合性和轻量级。

这种可移植性意味着您可以在各种操作系统上安装Docker Engine(也称为Docker Core,甚至只是Docker),任何人编写的任何功能容器都可以在其上运行。

如果您想了解有关Docker的更多信息,可以查看Docker简介

出于本文的目的,我们将在Ubuntu 14.04上安装Docker Engine。

我们将安装当前稳定版的Docker for Ubuntu,即1.8.1。

本教程面向不熟悉Docker的Nginx用户。如果只需要用于设置Nginx容器的裸命令,则可以执行步骤1,然后跳转到步骤5。

如果您想逐步构建容器并了解端口映射和分离模式,请按照整个教程进行操作。

准备

要容纳Nginx,请完成以下操作:

  • 设置一个Ubuntu 14.04服务器,最好使用SSH密钥以确保安全。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 设置一个具有sudo权限的用户
  • 验证您的内核版本

Docker 1.8.1依赖于一些相当新的内核功能,因此请确保内核处于3.10或更高版本。一个新的图像将运行一个相当新的内核,但如果你需要检查,只需运行uname -r

代码语言:javascript
复制
uname -r

我们已经在下面添加了一个新的Ubuntu 14.04 腾讯云CVM的输出,超过了3.10,所以你不应该担心,除非你在旧的图像上运行它。

代码语言:javascript
复制
3.13.0-57-generic

第1步 - 安装Docker

Docker托管启动脚本,以便在您的计算机上启动并运行Docker。我们可以简单地运行命令:

代码语言:javascript
复制
sudo curl -sSL https://get.docker.com/ | sh

一般来说,你不应该将随机脚本从互联网传递到你的shell(| sh),因为它们几乎可以做任何事情。

一旦完成,您将看到如下所示的已安装版本(您的读数可能更新;这很好)以及一些非root用户/没有sudo权限运行的说明。我们正在使用具有sudo权限用户运行本教程,因此无需为本教程的目的而担心这一点。

代码语言:javascript
复制
    Client:
     Version:      1.8.3
     API version:  1.20
     Go version:   go1.4.2
     Git commit:   f4bf5c7
     Built:        Mon Oct 12 05:37:18 UTC 2015
     OS/Arch:      linux/amd64
​
    Server:
     Version:      1.8.3
     API version:  1.20
     Go version:   go1.4.2
     Git commit:   f4bf5c7
     Built:        Mon Oct 12 05:37:18 UTC 2015
     OS/Arch:      linux/amd64

可选:运行hello-world容器以确保一切按预期工作。

代码语言:javascript
复制
sudo docker run hello-world

您应该看到类似于下面显示的输出。

代码语言:javascript
复制
    $ docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    535020c3e8ad: Pull complete
    af340544ed62: Already exists
    library/hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
    Digest: sha256:d5fbd996e6562438f7ea5389d7da867fe58e04d581810e230df4cc073271ea52
    Status: Downloaded newer image for hello-world:latest
​
    Hello from Docker.
    This message shows that your installation appears to be working correctly.
​
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the  you are currently reading.
     4. The Docker daemon streamed that  to the Docker client, which sent it
        to your terminal.
​
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
​
    Share images, automate workflows, and more with a free Docker Hub account:
     https://hub.docker.com
​
    For more examples and ideas, visit:
     https://docs.docker.com/userguide/

有了这个,我们就可以深入了解Docker的基础知识。

(可选)步骤2 - 查看容器基础:运行,列出,删除

本节介绍如何运行基本容器然后将其删除。如果您已经知道如何使用Docker,并希望跳到Nginx部分,请转到步骤5。

我们已经安装了Docker Client作为Docker安装的一部分,因此我们可以访问命令行工具,以便我们与容器进行交互。

如果我们运行以下命令;

代码语言:javascript
复制
sudo docker ps -a

你应该获得类似于以下的输出;

代码语言:javascript
复制
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    a3b149c3ddea        hello-world         "/hello"            3 minutes ago      Exited (0) 3 minutes ago                       nostalgic_hopper

我们可以看到有关容器的一些基本信息。

你会注意到它有一个荒谬的名字,如nostalgic_hopper; 如果在创建容器时未指定,则会自动生成这些名称。

我们还可以看到hello-world示例容器在3分钟前运行并在3分钟前退出。

如果我们使用此命令再次运行此容器(替换nostalgic_hopper为您自己的容器名称):

代码语言:javascript
复制
sudo docker start nostalgic_hopper

然后运行命令列出容器:

代码语言:javascript
复制
sudo docker ps -a

我们现在应该看到容器最近运行了;

代码语言:javascript
复制
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
a3b149c3ddea        hello-world         "/hello"            4 minutes ago      Exited (0) 9 seconds ago                       nostalgic_hopper

默认情况下,Docker容器运行其分配的命令然后退出。

一些容器将被设置为运行一系列任务并完成,而其他容器将无限期运行。

现在我们已经完成了一些Docker基础知识,让我们删除hello-world图像,因为我们不再需要它(记得用容器名替换nostalgic_hopper,或使用容器ID)。

代码语言:javascript
复制
sudo docker rm nostalgic_hopper

接下来我们将开始使用Nginx。

(可选)步骤3 - 学习如何暴露端口

在本节中,我们将下载Nginx Docker镜像,并向您展示如何运行容器,以便它可以作为Web服务器公开访问。

默认情况下,无法从Internet访问容器,因此我们需要将容器的内部端口映射到腾讯云CVM的端口。这就是本节将教你的内容!

首先,我们将获得Nginx图像。

步骤5包含部署完整容器的最终命令,因此如果您不过分关注实现细节,可以直接跳到那里。

运行以下命令以获取Nginx Docker镜像:

代码语言:javascript
复制
sudo docker pull nginx

这将下载容器的所有必要组件。Docker会缓存这些,所以当我们运行容器时,我们不需要每次都下载容器图像。

Docker维护着一个名为Dockerhub的站点,Dockerhub是Docker文件的公共存储库(包括官方和用户提交的图像)。我们下载的图像是官方的Nginx图像,这使我们无需构建自己的图像。

让我们用这个命令启动我们的Nginx Docker容器:

代码语言:javascript
复制
sudo docker run --name docker-nginx -p 80:80 nginx
  • run 是创建新容器的命令
  • --name标志是我们如何指定容器的名称(如果留空一个被分配给我们,像nostalgic_hopper从第2步)
  • -p指定我们以-p local-machine-port:internal-container-port格式显示的端口。在这种情况下,我们将容器中的端口80映射到服务器上的端口80
  • nginx 是dockerhub上的图像名称(我们之前使用pull命令下载了此图像,但如果图像丢失,Docker会自动执行此操作)

这就是我们所需要的Nginx!将腾讯云CVM的IP地址粘贴到Web浏览器中,您应该看到Nginx的“欢迎使用nginx!” 页。

您还会在shell会话中注意到,当您向服务器发出请求时,Nginx的日志正在更新,因为我们正在以交互方式运行容器。

让我们点击CTRL+C中断快捷方式返回我们的shell会话。

如果您现在尝试加载页面,则会出现“拒绝连接”页面。这是因为我们关闭了我们的容器。我们可以使用以下命令验证这一点:

代码语言:javascript
复制
sudo docker ps -a

你应该看到类似于下面显示的输出。

代码语言:javascript
复制
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
05012ab02ca1        nginx               "nginx -g 'daemon off"   57 seconds ago      Exited (0) 47 seconds ago                       docker-nginx

我们可以看到我们的Docker容器已经退出。

如果我们需要连接到容器图像以使其工作,Nginx将不会非常有用,因此在下一步中我们将向您展示如何分离容器以允许它独立运行。

使用docker-nginx命令删除现有容器:

代码语言:javascript
复制
sudo docker rm docker-nginx

在下一步中,我们将向您展示如何在分离模式下运行它。

(可选)步骤4 - 学习如何在分离模式下运行

使用以下命令创建一个新的,分离的Nginx容器:

代码语言:javascript
复制
sudo docker run --name docker-nginx -p 80:80 -d nginx

我们添加了-d标志以在后台运行此容器。

输出应该只是新容器的ID。

如果我们运行list命令:

代码语言:javascript
复制
sudo docker ps

我们将在输出中看到一些我们以前从未见过的东西。

代码语言:javascript
复制
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                         NAMES
b91f3ce26553        nginx               "nginx -g 'daemon off"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, 443/tcp   docker-nginx

我们可以看到这些,而不是我们现在拥有Up About a minuteExited (0) X minutes ago,我们也可以看到端口映射。

如果我们在浏览器中再次访问服务器的IP地址,我们将能够看到“欢迎使用nginx!” 页面了。这次它在后台运行,因为我们指定了-d标志,告诉Docker以分离模式运行这个容器。

现在我们在一个分离的容器中有一个正在运行的Nginx实例!

但是,它还不够用,因为我们无法编辑配置文件,并且容器无法访问我们的任何网站文件。

通过运行以下命令停止容器:

代码语言:javascript
复制
sudo docker stop docker-nginx

既然容器已停止(您可以用sudo docker ps -a检查是否要确定),我们可以通过运行以下命令将其删除;

代码语言:javascript
复制
sudo docker rm docker-nginx

现在我们将进入容器的最终版本,快速停止生成自定义网站文件。

第5步 - 构建一个在Nginx上服务的网页

在此步骤中,我们将为我们的网站创建自定义索引页面。此设置允许我们拥有在(瞬态)容器之外托管的持久网站内容。

让我们在主目录中为我们的网站内容创建一个新目录,然后通过运行下面显示的命令移动到该目录。

代码语言:javascript
复制
mkdir -p ~/docker-nginx/html
cd ~/docker-nginx/html

现在让我们创建一个HTML文件(我们显示Vim的命令,但您可以使用任何您喜欢的文本编辑器)。

代码语言:javascript
复制
vim index.html

按下i进入插入模式。粘贴下面显示的内容(或随意添加您自己的HTML标记)。

代码语言:javascript
复制
<html>
  <head>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-MfvZlkHCEqatNoGiOXveE8FIwMzZg4W85qfrfIFBfYc= sha512-dTfge/zgoMYpP7QbHy4gWMEGsbsdZeCXz7irItjcC3sPUFtf0kuFbDz/ixG7ArTxmDjLXDmezHubeNikyKGVyQ==" crossorigin="anonymous">
    <title>Docker nginx Tutorial</title>
  </head>
  <body>
    <div class="container">
      <h1>Hello Digital Ocean</h1>
      <p>This nginx page is brought to you by Docker and Digital Ocean</p>
    </div>
  </body>
</html>

如果您熟悉HTML,您会发现这是一个超级基本的网页。我们已经包含了一个指向CDN for Bootstrap 的标记<link>(一个CSS框架,它为您的网页提供了响应样式的集合)。

我们现在可以通过按ESC,然后:wqENTER保存此文件:

  • write(w)告诉Vim将更改写入文件
  • quit(q)告诉Vim退出

我们现在有一个简单的索引页面来替换默认的Nginx登陆页面。

第6步 - 将容器链接到本地文件系统

在本节中,我们将把它们放在一起。我们将启动我们的Nginx容器,以便可以通过端口80访问Internet,我们将它连接到服务器上的网站内容。

关于卷的背景信息; 也就是说,链接到容器中的永久服务器内容:

Docker允许我们将目录从虚拟机的本地文件系统链接到容器。

在我们的例子中,由于我们想要服务器网页,我们需要为容器提供要呈现的文件。

我们可以将文件作为Dockerfile的一部分复制到容器中,或者在事后将它们复制到容器中,但这两种方法都使我们的网站在容器内处于静态状态。通过使用Docker的数据卷功能,我们可以在腾讯云CVM的文件系统和容器的文件系统之间创建符号链接。这允许我们编辑现有的网页文件并将新的文件添加到目录中,我们的容器将自动访问它们。

默认设置Nginx容器以查找在/usr/share/nginx/html的索引页面,因此在我们新的Docker容器中,我们需要授予它访问该位置的文件的权限。

建立链接:

为此,我们使用该-v标志将文件夹从本地machine(~/docker-nginx/html)映射到容器(/usr/share/nginx/html)中的相对路径。

我们可以通过运行以下命令来完成此任务:

代码语言:javascript
复制
sudo docker 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的新增内容是我们的卷链接。

  • -v 指定我们正在链接卷
  • 左边的部分:是我们的虚拟机上文件/目录的位置(~/docker-nginx/html
  • 右侧的部分:是我们在容器中链接的位置(/usr/share/nginx/html

运行该命令后,如果您现在将浏览器指向DigitalOcean 腾讯云CVM的IP地址,您应该会看到Hello Digital Ocean的第一个标题(或您在步骤5中创建的任何网页)。

如果您对其他Nginx默认值感到满意,那么您已经完成了设置。

您可以将更多内容上传到~/docker-nginx/html/目录,并将其添加到您的实时网站。

例如,如果我们修改索引文件,并且如果我们重新加载浏览器窗口,我们将能够实时更新它。如果我们愿意,我们可以用这种方式用平面HTML文件构建一个完整的站点。例如,如果我们添加了一个about.html页面,我们可以在不需要与容器交互的情况下在http://your_server_ip/about.html访问它。

(可选)步骤7 - 使用您自己的Nginx配置文件

本节适用于希望将自己的Nginx配置文件与其Nginx容器一起使用的高级用户。如果您没有要使用的自定义配置文件,请跳过此步骤。

让我们回到一个目录,这样我们就不会写入我们的公共HTML目录了:

代码语言:javascript
复制
cd ~/docker-nginx

如果您想查看默认配置文件,只需使用Docker copy命令复制它:

代码语言:javascript
复制
sudo docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.conf

由于我们将使用Nginx 的自定义文件.conf,我们需要重建容器。

首先停止容器:

代码语言:javascript
复制
sudo docker stop docker-nginx

删除它:

代码语言:javascript
复制
sudo docker rm docker-nginx

现在,您可以在本地编辑默认文件(以提供新目录,或使用一个proxy_pass将流量转发到另一个应用程序/容器,就像使用常规Nginx安装一样)。

一旦保存了自定义配置文件,就可以制作Nginx容器了。只需添加带有相应路径的第二个标志-v,即可为新的Nginx容器提供从您自己的配置文件运行的相应链接。

代码语言:javascript
复制
sudo docker 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重新启动容器,因为如果更改了配置文件,Nginx不会热重新加载:

代码语言:javascript
复制
sudo docker restart docker-nginx

结论

您现在有一个正在运行的Nginx容器,用于提供自定义网页。

想要了解更多关于在Docker容器中运行Nginx的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How To Run Nginx in a Docker Container on Ubuntu 14.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
    • 准备
      • 第1步 - 安装Docker
        • (可选)步骤2 - 查看容器基础:运行,列出,删除
          • (可选)步骤3 - 学习如何暴露端口
            • (可选)步骤4 - 学习如何在分离模式下运行
              • 第5步 - 构建一个在Nginx上服务的网页
                • 第6步 - 将容器链接到本地文件系统
                  • (可选)步骤7 - 使用您自己的Nginx配置文件
                    • 结论
                    相关产品与服务
                    容器镜像服务
                    容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档