Skip to content

构建一个 Web 服务器 Dockerfile

Docker - 构建一个 Web 服务器 Dockerfile

Section titled “Docker - 构建一个 Web 服务器 Dockerfile”

我们已经学习了如何使用现有镜像。现在,让我们使用 Dockerfile 构建自己的定制镜像。我们将创建一个基于 Ubuntu 并安装了 Apache 的简单 Web 服务器镜像。

步骤 1:在一个新的、空目录中创建一个名为 Dockerfile 的文件(区分大小写,无扩展名)。使用文本编辑器添加以下内容:

# 使用官方 Ubuntu 基础镜像(指定版本以确保可重复性)
FROM ubuntu:22.04
# 设置标签(可选,良好实践)
LABEL maintainer="Your Name <your.email@example.com>"
LABEL description="Simple Apache web server based on Ubuntu"
# 更新软件包列表,安装 Apache,并在一个层中清理
# 使用非交互模式避免构建期间的提示
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y apache2 apache2-utils && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 暴露端口 80(Apache 监听的标准 HTTP 端口)
EXPOSE 80
# 容器启动时运行的命令
# 在前台运行 Apache,这对于 Docker 是必需的
CMD ["apache2ctl", "-D", "FOREGROUND"]

关于此 Dockerfile 的关键点:

  • FROM ubuntu:22.04:指定基础镜像。使用 22.04 这样的特定标签比 latest 更有利于构建的一致性。
  • LABEL:提供关于镜像的元数据(取代了已废弃的 MAINTAINER)。
  • RUN:在镜像构建过程中执行命令。我们使用 && \ 链接命令以最小化镜像层,并清理 apt 缓存(apt-get clean、rm -rf ...)以减小镜像大小。
  • DEBIAN_FRONTEND=noninteractive:防止在软件包安装过程中出现交互式提示。
  • EXPOSE 80:表明容器在端口 80 上监听。它实际上不发布端口;这通过 docker run -p 完成。
  • CMD:指定从此镜像启动容器时要运行的默认命令。apache2ctl -D FOREGROUND 通过在前台运行 Apache 来保持容器运行。

步骤 2:打开终端,导航到包含 Dockerfile 的目录,然后运行 docker build 命令:

# 构建镜像并将其标记为 'my-apache-server:1.0'
docker build -t my-apache-server:1.0 .
  • -t my-apache-server:1.0:用名称(my-apache-server)和版本标签(1.0)标记镜像。这使得引用变得容易。
  • .:指定构建上下文(当前目录),Docker 在其中查找 Dockerfile 以及 COPY 或 ADD 指令所需的任何文件(此处未使用)。

Docker 将逐步执行 Dockerfile 中的指令,如有必要会下载基础镜像,运行命令,并创建层。您会看到每个步骤的输出。成功完成后,您将拥有一个名为 my-apache-server:1.0 的新镜像。

您可以使用以下命令验证镜像是否存在:

docker images

步骤 3:现在,从您新构建的镜像运行一个容器:

# 以分离模式 (-d) 运行容器,并将主机端口 8080 映射到容器端口 80 (-p)
docker run -d -p 8080:80 --name my-running-webserver my-apache-server:1.0
  • -d:以分离模式(在后台)运行容器。
  • -p 8080:80:将主机上的端口 8080 映射到容器内部的端口 80(Apache 在此监听)。
  • --name my-running-webserver:为容器指定一个名称,以便更轻松地管理。
  • my-apache-server:1.0:要运行的镜像。

要测试它,打开 Web 浏览器并导航到 http://localhost:8080(如果 Docker 未在本地运行,则为 http://<your-docker-host-ip>:8080)。您应该会看到默认的 Apache Ubuntu 页面,这确认了您的定制 Web 服务器容器正在运行!