首页 > 其他分享 >Dockerfile讲解

Dockerfile讲解

时间:2023-11-27 22:02:48浏览次数:28  
标签:容器 RUN CMD 指令 讲解 镜像 docker Dockerfile

(Dockerfile)

dockerfile是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。 dockerfile定义了进程需要的一切东西,涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等; image.png 官网:https://docs.docker.com/engine/reference/builder/

UnionFS(联合文件系统): Unin文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a sindle virtual flesystem)。 Union文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

1. 构建过程解析

构建三步骤:

  1. 编写dockerfile文件
  2. docker build命令构建镜像
  3. docker run依镜像运行容器实例

基础知识:

  1. 每条保留字指令都必须为大写字母且后面要跟随至少一个参数

image.png 像图中这种ADD,ENV,COPY等就叫保留字指令

  1. 指令按照从上到下,顺序执行
  2. #表示注释
  3. 每条指令都会创建一个新的镜像层并对镜像进行提交

docker 执行 dockerfile 的大致流程:

  1. docker从基础镜像运行一个容器
  2. 执行一条指令修改容器
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令执行完成
  • docker commit 提交容器副本使之成为一个新的镜像:docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

使用dockerfile构建docker镜像,再用镜像生成容器

2. Dockerfile常用保留字指令

参考tomcat8的Dockerfile入门 https://github.com/docker-library/tomcat/blob/master/9.0/jdk8/corretto-al2/Dockerfile image.png

  1. FROM

基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from 如. image.png

  1. MAINTAINER

镜像维护者的姓名和邮箱地址

  1. RUN

容器构建时需要运行的命令,在 docker build时运行 有两种格式:

  • shell格式

RUN <命令行命令> 命令行命令等同于在终端操作的shell命令

例: RUN yum -y install vim

  • exec格式

RUN ["可执行文件",“参数1","参数2"]

例:RUN ["./test.php","dev","offline"] ,等价于 RUN ./test.php dev offline

如. image.png

  1. EXPOSE

当前容器对外暴露出的端口

  1. WORKDIR

指定在创建容器后,终端默认登录进来的工作目录,一个落脚点 image.png 如上图这个/,就是默认的工作目录 如. image.png

  1. USER

指定该镜像以什么样的用户去执行,如果都不指定,默认是root

  1. ENV

用来在构建镜像过程中设置环境变量

ENV MY_PATH /usr/mytest 这个环境变量可以在后续的任何RUN指令中使用,如同在命令前指定了环境变量前缀一样,也可以在其他指令中直接使用这些环境变量

例:WORKDIR $MY_PATH 指定了登录后的默认工作目录为/usr/mytest

如. image.png

  1. VOLUME

容器数据卷,用于数据保存和持久化工作

  1. ADD

将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包 相比于COPY命令多了个解压功能

  1. CMD

指定容器启动后的要干的事情,与RUN的区别是CMD时在docker run时运行 CMD指令的格式和RUN相似,也是两种格式:

  • shell格式:CMD <命令>
  • exec格式:CMD ["可执行文件",“参数1","参数2" ...]
  • 参数列表模式:CMD [“参数1","参数2" ...] 在指定了ENTRYPOINT指令后,用CMD指定具体的参数

Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

如. image.png

  1. ENTRYPOINT

格式:ENTRYPOINT ["<executeable>","<param1>","<param2>",.....]

也是用来指定一个容器启动时要运行的命令 类似于CMD指令,但是ENTRYPOINT不会被docker run 后面的命令覆盖,而且这些命令行参数会被当作参数送给ENTRYPOINT指令指定的程序

ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。 当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令,他两个组合会变成"<ENTRYPOINT>"<CMD>" image.png

3. 案例

3.1. 自定义镜像mycentosjava8

centos7镜像具备vim+ifconfig+jdk8

  1. 创建文件夹myfile,将jdk压缩包传到当前目录下

jdk压缩包要与Dockerfile文件在同一目录下 image.png

  1. 创建Dockerfile文件,编辑内容]

Dockerfile文件中的D一定是大写

FROM centos:7
MAINTAINER xha<[email protected]>

ENV MYPATH /usr/local
WORKDIR $MYPATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u341-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u341-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_341
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
  1. 构建镜像

最后有一个点别忘了

docker build -t centosjava8:1.0 .

构建完成: image.png 查看创建的镜像: image.png

  1. 运行镜像
docker run -it 镜像ID /bin/bash

image.png

3.2. 虚悬镜像

仓库名和版本号都为none的就是虚悬镜像 image.png 查看所有的虚悬镜像

docker image ls -f dangling=true

删除所有虚悬镜像

docker image prune

image.png

4. Docker微服务实战

  1. 新建一个普通微服务模块

端口为6001,只有一些简单的接口 image.png 本机测试没问题 image.png 打包并把他放进虚拟机目录里 image.png

  1. 通过dockerfile发布微服务部署到docker容器

编写Dockerfile文件:

# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER zy
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zy_docker.jar
ADD docker_test-0.0.1-SNAPSHOT.jar zy_docker.jar
# 运行jar包
RUN bash -c 'touch /zy_docker.jar'
ENTRYPOINT ["java","-jar","/zy_docker.jar"]
# 暴露6001端口
EXPOSE 6001

构建: 别忘了最后的点

docker build -t zy_docker:1.1 .

image.png image.png

运行容器:

docker run -d -p 6001:6001 661bf8447553

image.png

测试: image.png

标签:容器,RUN,CMD,指令,讲解,镜像,docker,Dockerfile
From: https://blog.51cto.com/u_16277539/8588767

相关文章

  • 迁移备份、Dockerfile、docker私有仓库
    迁移备份#镜像从哪来的?1dockerpull拉的2通过容器打包成镜像3Dockerfile构建#容器保存为镜像-运行一个centos容器dockerrun-id--namecentos_vimcentos:7-在容器中装vimdockerexec-ita6e240/bin/bashyumins......
  • C语言调用C++类成员函数讲解和实例
    原文:https://blog.csdn.net/LxXlc468hW35lZn5/article/details/1257010071、问题成因C语言与C++调用问题原因主要在于C编译器和C++编译器的不同。C是过程式语言,C编译器编译后,函数在符号库中就是函数名,没有其他任何附加信息。而C++是对象式语言,支持函数重载,C++编译器编译后,在符号......
  • Day10 数据类型扩展及面试题讲解
    publicclassDemo03{publicstaticvoidmain(String[]args){//整数扩展:进制二进制0b十进制八进制00十六进制0xinti=10;inti2=010;//八进制0inti3=0x10;//十六进制0x0~9A~F16System.out.println(i);......
  • 前端学习笔记202307学习笔记第六十七天-前端面试-this笔试题讲解1
     ......
  • 前端学习笔记202307学习笔记第六十七天-前端面试-this笔试题讲解2
     ......
  • Lodash _.zipObject()实例讲解
    Lodash_.zipObject()实例讲解时间:2022-04-07本文章向大家介绍Lodash_.zipObject()实例讲解,主要分析其语法、参数、返回值和注意事项,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。_.zipOnject()方法用于将两个数组组合为一个对象,一......
  • 基于微信小程序的酒店管理系统设计与实现(源码+lw+部署文档+讲解等)
    (文章目录)详细视频演示请联系我获取更详细的演示视频具体实现截图[外链图片转存中...(img-Lkna8qpn-1700727246356)]技术栈后端框架SpringBootSpringBoot内置了Tomcat、Jetty和Undertow等服务器,这意味着你可以直接使用它们而不需要额外的安装和配置。SpringBoot的一......
  • JVM 内存分析工具 MAT 的深度讲解与实践
     1.MAT工具简介MAT(全名:MemoryAnalyzerTool),是一款快速便捷且功能强大丰富的JVM堆内存离线分析工具。其通过展现JVM异常时所记录的运行时堆转储快照(Heapdump)状态(正常运行时也可以做堆转储分析),帮助定位内存泄漏问题或优化大内存消耗逻辑。1.1MAT使用场景及主要解决问......
  • MVCC机制讲解
    MVCC机制讲解https://juejin.cn/post/71702342880413286542023-11-0315:42:11欢迎关注MySQL专栏MySQL历险记强烈建议收藏本导航文【MySQL历险记】MySQL的核心特性汇总前言MySQL中大名鼎鼎的MVCC机制想必大家都有所耳闻吧,虽然在平时MySQL使用过程中基本上......
  • Docker Compose 和 dockerfile 的区别和联系
    目录DockerfileDockerCompose区别和联系DockerfileDockerfile是一个文本文件,其中包含一系列的指令,用于定义Docker镜像的构建过程。每个指令的作用都代表一个构建步骤,例如从基础镜像中安装软件、复制文件、设置环境变量等。构建过程:当你运行dockerbuild命令时,Docker会按照......