Dockerfile介绍

1. DockerFile介绍

dockerfile是用来构建docker镜像的文件!命令参数脚本!

构建步骤:

1、编写一个dockerfile文件

2、docker build 构建成为一个镜像

3、docker run运行镜像

4、docker push发布镜像(DockerHub、阿里云镜像仓库!)

2. DockerFile的命令

bash 复制代码
FROM		# 基础镜像,一切从这里开始构建
MAINTAINER	# 镜像是谁写的:姓名+邮箱
RUN			# 镜像构建的时候需要运行的命令
ADD			# 将当前目录下的所有内容复制到 /app 下 
WORKDIR		# 镜像的工作目录
VOLUME		# 挂载的目录
EXPOSE		# 暴露端口配置
CMD			# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT	# 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD		# 当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令。触发指令。
COPY		# 类似ADD,将我们文件拷贝到镜像中
ENV			# 构建的时候设置环境变量!

2.1实战构建一个jenkins的dockerfile

bash 复制代码
FROM centos:7.9.2009

WORKDIR /opt

ADD   jdk-11.0.19_linux-x64_bin.tar.gz  /opt

ENV  JAVA_HOME=/opt/jdk-11.0.19 

ENV PATH=$PATH:$JAVA_HOME/bin

ADD  jenkins.war  /opt

ENV  JENKINS_HOME=${HOME}/.jenkins

RUN  yum install -y fontconfig

CMD [ "java","-jar","jenkins.war" ]

构建镜像

bash 复制代码
root@server01 jenkins]# docker build -t jenkins:1.0 .

-t  给这个镜像加一个 Tag

通过命令查看列出本地进行的变更历史:docker history 镜像id

CMD和ENTRYPOINT区别

bash 复制代码
CMD			# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT	# 指定这个容器启动的时候要运行的命令,可以追加命令

一、dockerfile中的 CMD

1、每个dockerfile中只能有一个CMD如果有多个那么只执行最后一个。

2、CMD 相当于启动docker时候后面添加的参数看,举个简单例子:

docker run -itd --name test image(镜像) /bin/bash -c

a、镜像名称后面跟了一个/bin/bash -c ,其实等价于在dockerfile中的CMD ["/bin/bash","-c"]。

b、如果dockerfile中的CMD中有了CMD["/bin/bash","-c"],那么就不用在执行的时候再添加了,如果添加了参数的话那么就相当于要执行你添加的参数,默认的CMD中的参数就无效了。

二、dockerfile中的ENTRYPOINT

1、一个dockerfile中ENTRYPOINT也只能存在一个,若存在多个那么只执行最后一个,你可以理解为开机启动的意思,和CMD有点像,不过还是有区别。

2、举个简单例子:

a、dockerfile中有ENTRYPOINT ["tail","-f","/var/log/nginx/access.log"],那么启动的时候镜像就执行了这个里面的内容,如果你像上面带参数的话就相当于在这个执行的内容后面再加入参数。

案例:

如果我们的dockerfile中有a中的这句话然后我们启动我们的docker:

#docker run -itd --name test image(镜像名) /bin/bash -c

此时就相当于我们启动docker的时候执行了:tail -f /var/log/nginx/access.log /bin/bash -c

这个命令明显就不对.

3.Dockerfile优化

bash 复制代码
1、RUN 命令要尽量写在一条里,每次 RUN 命令都是在之前的镜像上封装,只会增大不会减小

2、每次进行依赖安装后,记得yum clean all【centos】 
#yum clean all 清除缓存中的rpm头文件和包文件

3、选择比较小的基础镜像。alpine
相关推荐
BUG?不,是彩蛋!3 小时前
Maven-Java 项目到底解决了什么痛点?
java·servlet·maven
CS Beginner4 天前
【搭建】个人博客网站的搭建
java·前端·学习·servlet·log4j·mybatis
一只小透明啊啊啊啊7 天前
Java Web 开发的核心组件:Servlet, JSP,Filter,Listener
java·前端·servlet
芙蓉王真的好17 天前
优化 Jenkins 构建脚本:避免 pnpm lockfile 相关报错的关键配置
spring·servlet·jenkins
要站在顶端7 天前
Jenkins Pipeline 多job依赖、触发多Job、并行执行及制品下载
运维·servlet·jenkins
Live&&learn11 天前
Tomcat 10和Tomcat 9引入servlet的不同
java·servlet·tomcat
songx_9912 天前
idea建有servlet类的web项目
java·servlet·intellij-idea
chilavert31813 天前
技术演进中的开发沉思-146 java-servlet:Servlet 在云原生时代的适配”
服务器·servlet·云原生
JH307314 天前
解锁Servlet核心:深入剖析HttpServletRequest与HttpServletResponse
servlet
vx Biye_Design14 天前
servlet宠物医院管理系统-计算机毕业设计源码77418
java·vue.js·spring·servlet·eclipse·mybatis