dockerfile构建镜像详细解释与应用

简介: Dockerfile 是一种可被 Docker 程序解释的脚本,用于定义如何构建容器镜像。它通过一系列指令指定镜像的配置和定制需求,支持自动化构建,简化开发、测试和部署流程。

一 dockerfile

1.dockerfile介绍

Dockerfile是一种能够被Docker程序解释的脚本,
Dockerfile由一条一条的指令组成,并且有自己的书写格式和支持的命令
当需要在容器镜像中指定自己额外的需求时,只需在Dockerfile上添加或修改指令,
然后通过docker build生成我们自定义的容器镜像。

为什么使用dockefile

简单来说就是从网上下载下来的镜像可能不满足我们实际生产的需要,这时我们就可以利用dockerfile来自己构建一个新的镜像,并且在自动化部署的时候也需要用到dockerfile来创建新的镜像来满足需求。

详细解释
1.声明式语法:Dockerfile使用声明式语法描述镜像的构建过程,而不是编写脚本或命令。

2.层次化结构:Dockerfile的指令按照顺序逐步执行,每个指令都会在前一个指令的基础上创建一个新的镜像层,这种分层结构使得镜像的构建和重用更为高效。

3.可读性:Dockerfile采用人类可读的文本格式,易于理解和维护,使得团队协作和版本控制更加便捷。

4.自动构建:通过Dockerfile,可以实现自动化构建过程,从而简化了软件开发、测试和部署的流程。

5.缓存机制:Docker在构建镜像时会利用缓存,如果某个指令的内容未发生改变,则可以直接使用之前构建好的镜像层,从而提高构建速度。

6.可重用性:Dockerfile定义了镜像的构建步骤,可以被多个项目和团队共享和重复使用,提高了开发效率。

7.轻量级:Dockerfile定义的镜像通常是轻量级的,只包含了应用程序及其运行时所需的依赖,因此具有较小的镜像体积,有助于加速镜像的传输和部署。

dockerfile指令

(1) 构建类指令:
用于构建image
其指定的操作不会运行在image的容器上执行
如:FROM、MAINTAINER、RUN、ENV、ADD、COPY

(2) 设置类指令:
用于设置image的属性
其指定的操作将运行image的容器中执行
如:CMD、ENTRYPOINT、USER、EXPOSE、WORKDIR、VOLUME

对应的指令说明如下:
FROM 构建新镜像基于的基础镜像
RUN 构建镜像时运行的Shell命令
COPY 拷贝文件或目录到镜像中
ADD 拷贝文件或目录到镜像中,可以解压压缩包并拷贝
ENV 设置环境变量
USER 为RUN、CMD和ENTRYPOINT执行命令指定运行用户(程序用户)
EXPOSE 声明容器运行的服务端口(容器内打开的端口)
WORKDIR 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工作目录(同cd)
CMD 运行容器时默认执行,如果有多个CMD指令,最后一个生效
ENTRYPOINT 与CMD类似,容器运行时强制执行

指令详细解释
当编写Dockerfile时,常用的命令有以下几种:

FROM:
用途:指定基础镜像,当前镜像是基于哪个镜像构建的。
语法:FROM [:] [AS ]
示例:FROM ubuntu:20.04

RUN:
用途:在镜像中执行命令,通常用于安装软件包、更新系统、设置环境等。
语法:RUN
示例:RUN apt-get update && apt-get install -y curl

COPY:
用途:将文件从主机复制到镜像中。
语法:COPY
示例:COPY ./app /app

ADD:
用途:类似于COPY,但功能更强大,支持从URL下载文件、解压缩等功能。
语法:ADD
示例:ADD https://example.com/file.tar.gz /

ENV:
用途:设置环境变量,可以在后续的命令中使用。
语法:ENV
示例:ENV NODE_ENV production

USER:
用途:设置运行时的用户身份。
语法:USER [:]
示例:USER appuser

EXPOSE:
用途:声明容器运行时监听的端口,但并不会实际打开或映射该端口。
语法:EXPOSE
示例:EXPOSE 8080

WORKDIR:
用途:设置工作目录,后续的命令都将在这个目录下执行。
语法:WORKDIR
示例:WORKDIR /app

CMD:
用途:设置容器启动时要执行的默认命令,可以被docker run命令中的参数覆盖。
语法:CMD ["executable","param1","param2"] 或 CMD command param1 param2
示例:CMD ["npm", "start"]

ENTRYPOINT:
用途:设置容器启动时要执行的默认命令,与CMD不同的是,ENTRYPOINT指定的命令不会被docker run命令中的参数覆盖,而是作为参数传递给ENTRYPOINT。
语法:ENTRYPOINT ["executable","param1","param2"] 或 ENTRYPOINT command param1 param2
示例:ENTRYPOINT ["echo", "Hello, World!"]

应用(利用centos7镜像通过dockerfile创建一个nginx镜像)

实验环境

centos7.9
已安装docker-ce-20.10.20
防火墙,沙盒关闭,开启路由转发
主机名 vm1
ip 192.168.10.11

实验步骤

第一步:下载基础镜像
第二步:创建一个文件夹(目录)
第三步:在文件夹(目录)中创建Dockerfile文件及其它文件
第四步:使用docker build命令构建镜像
第五步:使用构建的镜像启动容器

1.下载基础镜像

由于dockerfile需要利用基础镜像来构建,所以我们需要先下载基础镜像

docker pull centos:7

2.创建一个目录

mkdir /nginxdir
cd /nginxdir/

3.在目录种创建Dockerfile文件及其他文件

先创建nginx测试文件

echo "nginx is running" >> /nginxdir/index.html

再创建dockerfile文件
vim Dockerfile

FROM centos:7
MAINTAINER "123" #维护者信息
RUN yum -y install wget #下载wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #下载阿里云仓库文件
RUN yum -y install nginx  #下载nginx
ADD index.html /usr/share/nginx/html/ #将indexhtml传到容器内 
RUN echo "daemon off;" >> /etc/nginx/nginx.conf       #关闭nginx守护进程模式
EXPOSE 80                                                                     
CMD /usr/sbin/nginx                                                         #运行容器时,保持前台运行nginx

4.生成镜像:

格式:docker build -t 新镜像名:标签 .

docker build -t nginx:v1 .

报错解决
原因
没有开启路由转发
开启路由转发就好了

echo "net.ipv4.ip_forward=1 " >> /etc/sysctl.conf 
sysctl -p

查看镜像

docker images

可以看到创建好的镜像

5.使用构建的镜像启动容器

docker run -d -p 80:80 nginx:v1

curl查看
curl 192.168.10.11

实验完成

相关文章
|
Kubernetes Linux Windows
第二章 Linux和windows部署helm 客户端
第二章 Linux和windows部署helm 客户端
626 0
Element Plus 日期选择器 获取选中的日期的格式(当前日期/时间戳格式)
Element Plus 日期选择器 获取选中的日期的格式(当前日期/时间戳格式)
1838 0
|
前端开发 Java API
利用 Spring WebFlux 技术打造高效非阻塞 API 的完整开发方案与实践技巧
本文介绍了如何使用Spring WebFlux构建高效、可扩展的非阻塞API,涵盖响应式编程核心概念、技术方案设计及具体实现示例,适用于高并发场景下的API开发。
841 0
|
Java Linux Docker
Docker
本文介绍了Docker的基础知识和使用方法,包括镜像打包、容器操作、Dockerfile编写及自定义构建镜像等内容。通过实际案例演示了如何将Java项目打包为JAR文件,并创建Docker镜像运行容器,最终验证服务运行状态。适合初学者快速掌握Docker核心技能。
796 2
Docker
|
开发者 Python 设计模式
用 Python 轻松创建图形界面:Tkinter 入门指南
用几行Python代码就能创建桌面小工具?没错!tkinter是Python内置的GUI库,无需安装,跨平台支持。从窗口、按钮到弹窗,轻松实现图形界面交互,适合新手快速上手,打造专属小工具。#Python #tkinter
1486 0
|
Java API Spring
Spring Boot中的API版本控制
Spring Boot中的API版本控制
|
安全 测试技术 开发工具
Git协作方案
本文介绍了基于特性分支的Git规范与工作流,涵盖分支管理、开发流程、提交规范及常见问题处理,助力团队高效协作与代码管控。
862 0
|
监控 数据可视化 测试技术
如何优雅地处理 API 版本控制?
API 版本控制是确保 API 升级不影响现有用户的关键。通过管理多个版本,开发者可以推出新功能或修复问题,同时保留旧版本以常见的版本控制方式包括 URL 路径、查询参数和请求头版本控制。优雅处理版本控制需要提前规划、清晰传达变更信息、提供升级指南,并监控版本使用情况。工具如 [APIPost](https://www.apipost.cn) 可助你轻松跟踪版本差异、管理标签并提升团队协作效率。掌握 API 版本控制,结合专业工具,让 API 开发更高效便捷。

热门文章

最新文章