Docker之Dockerfile原理
1、什么是Dockerfile
Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。
通过架构图可以看出通过DockerFile可以直接构建镜像
2、Dockerfile解析过程
3、Dockerfile内容基础知识
1.每条保留字指令都必须为大写,且后面都要跟至少一个参数。2.指令按照从上到下,顺序执行。3.#表示注释。4.每条指令都会创建一个新的镜像层,并对镜像进行提交。
4、Dockerfile的保留命令
官方说明:Dockerfile reference | Docker Documentation
FROM 命令
基于那个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指令出现
语法:
FROM <image>FROM <image>[:<tag>] 使用版本不写为latestFROM <image>[@<digest>] 使用摘要
MAINTAINER 命令
镜像维护者的姓名和邮箱地址[废弃]
语法:
MAINTAINER <name>
RUN 命令
RUN指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步
语法:
RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)RUN echo helloRUN ["executable", "param1", "param2"] (exec form)RUN ["/bin/bash", "-c", "echo hello"]
EXPOSE 命令
用来指定构建的镜像在运行为容器时对外暴露的端口
语法:
EXPOSE 80/tcp 如果没有显示指定则默认暴露都是tcpEXPOSE 80/udp
CMD 命令
用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。
注意: Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。
语法:
CMD ["executable","param1","param2"] (exec form, this is the preferred form)CMD ["param1","param2"] (as default parameters to ENTRYPOINT)CMD command param1 param2 (shell form)
WORKDIR 命令
用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。
语法:
WORKDIR /path/to/workdirWORKDIR /aWORKDIR bWORKDIR c`注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对`
ENV 命令
用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。
语法:
ENV <key> <value>ENV <key>=<value> ...
ADD 命令
用来从context上下文复制新文件、目录或远程文件url,并将它们添加到位于指定路径的映像文件系统中。
语法:
ADD hom* /mydir/ 通配符添加多个文件ADD hom?.txt /mydir/ 通配符添加ADD test.txt relativeDir/ 可以指定相对路径ADD test.txt /absoluteDir/ 也可以指定绝对路径ADD url
COPY 命令
用来将context目录中指定文件复制到镜像的指定目录中
语法:
COPY src destCOPY ["<src>",... "<dest>"]
VOLUME 命令
用来定义容器运行时可以挂在到宿主机的目录
语法:
VOLUME ["/data"]
15.4.11 ENTRYPOINT命令
用来指定容器启动时执行命令和CMD类似
语法:
["executable", "param1", "param2"]ENTRYPOINT command param1 param2
ENTRYPOINT指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。 CMD指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。
Dockerfile构建过程解析
1.Docker从基础镜像运行一个容器2.执行一条命令并对容器进行修改3.执行类似docker commit的操作提交一个新的镜像层4.docker再基于刚提交的镜像运行一个新容器5.执行dockerfile中的下一条指令直到所有指令都执行完毕
小总结
1.从应用软件的角度来看,Dockerfile、docker镜像、docker容器分别代表软件的三个不同阶段 Dockerfile 是软件的原材料 docker镜像 是软件的交付品 docker容器 可以认为是软件的运行状态2.Dockerfile面向开发,docker镜像成为交付标准,docker容器则涉及部署与运维,三者缺一不可,合力充当docker体系的基石。
1.Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、进程服务和内核进程(当应用就进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等2.docker镜像,在用Dockerfile定义一个文件之后,docker build 时会产生一个docker镜像,当运行docker镜像时,会真正开始提供服务3.docker容器,容器是直接提供服务的
Dockerfile案例
Base镜像(scratch):Docker Hub中99%的镜像都是由base镜像中安装和配置需要的软件构建出来的。
自定义镜像myCentos
1. 先了解Docker Hub上的Centos是什么情况。
DockerHub上的centos镜像默认落脚点是/,默认不支持vim。那么现在我们想自定义一个centos,改变其默认落脚点,让其支持vim。
2. 编写Dockerfile
#基于Centos基础镜像构建FROM centos#镜像维护者的姓名和邮箱地址MAINTAINER ZCN<15236674712@163.com>#设置一个变量ENV MYPATH /tmp#设置落脚点WORKDIR $MYPATH#安装vim编辑器RUN yum -y install vim#对外暴露端口号EXPOSE 80#执行指令输出落脚点CMD echo $MYPATH#执行指令输出信息CMD echo "build-------success"#执行指令CMD /bin/bash
3. 构建镜像
$ docker build -f /myDocker/dockerfile -t zcn/mycentos .
4. 运行容器
$ docker run -it -P zcn/mycentos
自定义镜像myTomcat
1. 先创建/mydocekrfile/tomcat这个目录
将tomcat和jdk8的tar包放进此目录下。然后创建一个dockerfile文件。- apache-tomcat-8.5.46.tar.gz- jdk-8u171-linux-x64.tar.gz
2. 编写Dockerfile
FROM centosMAINTAINER ZCN<15236674712@163.com>#把宿主机当前上下文的c.txt拷贝进容器的/usr/local/路径下COPY ./c.txt /usr/local/cincontainer.txt#把tomcat和jdk的tar包拷贝到容器中ADD ./apache-tomcat-9.0.22.tar.gz /usr/local/ADD ./jdk-8u171-linux-x64.tar.gz /usr/local/#安装vim编辑器Run yum -y install vim#设置登录落脚点/usr/localENV MYPATH /usr/local/WORKDIR $MYPATH#配置java和tomcat的环境变量ENV JAVA_HOME /usr/local/jdk1.8.0_171ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin#容器运行时监听的端口EXPOSE 8080#启动时运行tomcat# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.22/bin/startup.sh"]# CMD ["/usr/local/apache-tomcat-9.0.22/bin/catalina.sh","run"]CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
java项目创建镜像 jar包
FROM centosMAINTAINER ZCN<15236674712@163.com>#把宿主机当前上下文的c.txt拷贝进容器的/usr/local/路径下#把jdk的tar包拷贝到容器中ADD ./jdk-8u171-linux-x64.tar.gz /usr/local/#设置登录落脚点/usr/localENV MYPATH /usr/local/WORKDIR $MYPATH#配置java和tomcat的环境变量ENV JAVA_HOME /usr/local/jdk1.8.0_171ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV PATH $PATH:$JAVA_HOME/binCOPY ./yingx_zhangcn184s-0.0.1-SNAPSHOT.jar yingx_zhangcn184s-0.0.1-SNAPSHOT.jarEXPOSE 9292ENTRYPOINT ["java","-jar","./yingx_zhangcn184s-0.0.1-SNAPSHOT.jar"]
3. 构建镜像
$ docker build -t zcn/mytomcat .这里没写-f是因为如果在当前目录下并且file文件名为正统的dockerfile 那么-f可以省略不写。
4. 运行容器
$ docker run -d -p 8888:8080 --name mytomcat -v /zcn/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /zcn/tomcat/logs:/usr/local/apache-tomcat-9.0.22/logs --privileged=true zcn/tomcat
解释:创建数据卷,让容器中的webapps目录中的项目目录和主机中test目录做一个映射
Docker之Dockerfile原理相关推荐
- Docker容器的原理与实践(上)
本文来自网易云社区. 虚拟化 是一种资源管理技术,将计算机的各种资源予以抽象.转换后呈现出来, 打破实体结构间的不可切割的障碍,使用户可以比原本更好的方式来应用这些资源. Hypervisor 一种运 ...
- Docker : Dockerfile 定制镜像
使用 Dockerfile 定制镜像 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们 ...
- Docker 精通之 Dockerfile
Docker 精通系列 Docker 精通之入门 Docker 精通之微服务 Docker 精通之常用命令 Docker 精通之 Dockerfile 1.基本说明 Dockfile 是一个用于编写 ...
- Docker容器---dockerfile简介
Docker容器---dockerfile简介 一.dockerfile概念 1.dockerfile介绍 2.基于dockerfile创建 3.docker镜像加载原理 二.镜像的创建 1.基于现有 ...
- 七、Docker:DockerFile
其他文章: 一.Docker:概述 二.Docker:安装 三.Docker:命令 四.Docker:可视化管理 五.Docker:镜像(image) 六.Docker:数据卷 七.Docker:Do ...
- [docker]七、docker镜像的制作(超详细)、docker镜像结构原理、镜像的分享——harbor
目录 1.镜像(images) 1.1.Dockerfile:是制作镜像的文件 2.镜像结构原理 2.1.base 镜像 2.1.1.rootfs和bootfs 2.1.2.base 镜像提供的是最小 ...
- 图片详解docker命令和原理
10张图带你深入理解Docker容器和镜像 [编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. [Kubernetes ...
- (转)Docker镜像结构原理
以下内容转载自 https://blog.51cto.com/liuleis/2070461 第八篇:Docker镜像结构原理 base 镜像 base 镜像有两层含义: 不依赖其他镜像,从 scra ...
- docker的镜像原理
docker的镜像原理 一.镜像是什么 二.docker镜像加载原理 1.UnionFS(联合文件系统) 2.docker镜像加载原理 三.分层理解 1.分层的镜像 四.commit镜像(分层原理的例 ...
- Docker用Dockerfile定制镜像
用Dockerfile定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那之前提示的无法重复的问题 ...
最新文章
- 为什么说康托尔知道聚宝盆的秘密?
- 在你的代码中使用自定义异常类
- Buuctf(pwn) jarvisoj_tell_me_something 栈溢出
- DELPHI 指针使用用的一篇好文 收藏
- 为您的Office文档加把锁-ADRMS的安装
- ZkServer服务启动的逻辑-NIOServerCnxnFactory.start
- 看我如何作死 | 网络延迟、网络丢包、网络中断一个都没落下过
- 【MFC系列3】永远点不到的按钮
- 机器学习与计算机视觉(sklearn快速上手)
- java.exe 不是有效的win32_WinXP提示不是有效的Win32应用程序怎么办?
- Perceptron实践
- 毕设题目:Matlab心电信号
- Linux设置时间和硬件时间
- WPF UI 框架 收集
- 土方工程量计算表格excel_市政道路土方excel计算表(含公式)
- 基于VC 6.0实现简单的微信打飞机
- Apple自动化利器AppleScript
- 读书笔记10 《蔡康永的说话之道1》 蔡康永
- 海康威视rtsp转rtmp
- 【api】添加了权限管理的一部分
热门文章
- 7-2 单位年会聚餐时的座次C位
- 某医院门诊预约系统/医院预约挂号系统
- 企查查、天眼查、启信宝的产品调研分析
- 2021年N1叉车司机新版试题及N1叉车司机证考试
- 【WiFi】WiFi安全类型
- 阿迪达斯智能运营中心在苏州工业园区开工建设;信达生物任命生物医药科学家刘勇军为集团总裁 | 美通企业日报...
- 暗色调,调出紫红色的暗调晨曦照片效果(转)
- python windows下载哪个_初识Python(windows)——下载、安装、使用
- Echarts的x,y网格线样式
- linux下运行testng,TestNG执行程序