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

news/2025/2/11 14:13:47/文章来源:https://www.cnblogs.com/autopwn/p/18709643

关于使用 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 install -y wget nginx# 4. 复制静态页面到 Nginx 默认目录
COPY index.html /usr/share/nginx/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 xianchao-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        123456789abc   5 seconds ago   180MB
    

7. 启动容器

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

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

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 install -y wget nginx

COPY

  • 将本地文件复制到镜像。
  • 示例:COPY index.html /usr/share/nginx/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
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/882076.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

50N06-ASEMI吹风筒专用MOS管50N06

50N06-ASEMI吹风筒专用MOS管50N06编辑:ll 50N06-ASEMI吹风筒专用MOS管50N06 型号:50N06 品牌:ASEMI 封装:TO-252 最大漏源电流:50A 漏源击穿电压:60V 批号:最新 RDS(ON)Max:15mΩ 引脚数量:3 沟道类型:N沟道MOS管 芯片尺寸:MIL 漏电流: 恢复时间:ns 芯片材质: …

瑞芯微开发板/主板Android调试串口配置为普通串口方法

本文介绍瑞芯微开发板/主板Android调试串口配置为普通串口方法,不同板型找到对应文件修改,修改的方法相通。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。…

Ubuntu22.04 搭建离线APT源(apt-mirror)

1、应用场景 目前需要在Linux环境下做UE开发,Ubuntu版本使用的是22.04。项目现场是没法连到外网的,所以安装库十分不方便,所以需要搭建一套内网的离线APT源。 2、搭建步骤 2.1 资源拉取 首先需要在联网机器上将资源拉取到本地。 本教程使用使用apt-mirror拉取镜像源,使用ng…

013 Promise对象_Ajax实操

Promise封装Ajax,让网络请求的异步操作变得更简单<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><titl…

题解:P7213 [JOISC2020] 最古の遺跡 3

两种思考方式:值域维度:从原始高度大往小插入柱子,不确定右边是否有最终高度等于它的柱子,并不好记录状态。下标维度:从后往前扫描,注意到前面的对后面的后效性很小,此时不难设出一个基础的状压 DP 方程。为了避免记录后方柱子初始高度出现情况(相同初始高度有且仅有 \…

【车道线检测项目实战】

1-车道数据与标签解读 1.1数据集链接 原项目共使用两个数据集这里出于学习便捷考虑,只使用CULane的部分数据集进行训练 数据集目录1.2 list目录其中list目录下都是文件的路径1.3 frame目录 frame目录下都是视频的节帧 1.4 lable目录 lable目录下都是车道线的信息,肉眼看不出来…

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-12- iframe操作-上篇(详细教程)

1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了。但是还是有小伙伴或者童鞋们私下问这个问题,那么宏哥就单独写一篇关于iframe网页处理的文章。ifram…

CH585 CH584 CH592 BLE设备的VID和PID

在 BLE(蓝牙低功耗)设备中,PID(Product ID,产品标识符)和 VID(Vendor ID,厂商标识符)有着重要作用,以下为你详细介绍: 区分不同设备与厂商VID 的作用:VID 是由相关管理机构分配给设备制造商的唯一标识符,用于明确设备的生产厂商。例如,像苹果、三星、英特尔等众多…

streamlit入门笔记【1】环境搭建

1. 背景 24年底交代了一个产品排行榜的工作,其实就是把开发测试等各项指标排序,指标获取和存储部分可以用requests和selenium以及xlsx、json分析等完成,展示部分使用了streamlit框架,可以把数据直接运行成简单的web app。本系列笔记将streamlit应用部分做个总结。 2. 环境搭…

012 Promise对象

1、基本概念Promise是异步编程的一种解决方案,比传统的解决方案一一回调函数和事件一一更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言便准,统一了用法,原生提供Promise对象所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步…

CoAT: 基于蒙特卡洛树搜索和关联记忆的大模型推理能力优化框架

研究者提出了一种新的关联思维链(Chain-of-Associated-Thoughts, CoAT)方法,该方法通过整合蒙特卡洛树搜索(Monte Carlo Tree Search, MCTS)和关联记忆机制来提升大语言模型(LLMs)的推理能力。区别于传统的单步推理方法,CoAT致力于增强LLM的结构化推理能力和自适应优化能力,…

DM SQL关联列 like 优化案例

1.1、sql优化背景达梦一哥们找我优化条SQL,反馈在DM8数据库执行时间很慢出不来结果, 监控工具显示这条SQL的执行时间需要20多万毫秒,安排。1.2、慢sql和执行时间 select a.col1 as d_id, a.col2 as s_id, a.col3 as bm, a.col4, a.col5, (select b.col1 from table2 b where…