实战通过Dockerfile 创建 Nginx 镜像的完整过程
关于使用 Dockerfile 创建 Nginx 镜像的完整教程,并提到了 Dockerfile 的基本写法和一些关键指令,尤其是如何让服务在容器启动时正常运行的重点。以下是对整个内容的梳理和总结:
1. 为什么学习 Dockerfile
- Dockerfile 是构建镜像的重要工具,通过编写 Dockerfile,可以将公司内部项目打包成镜像,供 Kubernetes(K8S)等工具使用。
- 在 Kubernetes 部署 Pod 时,镜像是必要的,因此学习如何使用 Dockerfile 是第一步。
2. 创建 Nginx 镜像的步骤
准备工作
-
登录到 Docker 机器:
- 确保你的环境中已经装好了 Docker,并且可以正常使用。
-
创建所需的目录和文件:
- 创建一个专门用于存放 Dockerfile 的目录,例如:
mkdir /root/dkts/ubuntu3 -p cd /root/dkts/ubuntu3/ - 在该目录下创建
Dockerfile
文件和一个静态 HTML 文件(index.html
)。
- 创建一个专门用于存放 Dockerfile 的目录,例如:
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
:使用刚刚构建的镜像启动容器。
测试验证过程:
8. 验证服务是否正常运行
-
查看容器运行状态:
docker ps 确认容器是否处于
Up
状态。 -
通过浏览器访问:
- 打开浏览器,访问
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. 常见问题和注意事项
-
容器启动后 Nginx 没有运行?
- 原因:
CMD
未正确配置,导致容器内服务没有前台运行。 - 解决:在 Dockerfile 中添加
CMD ["nginx", "-g", "daemon off;"]
。
- 原因:
-
文件路径问题:
COPY
或ADD
指令中的文件路径必须相对于Dockerfile
所在目录。- 解决:确保所有需要的文件与
Dockerfile
位于同一目录。
-
端口映射问题:
- 如果未正确映射端口,外部无法访问容器内服务。
- 解决:运行容器时使用
-p
参数映射端口,例如-p 8080:80
。
-
镜像体积过大?
- 使用较小的基础镜像,例如
alpine
。 - 示例:
FROM nginx:alpine
- 使用较小的基础镜像,例如
迷茫的人生,需要不断努力,才能看清远方模糊的志向!
标签:
k8s
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?