在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指定我们要运行的图像的标签
让我们启动浏览器并检查我们新建的服务器:
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