Dockerfile讲解

news/2024/7/4 7:48:04 标签: java, eureka, 开发语言, docker, dockerfile, 后端, 云原生

Dockerfile

  • 1. 构建过程解析
  • 2. Dockerfile常用保留字指令
  • 3. 案例
    • 3.1. 自定义镜像mycentosjava8
    • 3.2. 虚悬镜像
  • 4. Docker微服务实战

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 [“”,“”,“”,…]

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

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

3. 案例

java8_133">3.1. 自定义镜像mycentosjava8

centos7镜像具备vim+ifconfig+jdk8

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

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

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

Dockerfile文件中的D一定是大写

dockerfile">FROM centos:7
MAINTAINER zy<2351950143@qq.com>

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文件:

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


http://www.niftyadmin.cn/n/5220686.html

相关文章

打造企业AI数字人专属IP的重要性

在数字化时代&#xff0c;企业数字人专属IP的打造成为了企业品牌建设的重要组成部分。企业数字人专属IP是指是利用人工智能技术实现与真人直播形象的1:1克隆&#xff0c;即克隆出一个数字化的真人形象&#xff0c;作为独有的企业数字人形象&#xff0c;可以用于产品推广、品牌宣…

亚信科技AntDB数据库与库瀚存储方案完成兼容性互认证

近日&#xff0c;亚信科技AntDB数据库与苏州库瀚信息科技有限公司自主研发的RISC-V数据库存储解决方案进行了产品兼容测试。经过双方团队的严格测试&#xff0c;亚信科技AntDB数据库与库瀚数据库存储解决方案完全兼容、运行稳定。除高可用性测试外&#xff0c;双方进一步开展TP…

理解Android无埋点技术

首先什么是无埋点呢&#xff0c;其实所谓无埋点就是开发者无需再对追踪点进行埋码&#xff0c;而是脱离代码&#xff0c;只需面对应用界面圈圈点点即可追加随时生效的事件数据点。 无埋点的好处 其实无埋点并不是完全不用写代码&#xff0c;而是尽可能的少写代码。开发者将SDK集…

Selenium 学习(0.16)——软件测试之测试用例设计方法——白盒测试——逻辑覆盖法(语句覆盖和判定覆盖)

写在前面 今天回来有点晚&#xff0c;因为上午给小伙伴们开了个小会&#xff0c;随便说了些什么&#xff0c;结果小伙伴们下班就没急着走&#xff0c;弄点我还有点不好意思提前走了&#xff0c;就略留了一会。其实也没说什么&#xff0c;就是强调工作要抓点紧&#xff0c;8小时…

2024 年应该使用 Bun、Node.js 还是 Deno

2024 年应该使用 Bun、Node.js 还是 Deno 到 2024 年&#xff0c;构建基于 JavaScript 的现代 API 相对简单。我们可以使用Express.js等库并在几分钟内启动可用的 API。但是&#xff0c;现在最具挑战性的部分是选择正确的 JavaScript 引擎。 目前主流的三个运行时是&#xff…

【jupyter notebook中插件 nbextensions 安装失败分析与解决方法】

文章目录 问题描述分析与解决总结 问题描述 一开始在安装 notebook 中的插件 nbextensions 时根本没有注意到版本的适配问题&#xff0c;都是进行默认的安装&#xff0c;结果安装是最新版本的 notebook7.x&#xff0c;恰好 notebook7.x 版本不再适应插件 nbextensions&#xf…

Spark升级中对log4j中的一些思考

背景 最近在做Spark版本的升级(由spark3.1升级到spark3.5)&#xff0c;其实单纯从spark升级涉及到的log4j来说&#xff0c;并没有什么能够记录的&#xff0c; 但是由于公司内部做了Spark的serveless&#xff0c;把spring和spark混在了一起&#xff0c;所以导致了不可预见的问题…

强化学习中的“agent“

在强化学习中&#xff0c;"agent"&#xff08;智能体&#xff09;是指一个在环境中执行动作以达到某个目标的实体。强化学习是一种机器学习范式&#xff0c;其中智能体通过与环境的交互来学习最优的行为策略&#xff0c;以最大化累积的奖励信号。 以下是强化学习中 …