实战通过Dockerfile 创建 Nginx 镜像的完整过程

关于使用 Dockerfile 创建 Nginx 镜像的完整教程,并提到了 Dockerfile 的基本写法和一些关键指令,尤其是如何让服务在容器启动时正常运行的重点。以下是对整个内容的梳理和总结:


1. 为什么学习 Dockerfile

  • Dockerfile 是构建镜像的重要工具,通过编写 Dockerfile,可以将公司内部项目打包成镜像,供 Kubernetes(K8S)等工具使用。
  • 在 Kubernetes 部署 Pod 时,镜像是必要的,因此学习如何使用 Dockerfile 是第一步。

2. 创建 Nginx 镜像的步骤

准备工作

  1. 登录到 Docker 机器:

    • 确保你的环境中已经装好了 Docker,并且可以正常使用。
  2. 创建所需的目录和文件:

    • 创建一个专门用于存放 Dockerfile 的目录,例如:
      mkdir /root/dkts/ubuntu3 -p
      cd /root/dkts/ubuntu3/
    • 在该目录下创建 Dockerfile 文件和一个静态 HTML 文件(index.html)。

3. 编写 Dockerfile

以下是 Nginx 镜像所需的 Dockerfile 示例:

# 1. 使用基础镜像
FROM ubuntu:22.04
# 2. 添加镜像的维护者信息
LABEL maintainer="cntf@qq.com"
# 3. 安装 Nginx 和所需软件
RUN apt-get update && apt-get install -y wget nginx
# 4. 复制静态页面到 Nginx 默认目录
COPY index.html /var/www/html/
# 5. 暴露容器的 80 端口
EXPOSE 80
# 6. 指定容器启动时执行的命令,让 Nginx 前台运行
CMD ["nginx", "-g", "daemon off;"]

4. 编写静态页面

在与 Dockerfile 同目录下,创建一个 index.html 文件,作为 Nginx 的首页内容:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome</title>
</head>
<body>
<h1>Hello, there :
VI ,this is ubuntu test3</h1>
<p>This is a test page created with Dockerfile.</p>
</body>
</html>

5. 构建镜像

使用以下命令构建镜像:

docker build -t cntf-nginx:v1 .
  • 命令解析:
    • docker build:构建镜像。
    • -t cntf-nginx:v1:为镜像指定名称和版本号。
    • .:指定当前目录为上下文路径(含 Dockerfile 和 index.html)。

注意:

  • 构建过程中,Docker 会读取 Dockerfile 并按照指令逐步创建镜像。
  • 如果 COPY 等指令出错,确保文件路径正确,尤其是 index.html 需要位于当前目录。

6. 查看生成的镜像

构建完成后,可以使用以下命令查看镜像:

docker images
  • 输出示例:
    REPOSITORY TAG IMAGE ID CREATED SIZE
    cntf-nginx v1 65d0a69cb54f 15 seconds ago 195MB

7. 启动容器

使用刚刚构建好的镜像启动容器:

docker run -d -p 8080:80 --name nginx-container cntf-nginx:v1
  • 参数解析:
    • -d:让容器在后台运行。
    • -p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口。
    • --name nginx-container:为容器命名。
    • cntf-nginx:v1:使用刚刚构建的镜像启动容器。

测试验证过程:

image
image

8. 验证服务是否正常运行

  1. 查看容器运行状态:

    docker ps

    确认容器是否处于 Up 状态。

  2. 通过浏览器访问:

    • 打开浏览器,访问 http://<宿主机IP>:8080
    • 你应该能看到之前写在 index.html 中的内容,例如:
      Hello, there :
      VI ,this is ubuntu test3

9. 重要的 Dockerfile 指令说明

FROM

  • 指定要使用的基础镜像。
  • 示例:FROM ubuntu:22.04

LABEL

  • 添加镜像的元信息(例如作者、版本等)。
  • 示例:LABEL maintainer="cntf@qq.com"

RUN

  • 在镜像构建时运行命令。
  • 示例:RUN apt-get update && apt-get install -y wget nginx

COPY

  • 将本地文件复制到镜像。
  • 示例:COPY index.html /var/www/html/

EXPOSE

  • 声明容器的端口。
  • 示例:EXPOSE 80

CMD

  • 指定容器启动时执行的命令。
  • 示例:CMD ["nginx", "-g", "daemon off;"]
  • 这里的 daemon off; 是关键,表示让 Nginx 以前台方式运行,否则容器会自动退出。

10. 常见问题和注意事项

  1. 容器启动后 Nginx 没有运行?

    • 原因:CMD 未正确配置,导致容器内服务没有前台运行。
    • 解决:在 Dockerfile 中添加 CMD ["nginx", "-g", "daemon off;"]
  2. 文件路径问题:

    • COPYADD 指令中的文件路径必须相对于 Dockerfile 所在目录。
    • 解决:确保所有需要的文件与 Dockerfile 位于同一目录。
  3. 端口映射问题:

    • 如果未正确映射端口,外部无法访问容器内服务。
    • 解决:运行容器时使用 -p 参数映射端口,例如 -p 8080:80
  4. 镜像体积过大?

    • 使用较小的基础镜像,例如 alpine
    • 示例:
      FROM nginx:alpine

posted @   皇帽讲绿帽带法技巧  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示