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

实验完成

相关文章
|
6月前
|
Ubuntu Docker 容器
深入理解Dockerfile:构建镜像的详细解释与常用命令(下)
Docker 是一种流行的容器化平台,可将应用程序和其依赖项打包到一个独立的、可移植的容器中。Dockerfile 是构建 Docker 镜像的文本文件,它包含了一系列的指令和配置,用于定义镜像的构建过程。本文将深入解释 Dockerfile 的工作原理,并介绍常用的 Dockerfile 指令和构建命令,以帮助读者更好地理解和使用 Docker。
166 0
|
Linux Docker 容器
Docker中Dockerfile的构建过程
本章主要对Docker中自定义镜像的一种方式,docker进行简单的介绍。
140 1
Docker中Dockerfile的构建过程
|
Java Linux 程序员
maven构建docker镜像三部曲之二:编码和构建镜像
用docker-maven-plugin插件来构建本地的docker镜像
870 0
maven构建docker镜像三部曲之二:编码和构建镜像
|
6月前
|
Java 持续交付 Docker
Docker 项目如何使用 Dockerfile 构建镜像?
Docker 简介:讲述 Docker 的起源、它是如何革新现代软件开发的,以及它为开发者和运维团队带来的好处。重点强调 Docker 的轻量级特性和它在提高应用部署、扩展和隔离方面的优势。
176 0
|
1月前
|
运维 Docker 容器
|
6月前
|
应用服务中间件 Shell nginx
制作docker镜像的dockerfile编写规则汇总
制作docker镜像的dockerfile编写规则汇总
109 0
|
6月前
|
Java 网络安全 开发者
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
105 0
|
6月前
|
应用服务中间件 nginx Docker
深入理解Dockerfile:构建镜像的详细解释与常用命令(上)
Docker 是一种流行的容器化平台,可将应用程序和其依赖项打包到一个独立的、可移植的容器中。Dockerfile 是构建 Docker 镜像的文本文件,它包含了一系列的指令和配置,用于定义镜像的构建过程。本文将深入解释 Dockerfile 的工作原理,并介绍常用的 Dockerfile 指令和构建命令,以帮助读者更好地理解和使用 Docker。
1725 0
|
6月前
|
缓存 Ubuntu JavaScript
Docker自定义镜像-构建镜像-Dockerfile语法
Docker自定义镜像-构建镜像-Dockerfile语法
106 0
|
运维 Cloud Native 网络协议
【云原生】Docker—Dockerfile写法与用法以及dockerfile简介与构建镜像详解【附加实战】
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令(Instruction)和操作命令;每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建(也就是你要执行的操作命令)。
519 0
【云原生】Docker—Dockerfile写法与用法以及dockerfile简介与构建镜像详解【附加实战】