Contents

在Docker容器中运行NGINX服务器

1. 概述

在这个简短的教程中,我们将讨论如何在Docker 容器中运行Nginx 服务器。

首先,我们将通过使用 Dockerfile 从头开始创建 Docker 映像来安装和运行 Nginx。之后,我们将从官方Nginx Docker 镜像创建一个简单的 Docker 容器。

2. 使用 Dockerfile 从头开始创建 Nginx 映像

**Nginx 是一个功能强大的高级 Web 服务器,我们可以使用它来提供各种内容,例如静态网页和 API。**在本节中,我们将首先创建一个新的 Dockerfile,其中包含构建和运行 Nginx 映像所需的说明。

2.1. 最初设定

首先,让我们创建一个新目录并touch Dockerfile:

$ mkdir server
$ touch Dockerfile

现在,我们准备好填充我们的Dockerfile了。通常,Dockerfile 中的第一条命令会指示 Docker 基于另一个镜像创建一个镜像

FROM ubuntu

我们的 Docker 映像现在将基于Dockerhub 上提供的最小 Ubuntu 映像。Dockerfile 中的上述命令将叠加在基础镜像之上。

2.2. 安装 Nginx

在下一行中,我们将告诉 Docker使用apt 从官方包存储库安装nginx包:

RUN apt-get -y update && apt-get -y install nginx

该命令首先尝试更新包存储库。一旦成功,它就会安装nginx包。

2.3. 配置文件

Nginx 确实带有一个默认配置文件。但是,当我们拥有自己的 Nginx 配置文件时,在 Docker 容器之外维护它要容易得多。因此,我们将在与 Dockerfile 相同的目录中为 Nginx 创建一个默认配置文件:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    
    root /usr/share/nginx/html;
    index index.html index.htm;
    server_name _;
    location / {
        try_files $uri $uri/ =404;
    }
}

让我们在 Dockerfile 中添加一个条目来复制我们的配置文件:

COPY default /etc/nginx/sites-available/default

现在,每次我们构建 Docker 镜像时,Docker 都会将配置文件复制到目标目录。

2.4. 暴露端口

接下来,我们将指示系统公开我们将访问服务器的端口。在我们的例子中,它将是使用 TCP 的 80 端口:

EXPOSE 80/tcp

2.5. 运行 Nginx

现在,我们将在 Docker 镜像启动时运行 Nginx:

CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
  • -g选项指定nginx的指令
  • daemon off指令将禁用**nginx的自守护行为

我们应该注意; 在指令的末尾。不指定它可能会导致意想不到的问题。**

使用最后的命令,我们的整个 Dockerfile 现在看起来像这样:

# Pull the minimal Ubuntu image
FROM ubuntu
# Install Nginx
RUN apt-get -y update && apt-get -y install nginx
# Copy the Nginx config
COPY default /etc/nginx/sites-available/default
# Expose the port for access
EXPOSE 80/tcp
# Run the Nginx server
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

2.6. 建立镜像

现在,我们的 Dockerfile 已准备好进行处理。我们将使用docker命令来构建我们的镜像:

$ docker build . -t haidar/server

让我们分解一下:

  • build从当前目录中的 Dockerfile 创建一个镜像
  • -t给我们的图像一个标签,这样就可以很容易地识别它

一旦我们运行命令,Docker 将依次运行 Dockerfile 中的每个命令。

2.7. 运行映像

一旦我们的图像构建成功,我们将对其进行测试运行。 让我们发出以下命令来运行服务器:

$ docker run -d -p 80:80 haidar/server

让我们分解一下:

  • run子命令指定我们要运行容器
  • -d标志表示我们希望以分离模式运行映像
  • -p选项以local-port:container-port格式表示端口号。在这种情况下,我们将容器中的 80 端口映射到服务器上的 80 端口
  • 最后一个参数nginx指定我们要运行的图像的标签

让我们启动浏览器并检查我们新建的服务器:

/uploads/nginx_docker_container/1.png

3. 使用官方Nginx镜像运行Nginx

大多数 Linux 发行版默认不附带 Nginx。因此,我们需要使用包管理器 安装 Nginx或从其源代码 构建它。

不仅如此,当有新版本发布时,我们还需要维护 Nginx。因此,使用包管理器或从源代码构建 Nginx 可能会成为开销。

出于这个原因,当我们从官方 Nginx 镜像中容器化 Nginx 时,我们减少了维护开销。当 Nginx 的新版本发布时,Docker 容器将被更新或替换。

3.1. 为 Nginx 创建 Docker 容器

*Dockerhub 上提供了官方的 Nginx 镜像,因此我们不必担心为 Nginx 构建自己的镜像。***我们可以简单地拉取图像:

$ docker pull nginx

该命令为我们安装所有必要的组件。此外,该镜像还带有用于运行服务器的预设配置。

3.2. 运行映像

让我们使用 Nginx Docker 容器进行测试运行:

$ docker run -d --name server -p 80:80 nginx

我们在上一节中看到了这些选项。但是,** –name选项用于为容器命名——如果未指定,则为随机名称**。

我们已经完成了。让我们看看我们的 Docker 镜像的状态:

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                               NAMES
816532f135c8   server    "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx