Docker Dockerfile探究

简介: Docker Dockerfile探究

Dockerfile探究
一、镜像层概念
1、通过执行命令显化docker的机制
二、Dockerfile基础命令
1、FROM 基于基准镜像【即构建镜像的时候,依托原有镜像做拓展】
2、LABEL & MAINTAINER -说明信息
3、WORKDIR 设置工作目录
4、ADD & COPY 复制文件
5、ENV 设置环境常量
三、Dockerfile 执行指令【RUN,ENTRYPOINT,CMD】
1、RUN-构建时运行
2、ENTRYPOINT-容器启动时执行
3、CMD-容器启动后执行默认的命令或参数
4、Dockerfile执行指令有两种运行格式
1、 Shell命令格式:Run yum install -y vim
2、 Exec命令格式:RUN ["yum","install","-y","vim"]
5、命令执行差异 演示

适合想了解更多关于Dockerfile 的小伙伴
一、镜像层概念
镜像层由两部分组成:镜像层,容器层
镜像就是静态文件,和安装光盘类似,只有把镜像创建完容器以后,才能正常运行
镜像是只读的,容器创建完之后,所有的读写都是在容器内完成的,且每个容器内的读写都是独立且互不干扰
基于以上了解,展开关于dockerfile的构建过程:

1、设置基准镜像:

FROM tomcat:latest

2、维护的人/机构:

MAINTAINER 机构/人名

3、切换工作目录:

WORKDIR /webapps

4、拷贝镜像到镜像指定目录下:

ADD docker-web ./docker-web
以上四步,每步都会生成一个临时容器,临时容器相当于构建过程中的存档【且临时容器只能用于镜像的构建,不可做其他用途】,生成1个镜像存储,当更新dockerfile内容的时候,会发现已有的内容从缓存获取,新增的内容重新创建,然后旧有的内容 ,即临时的容器ID 会移除出去

体现docker特别重要的特点

第一个机制:按层堆叠;
最底层tomcat容器,后面每一步都会产生临时容器堆叠一起

第二个机制:采用系统快照;
以docker临时容器机制体现,每执行一步,都会产生一个临时容器,对当前状态有一个存档,在创建过程中是可以被重用的,比如前三步如果是一样的,则不需要重新处理,只需要将第四步重新构建,

好处:极大加速镜像构建速度,同时也为系统节约资源,如下:

1、通过执行命令显化docker的机制
1、在image里创建新的目录 mkdir docker_layer

cd docker_layer
1
编辑文件Dockerfile并保存:
vim Dockerfile

以下文件内容: centos是docker官方提供的基准镜像,会在镜像内创建标准的centos容器

FROM centos
RUN["echo",'aaa']
RUN["echo",'bbb']
RUN["echo",'ccc']
RUN["echo",'ddd']
1
2
3
4
5
容器分层,如果没有变化,都是用的已有的,执行构建指令:

docker build -t wq.com/docker_layer:1.0
1
构建过程输出的内容,可以看出每个命令都生成一个临时容器,在本地就可以看到刚才构建的镜像,docker images

2、再次编辑并保存,vim Dockerfile:

RUN["echo",'aaa']
RUN["echo",'bbb']
RUN["echo",'eee']
RUN["echo",'ffff']
1
2
3
4
构建:

docker build -t wq.com/docker_layer:1.0
1
发现前面三步,使用之前的临时镜像作为缓存,从缓存拿来用后面2步是新建的临时容器,然后移除之前的容器ID

镜像内部执行分层的镜像和原理:容器分层的时候,如果命令没有发生变化的步骤,都会使用已有的镜像,只会对发生变化的语句重新处理

二、Dockerfile基础命令
1、FROM 基于基准镜像【即构建镜像的时候,依托原有镜像做拓展】
FROM centos # 制作基准镜像(基于centos:latest)
FROM scratch # 不依赖任何基准镜像base image
FROM tomcat:9.0.22-jdk8-openjdkps:尽量使用官方提供的Base Image
1
2
3
2、LABEL & MAINTAINER -说明信息
MAINTAINER wq.com
LABEL version="1.0"
LABEL description ="testpro"
1
2
3
3、WORKDIR 设置工作目录
WORKDIR /usr/local
WORKDIR /usr/local/newdir #自动创建
1
2
ps:尽量使用绝对路径

4、ADD & COPY 复制文件
ADD absd / #复制到根路径
ADD xxx.tar.gz / # 添加根目录并解压
ADD 除了复制,还具备添加远程文件功能
1
2
3
5、ENV 设置环境常量
ENV JAVA_HOME /usr/local/openjdk8
RUN ${JAVA_HOME}/bin/java -jar test.jar
1
2
ps :尽量使用环境常量,可提高程序维护性

三、Dockerfile 执行指令【RUN,ENTRYPOINT,CMD】

1、RUN-构建时运行
在build构建镜像时执行命令,一旦镜像构建完成,不允许被修改

2、ENTRYPOINT-容器启动时执行
ENTRYPOINT(入口点)用于在容器启动时执行命令
Dockerfile中只有最后一个ENTRYPOINT会被执行
推荐使用EXEC形式:ENTRYPOINT["ps"]

3、CMD-容器启动后执行默认的命令或参数
CMD默认命令:
CMD用于设置默认执行的命令
如Dockerfile中出现多个CMD,则只有最后一个被执行,如容器启动时附加指令,则CMD被忽略
推荐使用EXEC格式:CMD["ps","ef"]

4、Dockerfile执行指令有两种运行格式
linux底层有2种运行方式,所以Dockerfile有两种执行方式:

1、 Shell命令格式:Run yum install -y vim
Shell运行方式:实用Shell执行时,当前shell是父进程,生成一个子shell进程在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。

2、 Exec命令格式:RUN ["yum","install","-y","vim"]
Exec运行方式:使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变执行完毕直接退出,并不会退回之前的进程环境

综合应用,官方推荐使用Exec执行命令格式 。

5、命令执行差异 演示
进入到image文件夹,

mkdir docker_run
cd docker_run
vim Dockerfile
1
2
3
编辑并保存内容:

FROM centos
RUN ["echo","image building !!!"]
CMD ["echo","containner starting!!!"]
1
2
3
进行构建:

docker build -t wq.com/docker_run .
1
启动容器:

docker run wq.com/docker_run
1
执行构建和启动容器命令后,可以看出来,cmd命令是默认启动容器会执行
启动容器:

docker run wq.com/docker_run ls
1
修改dockerfile内容:

FROM centos
RUN ["echo","image building !!!"]
ENTRYPOINT ["echo","containner starting!!!"]
1
2
3
保存后,重新构建:

docker build -t wq.com/docker_run .
1
重启:docker run wq.com/docker_run 与上面输出内容无差异

修改dockerfile内容:

FROM centos
RUN ["echo","image building !!!"]
ENTRYPOINT ["ps"]
CMD ["-ef"]
1
2
3
4
保存后,重新构建:

docker build -t wq.com/docker_run .
1
重启:docker run wq.com/docker_run 与上面输出内容无差异
这样写的好处是cmd可以从外部传参:
重启:docker run wq.com/docker_run -aux
输出内容更加完整
————————————————
版权声明:本文为CSDN博主「甜可儿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_17033579/article/details/133313426

目录
相关文章
|
10天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
164 75
|
2月前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
1107 12
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
1月前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
58 9
|
2月前
|
应用服务中间件 PHP nginx
Docker-compose 编排lnmp(dockerfile) 完成Wordpress
通过使用Docker Compose,我们可以轻松编排LNMP环境并部署WordPress。本文详细介绍了各组件的Dockerfile和配置文件编写,并通过docker-compose.yml文件实现了整个环境的自动化部署。这种方法不仅简化了部署过程,还提高了环境的可移植性和一致性。希望本文能帮助你更好地理解和使用Docker Compose来管理和部署复杂的应用程序。
122 3
|
3月前
|
Docker 容器
docker中使用Dockerfile自动创建数据卷
【10月更文挑战第12天】
37 5
|
3月前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
77 4
|
4月前
|
应用服务中间件 nginx Docker
Docker镜像-基于DockerFile制作编译版nginx镜像
这篇文章介绍了如何基于Dockerfile制作一个编译版的nginx镜像,并提供了详细的步骤和命令。
597 17
Docker镜像-基于DockerFile制作编译版nginx镜像
|
4月前
|
应用服务中间件 Linux nginx
Docker镜像-基于DockerFile制作yum版nginx镜像
本文介绍了如何使用Dockerfile制作一个基于CentOS 7.6.1810的yum版nginx镜像,并提供了详细的步骤和命令。
184 20
|
4月前
|
Docker 容器
7-13|docker build -t image-name:tag path/to/Dockerfile 这个命令具体什么意思
7-13|docker build -t image-name:tag path/to/Dockerfile 这个命令具体什么意思
|
5月前
|
Docker 容器
在Docker中,Dockerfile有哪些常见指令?
在Docker中,Dockerfile有哪些常见指令?

热门文章

最新文章